From ba3efa82e36b1bb80f4cb7e7cdf14e31ed82eef4 Mon Sep 17 00:00:00 2001 From: Emil <65846814+emil28092005@users.noreply.github.com> Date: Wed, 23 Sep 2026 23:28:45 +0300 Subject: [PATCH] Record P2 Linux and exported Player validation evidence --- .../p2-gpu-visibility-2026-09-23/README.md | 34 + .../capture-comparison.json | 138 + .../collect-2d-direct-6.png | Bin 0 -> 3955 bytes .../collect-2d-gpu-frustum-profile.json | 198 ++ .../collect-2d-gpu-frustum.png | Bin 0 -> 3955 bytes .../collect-2d-gpu-occlusion-profile.json | 198 ++ .../collect-2d-gpu-occlusion.png | Bin 0 -> 3955 bytes .../collect-2d-manifest.json | 195 ++ .../collect-2d-profile.json | 2478 +++++++++++++++++ .../collect-2d-run.json | 18 + .../collect-2d-validate.json | 12 + .../collect-3d-direct-6.png | Bin 0 -> 19538 bytes .../collect-3d-gpu-frustum-profile.json | 198 ++ .../collect-3d-gpu-frustum.png | Bin 0 -> 19566 bytes .../collect-3d-gpu-occlusion-profile.json | 198 ++ .../collect-3d-gpu-occlusion.png | Bin 0 -> 19566 bytes .../collect-3d-import.json | 18 + .../collect-3d-manifest.json | 222 ++ .../collect-3d-profile.json | 2478 +++++++++++++++++ .../collect-3d-run.json | 18 + .../collect-3d-validate.json | 12 + .../ctest-lavapipe-p2.txt | 39 + .../ctest-linux-debug.txt | 127 + .../ctest-linux-release.txt | 127 + .../p2-exported-gpu-visibility.json | 97 + .../p2-gpu-visibility-2026-09-23/report.json | 435 +++ .../shader-validation.txt | 10 + 27 files changed, 7250 insertions(+) create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/README.md create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/capture-comparison.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-direct-6.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-gpu-frustum-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-gpu-frustum.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-gpu-occlusion-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-gpu-occlusion.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-manifest.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-run.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-validate.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-direct-6.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-frustum-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-frustum.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion.png create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-import.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-manifest.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-profile.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-run.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-validate.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/ctest-lavapipe-p2.txt create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-debug.txt create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-release.txt create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/p2-exported-gpu-visibility.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/report.json create mode 100644 docs/validation/p2-gpu-visibility-2026-09-23/shader-validation.txt diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/README.md b/docs/validation/p2-gpu-visibility-2026-09-23/README.md new file mode 100644 index 0000000..4a479fd --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/README.md @@ -0,0 +1,34 @@ +# P2 GPU visibility: Linux validation, 2026-09-23 + +The P2 implementation adds selectable GPU frustum and two-pass HZB occlusion for opaque static meshes, prepared mesh LODs, renderer and Editor diagnostics, and a standalone Player option. Direct rendering remains the default and comparison path. The code built and tested here is at `9990234` (following `3be3d0d` for device-local GPU outputs); the later working-tree changes while gathering this record were documentation only. + +## Builds and functional tests + +| Environment | Check | Result | +| --- | --- | --- | +| Ubuntu Linux, Clang 21, Debug, RTX 2080 Ti | `cmake --build --preset linux-debug -j6`; `ctest --test-dir build/linux-debug --output-on-failure -j6` | Build passed; 57/57 tests passed, including 15 P2 cases. `render_window_lifecycle` reported its pre-existing compositor skip. | +| Ubuntu Linux, Clang 21, Release, RTX 2080 Ti | `cmake --build build/p2-release -j6`; `ctest --test-dir build/p2-release --output-on-failure -j6` | Build passed; 57/57 tests passed, with the same window skip. | +| Linux lavapipe software Vulkan | `VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.json ctest --test-dir build/p2-release -L p2 --output-on-failure -j2` | 15/15 P2 cases passed; the frustum and occlusion examples each reported an active GPU path, both prepared LOD levels, and zero Vulkan validation errors. | +| Release shader bundle | `spirv-val --target-env vulkan1.3` on all nine generated `.spv` files | All passed. | + +The 15 P2 cases include empty and dense scenes, fixed-bin capacity, camera cut, resize, near-plane handling, multiple views, projection change, teleports, shadow and transparent passes, LOD selection and an open sequence. This is functional coverage, not a performance claim. + +The complete [Debug CTest log](ctest-linux-debug.txt), [Release CTest log](ctest-linux-release.txt) and [lavapipe P2 log](ctest-lavapipe-p2.txt) retain every test name and the explicit window skip. The [shader validation record](shader-validation.txt) lists hashes and `spirv-val` results for the Release bundle. + +## Independent exported Player checks + +The [export report](report.json) records a Release export through the real Editor for both checked-in playable projects. Their packages were copied outside the SDK into a Unicode path, source project directories were hidden, and each package passed CPU validation plus 120 headless frames on the RTX 2080 Ti with Khronos validation active and zero errors. The 3D export includes the imported Blender asset. Package file hashes are retained in the [2D manifest](collect-2d-manifest.json) and [3D manifest](collect-3d-manifest.json). The [2D](collect-2d-profile.json) and [3D](collect-3d-profile.json) 120-frame profiles preserve device and frame counters. + +Each relocated Player was then launched for six frames in **both** `--visibility gpu-frustum` and `--visibility gpu-occlusion`. All four [GPU-mode runs](p2-exported-gpu-visibility.json) completed with `gpu_visibility_active=true` in every profile sample and zero Vulkan validation errors. The raw profiles are [2D frustum](collect-2d-gpu-frustum-profile.json), [2D occlusion](collect-2d-gpu-occlusion-profile.json), [3D frustum](collect-3d-gpu-frustum-profile.json) and [3D occlusion](collect-3d-gpu-occlusion-profile.json). The Player also validated both shader bundles with `--validate --visibility MODE` before rendering. + +The [capture comparison](capture-comparison.json) uses the same six-frame static camera for Direct and GPU modes. The 2D captures match pixel-for-pixel. In 3D, GPU frustum and GPU occlusion match pixel-for-pixel; each differs from Direct at only 7 of 921,600 pixels (maximum RGB channel delta 41), all at rasterized geometry edges. The result is deterministic across repeated runs and frame counts. A diagnostic with just the floor mesh and camera retains three edge pixels, isolating the difference from gameplay timing, occlusion decisions and draw ordering. Direct pretransforms vertices on the CPU in `renderer.cpp`; GPU modes transform them in `gpu_scene.slang`. Their floating-point rounding can change triangle coverage at subpixel boundaries. This is a bounded visual difference on this device, not evidence of lost geometry, and exact pixel counts should not be expected across GPU drivers. + +![3D Direct capture after six frames](collect-3d-direct-6.png) + +![3D GPU occlusion capture after six frames](collect-3d-gpu-occlusion.png) + +## Performance evidence and limits + +The [first benchmark](../../studies/20-p2-gpu-visibility-benchmark-2026-09-23.md) exposed a slow GPU `MainCull` pass. The [optimization study](../../studies/21-p2-gpu-visibility-optimization-2026-09-23.md) keeps raw samples from baseline, device-local-only and device-local-plus-atomic variants and explains the measured improvement. Those are synthetic Debug/validation workloads on one RTX 2080 Ti, not Player frame rates or a promise that GPU culling wins in every scene. Open scenes pay extra HZB work. Direct remains the default until broader Release/game-content profiling supports another choice. + +This record does not establish physical Windows GPU performance, other hardware/driver combinations, native Wayland restore, or automatic LOD mesh generation. The lavapipe run broadens functional driver coverage but is not a hardware speed measurement. Native Windows CI and later GPU families require their own evidence. diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/capture-comparison.json b/docs/validation/p2-gpu-visibility-2026-09-23/capture-comparison.json new file mode 100644 index 0000000..109d42f --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/capture-comparison.json @@ -0,0 +1,138 @@ +{ + "collect-2d": { + "direct_vs_gpu_frustum": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 0, + "total_pixels": 921600, + "max_channel_delta": 0, + "coordinates_and_max_channel_delta": [] + }, + "direct_vs_gpu_occlusion": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 0, + "total_pixels": 921600, + "max_channel_delta": 0, + "coordinates_and_max_channel_delta": [] + }, + "gpu_frustum_vs_gpu_occlusion": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 0, + "total_pixels": 921600, + "max_channel_delta": 0, + "coordinates_and_max_channel_delta": [] + } + }, + "collect-3d": { + "direct_vs_gpu_frustum": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 7, + "total_pixels": 921600, + "max_channel_delta": 41, + "coordinates_and_max_channel_delta": [ + [ + 939, + 361, + 41 + ], + [ + 647, + 366, + 11 + ], + [ + 468, + 465, + 6 + ], + [ + 588, + 517, + 6 + ], + [ + 700, + 566, + 6 + ], + [ + 827, + 624, + 11 + ], + [ + 848, + 627, + 15 + ] + ] + }, + "direct_vs_gpu_occlusion": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 7, + "total_pixels": 921600, + "max_channel_delta": 41, + "coordinates_and_max_channel_delta": [ + [ + 939, + 361, + 41 + ], + [ + 647, + 366, + 11 + ], + [ + 468, + 465, + 6 + ], + [ + 588, + 517, + 6 + ], + [ + 700, + 566, + 6 + ], + [ + 827, + 624, + 11 + ], + [ + 848, + 627, + 15 + ] + ] + }, + "gpu_frustum_vs_gpu_occlusion": { + "size": [ + 1280, + 720 + ], + "changed_pixels": 0, + "total_pixels": 921600, + "max_channel_delta": 0, + "coordinates_and_max_channel_delta": [] + } + } +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-direct-6.png b/docs/validation/p2-gpu-visibility-2026-09-23/collect-2d-direct-6.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cd9d646d6a5828deb3427ea7912dfde4127073 GIT binary patch literal 3955 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≪+1O$kk0 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 BkT?JU literal 0 HcmV?d00001 diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion-profile.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion-profile.json new file mode 100644 index 0000000..5d59cea --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion-profile.json @@ -0,0 +1,198 @@ +{ + "completed_frames": 6, + "device": "NVIDIA GeForce RTX 2080 Ti", + "dimension": 3, + "fixed_delta_seconds": 0.016666666666666666, + "format": "faset.player-profile", + "height": 720, + "percentile_method": "nearest_rank_all_completed_frames_no_warmup_exclusion", + "presentation_mode": "offscreen", + "requested_frames": 6, + "resource_notes": "gpu_allocated_bytes sums live Vulkan memory allocations, including alignment, excluding driver internals. texture_count includes the white fallback texture.", + "samples": [ + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 1, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.771968, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 11.369366, + "renderer_cpu_ms": 11.362463, + "renderer_readback_cpu_ms": 3.603508, + "simulation_ms": 0.338388, + "snapshot_ms": 0.880631, + "texture_count": 1, + "tick": 1, + "vertices": 720, + "wall_ms": 12.728099 + }, + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 2, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.724864, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.184266, + "renderer_cpu_ms": 3.170179, + "renderer_readback_cpu_ms": 0.641099, + "simulation_ms": 0.223501, + "snapshot_ms": 0.269128, + "texture_count": 1, + "tick": 2, + "vertices": 720, + "wall_ms": 3.687185 + }, + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 3, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.721568, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.179287, + "renderer_cpu_ms": 3.170631, + "renderer_readback_cpu_ms": 0.509361, + "simulation_ms": 0.307731, + "snapshot_ms": 0.283124, + "texture_count": 1, + "tick": 3, + "vertices": 720, + "wall_ms": 3.785811 + }, + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 4, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.722336, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 5.69337, + "renderer_cpu_ms": 5.685525, + "renderer_readback_cpu_ms": 0.436172, + "simulation_ms": 0.289446, + "snapshot_ms": 0.252797, + "texture_count": 1, + "tick": 4, + "vertices": 720, + "wall_ms": 6.245241 + }, + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 5, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.73584, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 5.95359, + "renderer_cpu_ms": 5.941097, + "renderer_readback_cpu_ms": 0.531442, + "simulation_ms": 0.274438, + "snapshot_ms": 0.223482, + "texture_count": 1, + "tick": 5, + "vertices": 720, + "wall_ms": 6.460516 + }, + { + "draw_calls": 24, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 6, + "gpu_allocated_bytes": 38171888, + "gpu_ms": 0.72576, + "gpu_visibility_active": true, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 5.297592, + "renderer_cpu_ms": 5.082367, + "renderer_readback_cpu_ms": 0.648092, + "simulation_ms": 0.275159, + "snapshot_ms": 0.235665, + "texture_count": 1, + "tick": 6, + "vertices": 720, + "wall_ms": 5.82136 + } + ], + "simulation_mode": "synthetic_fixed_timestep", + "startup_ms": { + "main_to_first_frame": 367.40061, + "renderer_initialization": 351.144686, + "scene_read": 0.607135, + "world_initialization": 0.946856 + }, + "summary_ms": { + "gpu": { + "max": 0.771968, + "min": 0.721568, + "p50": 0.724864, + "p95": 0.771968, + "samples": 6 + }, + "render_call": { + "max": 11.369366, + "min": 3.179287, + "p50": 5.297592, + "p95": 11.369366, + "samples": 6 + }, + "renderer_cpu": { + "max": 11.362463, + "min": 3.170179, + "p50": 5.082367, + "p95": 11.362463, + "samples": 6 + }, + "renderer_readback_cpu": { + "max": 3.603508, + "min": 0.436172, + "p50": 0.531442, + "p95": 3.603508, + "samples": 6 + }, + "simulation": { + "max": 0.338388, + "min": 0.223501, + "p50": 0.275159, + "p95": 0.338388, + "samples": 6 + }, + "snapshot": { + "max": 0.880631, + "min": 0.223482, + "p50": 0.252797, + "p95": 0.880631, + "samples": 6 + }, + "wall": { + "max": 12.728099, + "min": 3.687185, + "p50": 5.82136, + "p95": 12.728099, + "samples": 6 + } + }, + "timing_notes": "Durations use steady_clock wall time, not thread CPU usage. render_call/renderer_cpu include GPU waits, readback and window presentation. renderer_readback_cpu measures map/copy/unmap wall time within that call. GPU timestamps cover submitted rendering, not CPU work. A missing/zero GPU timestamp is null. Frame durations exclude profile bookkeeping and final capture/profile file writes. Startup begins at Player application entry after platform argument normalization, excluding OS loader/launcher.", + "validation_enabled": true, + "validation_errors": 0, + "version": 1, + "visibility_mode": "gpu-occlusion", + "width": 1280 +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion.png b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-gpu-occlusion.png new file mode 100644 index 0000000000000000000000000000000000000000..7701a621aa65de3e95cae900e093874c3ea15dc0 GIT binary patch literal 19566 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 BkT?JU literal 0 HcmV?d00001 diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-import.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-import.json new file mode 100644 index 0000000..25b15f6 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-import.json @@ -0,0 +1,18 @@ +{ + "arguments": [ + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/build/p2-release/faset_editor", + "--engine", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2", + "--project", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/Faset Café 世界/collect-3d", + "--command", + "{\"name\": \"faset_import\", \"arguments\": {\"path\": \"Assets/exit-arch/manifest.json\"}}", + "--wait" + ], + "cwd": "/home/emil/Desktop/.worktrees/Faset_Engine-p2", + "seconds": 0.03160038799978793, + "exit_code": 0, + "timed_out": false, + "stdout": "{\n \"error\": \"\",\n \"id\": \"import-816d050c-4c54-482b-a60e-997cfd3863f5\",\n \"kind\": \"import\",\n \"progress\": 1.0,\n \"request\": {\n \"allow_removed_outputs\": false,\n \"path\": \"Assets/exit-arch/manifest.json\",\n \"settings\": null\n },\n \"result\": {\n \"asset_id\": \"5832763b-3ed0-44d6-9088-0b524f196a91\",\n \"cache_hit\": false,\n \"diagnostics\": [],\n \"generation\": \"4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2\",\n \"manifest\": {\n \"asset_id\": \"5832763b-3ed0-44d6-9088-0b524f196a91\",\n \"files\": [\n {\n \"path\": \"meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh\",\n \"sha256\": \"98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97\",\n \"size\": 928\n },\n {\n \"path\": \"meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh\",\n \"sha256\": \"98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97\",\n \"size\": 928\n },\n {\n \"path\": \"meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh\",\n \"sha256\": \"3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071\",\n \"size\": 928\n }\n ],\n \"generation\": \"4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2\",\n \"importer\": \"faset-gltf-1/cgltf-1.15\",\n \"input_key\": {\n \"bundle_sha256\": \"7a13347adc89761fb02ebeab3c58ba87f319cd62f53ec87a3bb61bcd066ffa55\",\n \"dependencies\": {},\n \"importer\": \"faset-gltf-1/cgltf-1.15\",\n \"settings\": {},\n \"source\": \"ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3\",\n \"target_profile\": \"desktop-static-pbr-v1\",\n \"toolchain\": {\n \"cgltf\": \"360db1a95480fe102ae9c69b27c5d101167ff5ba\",\n \"stb\": \"2c980bb59875b0d32144a71867fbdebb2f77cd20\"\n }\n },\n \"kind\": \"scene\",\n \"materials\": [\n {\n \"alpha_cutoff\": 0.5,\n \"alpha_mode\": \"OPAQUE\",\n \"base_color\": [\n 0.2199999988079071,\n 0.28999999165534973,\n 0.3400000035762787,\n 1.0\n ],\n \"base_color_texture\": -1,\n \"double_sided\": true,\n \"emissive\": [\n 0.0,\n 0.0,\n 0.0\n ],\n \"emissive_texture\": -1,\n \"format\": \"faset.material\",\n \"id\": \"material-bb63b094febbf90bb7049c9bcf7587bc\",\n \"metallic\": 0.07999999821186066,\n \"metallic_roughness_texture\": -1,\n \"name\": \"Weathered stone\",\n \"normal_texture\": -1,\n \"occlusion_texture\": -1,\n \"roughness\": 0.800000011920929,\n \"unlit\": false,\n \"version\": 1\n }\n ],\n \"meshes\": [\n {\n \"id\": \"mesh-fc069a07a87e0f831fd92efdbc4efa1f\",\n \"name\": \"Cube.001\",\n \"primitives\": [\n {\n \"material\": 0,\n \"path\": \"meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh\"\n }\n ]\n },\n {\n \"id\": \"mesh-0961e2a3f92977836a3aa80cab09277e\",\n \"name\": \"Cube.002\",\n \"primitives\": [\n {\n \"material\": 0,\n \"path\": \"meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh\"\n }\n ]\n },\n {\n \"id\": \"mesh-93b5b3e52cb6bb120fefb80e2d8e222b\",\n \"name\": \"Cube.003\",\n \"primitives\": [\n {\n \"material\": 0,\n \"path\": \"meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh\"\n }\n ]\n }\n ],\n \"nodes\": [\n {\n \"id\": \"node-cec6e8cea80cf5a98ba3263a0156bee4\",\n \"local_transform\": [\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 1.4500000476837158,\n 1.2999999523162842,\n 1.0\n ],\n \"mesh\": 0,\n \"name\": \"Left post\",\n \"parent_id\": \"\",\n \"stable_source_id\": true\n },\n {\n \"id\": \"node-5f8a90a6c4d27020d20bd4fa81d1d958\",\n \"local_transform\": [\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 1.4500000476837158,\n -1.2999999523162842,\n 1.0\n ],\n \"mesh\": 1,\n \"name\": \"Right post\",\n \"parent_id\": \"\",\n \"stable_source_id\": true\n },\n {\n \"id\": \"node-482463e486a8d1fd741340c653cd128f\",\n \"local_transform\": [\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 0.0,\n 0.0,\n 1.0,\n 0.0,\n 0.0,\n 3.0,\n 0.0,\n 1.0\n ],\n \"mesh\": 2,\n \"name\": \"Lintel\",\n \"parent_id\": \"\",\n \"stable_source_id\": true\n }\n ],\n \"outputs\": [\n \"node-cec6e8cea80cf5a98ba3263a0156bee4\",\n \"node-5f8a90a6c4d27020d20bd4fa81d1d958\",\n \"node-482463e486a8d1fd741340c653cd128f\",\n \"mesh-fc069a07a87e0f831fd92efdbc4efa1f\",\n \"mesh-0961e2a3f92977836a3aa80cab09277e\",\n \"mesh-93b5b3e52cb6bb120fefb80e2d8e222b\",\n \"material-bb63b094febbf90bb7049c9bcf7587bc\"\n ],\n \"payload_source\": \"/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/Faset Café 世界/collect-3d/Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb\",\n \"schema_version\": 1,\n \"settings\": {},\n \"source\": \"/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/Faset Café 世界/collect-3d/Assets/exit-arch/manifest.json\",\n \"source_sha256\": \"ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3\",\n \"textures\": []\n },\n \"previous_generation\": \"\",\n \"removed_output_ids\": []\n },\n \"stage\": \"complete\",\n \"state\": \"succeeded\"\n}\n", + "stderr": "" +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-manifest.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-manifest.json new file mode 100644 index 0000000..5d52e75 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-manifest.json @@ -0,0 +1,222 @@ +{ + "asset_generations": { + "5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2" + }, + "build_fingerprint": "337f590d99812f1509c9373117bda21a3ff7eb3e192f60a3752828d813e74b25", + "configuration": "Release", + "executable": "faset_player", + "files": [ + { + "path": "scene.fscene", + "sha256": "21c364140669ec82c6886102667b255df5ccdf0ec77e0ca64060f84dd7b86632", + "size": 8639 + }, + { + "path": "faset_player", + "sha256": "716d250a863ccc9fc13304a1f7775b9c820c186d5b0a21e6c9a88bd98798abbf", + "size": 5977808 + }, + { + "path": "shaders/vertexMain.spv", + "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898", + "size": 1224 + }, + { + "path": "shaders/fragmentMain.spv", + "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505", + "size": 7436 + }, + { + "path": "shaders/shadowMain.spv", + "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8", + "size": 784 + }, + { + "path": "shaders/vertexMain.reflection.json", + "sha256": "c584f3b957ebf194a292451362a98590f85ff3cfbfd8f917b1c1265039381777", + "size": 2639 + }, + { + "path": "shaders/fragmentMain.reflection.json", + "sha256": "72ebf8d32452830650416dc4717d89a4324e97ece7028dfb97c66803c8dce71f", + "size": 2649 + }, + { + "path": "shaders/shadowMain.reflection.json", + "sha256": "e3fd0889cd2f569d410f5d7558a4091d9f57f247a1dcf1788462f67525340819", + "size": 2645 + }, + { + "path": "shaders/gpuVertexMain.spv", + "sha256": "041c1e5f0db4007c51e01ed5db6e0fbf4db09b8dcbcb085c0c73612cdc682fe3", + "size": 5008 + }, + { + "path": "shaders/gpuShadowMain.spv", + "sha256": "9078577943bf9c51220d5341434834eb4a28cf0f0f6203bad2b96e1b0e11b360", + "size": 2484 + }, + { + "path": "shaders/gpuCullMain.spv", + "sha256": "7691360ec55f41d40d43652f506b051cef8b3a3ddcdcc7db61a7d4d97f9e87d8", + "size": 16180 + }, + { + "path": "shaders/gpuHzbMain.spv", + "sha256": "08682362ee2120ed19d260e613285071747c3e436bb09bb6238e46f9cedc2308", + "size": 4140 + }, + { + "path": "shaders/gpuPostCullMain.spv", + "sha256": "62cb72e356346e1511c6d640a3cecb4a6e5283795338299b357edae5f7f52be4", + "size": 12460 + }, + { + "path": "shaders/gpuVertexMain.reflection.json", + "sha256": "3726c09d38e68cf0b6e317daaddb7b5b3e1bb0b073afd0eff43b8f1125378cd9", + "size": 3092 + }, + { + "path": "shaders/gpuShadowMain.reflection.json", + "sha256": "7fbe869421b61f0261729eac26ebda2a484d423583d3a5b739ba59bbf3afbe12", + "size": 2749 + }, + { + "path": "shaders/gpuCullMain.reflection.json", + "sha256": "996fe5c7e31c6b8f316d8f290b3be0ae7063eb46c500a661e8715e9b822a2598", + "size": 3587 + }, + { + "path": "shaders/gpuHzbMain.reflection.json", + "sha256": "589818f670881c64f3aba726ee3bc82fe4b9d835a347f99134e0e157dc4a112e", + "size": 2050 + }, + { + "path": "shaders/gpuPostCullMain.reflection.json", + "sha256": "eed140bbe09c7d14935b688c770261ac0e81677c0974aa811c88ed67ea779b95", + "size": 3591 + }, + { + "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh", + "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97", + "size": 928 + }, + { + "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh", + "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97", + "size": 928 + }, + { + "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh", + "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071", + "size": 928 + }, + { + "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/manifest.json", + "sha256": "ee3f68794c6dc44ab492b1ba4640aa74e4de79a5ec10aed8dcdd45a03afc508e", + "size": 4532 + }, + { + "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/current.json", + "sha256": "b0732959808ce61ef5a3223fba2d9ad8c17a3ea7873d4a81c00aadee6c51032e", + "size": 134 + }, + { + "path": "Notices/sdl3/LICENSE.txt", + "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127", + "size": 884 + }, + { + "path": "Notices/entt/LICENSE", + "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99", + "size": 1097 + }, + { + "path": "Notices/box2d/LICENSE", + "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2", + "size": 1067 + }, + { + "path": "Notices/box3d/LICENSE", + "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90", + "size": 1067 + }, + { + "path": "Notices/json/LICENSE.MIT", + "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603", + "size": 1076 + }, + { + "path": "Notices/stb/LICENSE", + "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63", + "size": 2510 + }, + { + "path": "Notices/dependencies.json", + "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc", + "size": 2206 + }, + { + "path": "Notices/Faset-NOTICE.txt", + "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f", + "size": 204 + }, + { + "path": "README.txt", + "sha256": "82bf72bc542643f6c4090e0a5de69b0014ca3fa17c6f9dfb12cc41e44c8b8db6", + "size": 262 + } + ], + "format": "faset.export", + "generation": "013fe953-8787-45ac-963f-ffbd9ac5f636", + "lua_enabled": false, + "lua_fingerprint": "", + "platform": "linux", + "prerequisites": [ + "Linux x86_64", + "Vulkan 1.3 driver", + "Compatible glibc and libstdc++ runtime" + ], + "renderer_profile": { + "api": "Vulkan 1.3", + "materials": [ + "base-color factor and texture", + "metallic and roughness factors" + ], + "required_features": [ + "dynamicRendering", + "synchronization2" + ], + "shadow_map": { + "resolution": 1024, + "world_extent": 40 + }, + "texture_sampling": "linear clamp, one mip level", + "unsupported_material_features": [ + "normal maps", + "metallic-roughness maps", + "emissive and occlusion maps", + "alpha mode selection", + "unlit mode", + "per-material face culling" + ] + }, + "scene_hash": "ee12794145c14ba5b599c5d9ae21648cccdfa91c47ee7742549f60d5fe7bc3e0", + "simulation": { + "fixed_delta": 0.016666666666666666, + "gravity": [ + 0, + -9.81, + 0 + ], + "max_catch_up_ticks": 4, + "physics_substeps": 4 + }, + "units": { + "angle": "radian", + "coordinates": "right-handed Y-up", + "distance": "metre" + }, + "validation_log": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n{\"dimension\":3,\"validated\":true}\n", + "version": 1 +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-profile.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-profile.json new file mode 100644 index 0000000..999108c --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-profile.json @@ -0,0 +1,2478 @@ +{ + "completed_frames": 120, + "device": "NVIDIA GeForce RTX 2080 Ti", + "dimension": 3, + "fixed_delta_seconds": 0.016666666666666666, + "format": "faset.player-profile", + "height": 720, + "percentile_method": "nearest_rank_all_completed_frames_no_warmup_exclusion", + "presentation_mode": "offscreen", + "requested_frames": 120, + "resource_notes": "gpu_allocated_bytes sums live Vulkan memory allocations, including alignment, excluding driver internals. texture_count includes the white fallback texture.", + "samples": [ + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 1, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.583552, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 9.67501, + "renderer_cpu_ms": 9.668939, + "renderer_readback_cpu_ms": 3.413839, + "simulation_ms": 0.434179, + "snapshot_ms": 1.61648, + "texture_count": 1, + "tick": 1, + "vertices": 576, + "wall_ms": 12.017098 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 2, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572288, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.226811, + "renderer_cpu_ms": 2.220418, + "renderer_readback_cpu_ms": 0.588119, + "simulation_ms": 0.27065, + "snapshot_ms": 0.278977, + "texture_count": 1, + "tick": 2, + "vertices": 576, + "wall_ms": 2.785995 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 3, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57312, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.521396, + "renderer_cpu_ms": 2.512039, + "renderer_readback_cpu_ms": 0.851637, + "simulation_ms": 0.37113, + "snapshot_ms": 0.253478, + "texture_count": 1, + "tick": 3, + "vertices": 576, + "wall_ms": 3.157166 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 4, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573504, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.658154, + "renderer_cpu_ms": 2.647995, + "renderer_readback_cpu_ms": 0.782336, + "simulation_ms": 0.32881, + "snapshot_ms": 1.118851, + "texture_count": 1, + "tick": 4, + "vertices": 576, + "wall_ms": 4.120372 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 5, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.580032, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.733677, + "renderer_cpu_ms": 2.726733, + "renderer_readback_cpu_ms": 0.940634, + "simulation_ms": 0.322348, + "snapshot_ms": 0.248449, + "texture_count": 1, + "tick": 5, + "vertices": 576, + "wall_ms": 3.317308 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 6, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572064, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.979316, + "renderer_cpu_ms": 3.972153, + "renderer_readback_cpu_ms": 2.172328, + "simulation_ms": 0.301709, + "snapshot_ms": 0.236997, + "texture_count": 1, + "tick": 6, + "vertices": 576, + "wall_ms": 4.530165 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 7, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.577376, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 6.113732, + "renderer_cpu_ms": 6.107551, + "renderer_readback_cpu_ms": 0.570476, + "simulation_ms": 0.319232, + "snapshot_ms": 0.993104, + "texture_count": 1, + "tick": 7, + "vertices": 576, + "wall_ms": 7.438571 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 8, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.578688, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.685887, + "renderer_cpu_ms": 7.677783, + "renderer_readback_cpu_ms": 4.2832, + "simulation_ms": 0.276472, + "snapshot_ms": 0.238249, + "texture_count": 1, + "tick": 8, + "vertices": 576, + "wall_ms": 8.210657 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 9, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573792, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.607148, + "renderer_cpu_ms": 2.598582, + "renderer_readback_cpu_ms": 0.923902, + "simulation_ms": 0.298052, + "snapshot_ms": 0.309293, + "texture_count": 1, + "tick": 9, + "vertices": 576, + "wall_ms": 3.227549 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 10, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57392, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.535092, + "renderer_cpu_ms": 2.524442, + "renderer_readback_cpu_ms": 0.716121, + "simulation_ms": 0.392781, + "snapshot_ms": 0.250973, + "texture_count": 1, + "tick": 10, + "vertices": 576, + "wall_ms": 3.193685 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 11, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.079244, + "renderer_cpu_ms": 7.071639, + "renderer_readback_cpu_ms": 0.563282, + "simulation_ms": 0.289596, + "snapshot_ms": 0.274057, + "texture_count": 1, + "tick": 11, + "vertices": 576, + "wall_ms": 7.657604 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 12, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572992, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.88376, + "renderer_cpu_ms": 2.876295, + "renderer_readback_cpu_ms": 0.965602, + "simulation_ms": 0.235404, + "snapshot_ms": 0.195639, + "texture_count": 1, + "tick": 12, + "vertices": 576, + "wall_ms": 3.327497 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 13, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.581056, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 6.248336, + "renderer_cpu_ms": 6.240572, + "renderer_readback_cpu_ms": 0.65234, + "simulation_ms": 1.883623, + "snapshot_ms": 0.281872, + "texture_count": 1, + "tick": 13, + "vertices": 576, + "wall_ms": 8.426726 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 14, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.588096, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.403584, + "renderer_cpu_ms": 2.396561, + "renderer_readback_cpu_ms": 0.698076, + "simulation_ms": 0.312089, + "snapshot_ms": 0.272414, + "texture_count": 1, + "tick": 14, + "vertices": 576, + "wall_ms": 2.999708 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 15, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572576, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.612829, + "renderer_cpu_ms": 2.601788, + "renderer_readback_cpu_ms": 0.553053, + "simulation_ms": 0.322668, + "snapshot_ms": 0.263006, + "texture_count": 1, + "tick": 15, + "vertices": 576, + "wall_ms": 3.211678 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 16, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57312, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.224646, + "renderer_cpu_ms": 2.216812, + "renderer_readback_cpu_ms": 0.600022, + "simulation_ms": 0.209926, + "snapshot_ms": 0.178897, + "texture_count": 1, + "tick": 16, + "vertices": 576, + "wall_ms": 2.625442 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 17, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573344, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.252439, + "renderer_cpu_ms": 2.246417, + "renderer_readback_cpu_ms": 0.605322, + "simulation_ms": 0.337417, + "snapshot_ms": 0.187985, + "texture_count": 1, + "tick": 17, + "vertices": 576, + "wall_ms": 2.788791 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 18, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571936, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.12587, + "renderer_cpu_ms": 2.119187, + "renderer_readback_cpu_ms": 0.636241, + "simulation_ms": 0.22255, + "snapshot_ms": 0.204896, + "texture_count": 1, + "tick": 18, + "vertices": 576, + "wall_ms": 2.565178 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 19, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572704, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.328573, + "renderer_cpu_ms": 2.321699, + "renderer_readback_cpu_ms": 0.518828, + "simulation_ms": 0.284617, + "snapshot_ms": 0.264309, + "texture_count": 1, + "tick": 19, + "vertices": 576, + "wall_ms": 2.887367 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 20, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.5712, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.872539, + "renderer_cpu_ms": 2.864473, + "renderer_readback_cpu_ms": 0.682918, + "simulation_ms": 0.345392, + "snapshot_ms": 0.289907, + "texture_count": 1, + "tick": 20, + "vertices": 576, + "wall_ms": 3.520722 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 21, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.586432, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.240813, + "renderer_cpu_ms": 3.231856, + "renderer_readback_cpu_ms": 0.785341, + "simulation_ms": 0.345021, + "snapshot_ms": 0.19081, + "texture_count": 1, + "tick": 21, + "vertices": 576, + "wall_ms": 3.788676 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 22, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571744, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.536124, + "renderer_cpu_ms": 2.52855, + "renderer_readback_cpu_ms": 0.90675, + "simulation_ms": 0.311548, + "snapshot_ms": 0.290938, + "texture_count": 1, + "tick": 22, + "vertices": 576, + "wall_ms": 3.151795 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 23, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571328, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.778952, + "renderer_cpu_ms": 2.77263, + "renderer_readback_cpu_ms": 0.691183, + "simulation_ms": 0.266473, + "snapshot_ms": 0.267965, + "texture_count": 1, + "tick": 23, + "vertices": 576, + "wall_ms": 3.325503 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 24, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57376, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.906418, + "renderer_cpu_ms": 3.897572, + "renderer_readback_cpu_ms": 0.741568, + "simulation_ms": 0.229823, + "snapshot_ms": 0.263457, + "texture_count": 1, + "tick": 24, + "vertices": 576, + "wall_ms": 4.413615 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 25, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.593664, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.89304, + "renderer_cpu_ms": 4.884614, + "renderer_readback_cpu_ms": 0.661919, + "simulation_ms": 0.32868, + "snapshot_ms": 0.272274, + "texture_count": 1, + "tick": 25, + "vertices": 576, + "wall_ms": 5.507089 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 26, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576768, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.002627, + "renderer_cpu_ms": 1.996827, + "renderer_readback_cpu_ms": 0.529869, + "simulation_ms": 0.272124, + "snapshot_ms": 0.20696, + "texture_count": 1, + "tick": 26, + "vertices": 576, + "wall_ms": 2.495877 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 27, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.599488, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.151448, + "renderer_cpu_ms": 2.145167, + "renderer_readback_cpu_ms": 0.541211, + "simulation_ms": 0.310015, + "snapshot_ms": 0.262726, + "texture_count": 1, + "tick": 27, + "vertices": 576, + "wall_ms": 2.735961 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 28, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576096, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.521126, + "renderer_cpu_ms": 2.514233, + "renderer_readback_cpu_ms": 0.655928, + "simulation_ms": 0.212901, + "snapshot_ms": 0.179368, + "texture_count": 1, + "tick": 28, + "vertices": 576, + "wall_ms": 2.925579 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 29, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572352, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.439622, + "renderer_cpu_ms": 2.431577, + "renderer_readback_cpu_ms": 0.683359, + "simulation_ms": 0.297712, + "snapshot_ms": 0.297892, + "texture_count": 1, + "tick": 29, + "vertices": 576, + "wall_ms": 3.047298 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 30, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573408, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.69314, + "renderer_cpu_ms": 2.684934, + "renderer_readback_cpu_ms": 0.583951, + "simulation_ms": 0.320364, + "snapshot_ms": 0.297391, + "texture_count": 1, + "tick": 30, + "vertices": 576, + "wall_ms": 3.321405 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 31, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572992, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 10.33747, + "renderer_cpu_ms": 10.330636, + "renderer_readback_cpu_ms": 0.692817, + "simulation_ms": 0.231006, + "snapshot_ms": 0.199256, + "texture_count": 1, + "tick": 31, + "vertices": 576, + "wall_ms": 10.779975 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 32, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571968, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 15.27347, + "renderer_cpu_ms": 15.265616, + "renderer_readback_cpu_ms": 0.686214, + "simulation_ms": 0.303803, + "snapshot_ms": 0.282182, + "texture_count": 1, + "tick": 32, + "vertices": 576, + "wall_ms": 15.872521 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 33, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572256, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 13.335966, + "renderer_cpu_ms": 13.328772, + "renderer_readback_cpu_ms": 0.572039, + "simulation_ms": 0.299946, + "snapshot_ms": 0.264739, + "texture_count": 1, + "tick": 33, + "vertices": 576, + "wall_ms": 13.914086 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 34, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572832, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.396503, + "renderer_cpu_ms": 4.389681, + "renderer_readback_cpu_ms": 0.613848, + "simulation_ms": 0.297942, + "snapshot_ms": 0.251815, + "texture_count": 1, + "tick": 34, + "vertices": 576, + "wall_ms": 4.958864 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 35, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572128, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.267818, + "renderer_cpu_ms": 2.262558, + "renderer_readback_cpu_ms": 0.553905, + "simulation_ms": 9.318287, + "snapshot_ms": 0.258127, + "texture_count": 1, + "tick": 35, + "vertices": 576, + "wall_ms": 11.855694 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 36, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572992, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.553839, + "renderer_cpu_ms": 7.544702, + "renderer_readback_cpu_ms": 0.692837, + "simulation_ms": 0.252907, + "snapshot_ms": 0.276632, + "texture_count": 1, + "tick": 36, + "vertices": 576, + "wall_ms": 8.093136 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 37, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571808, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 6.096991, + "renderer_cpu_ms": 6.088975, + "renderer_readback_cpu_ms": 0.722182, + "simulation_ms": 0.293514, + "snapshot_ms": 0.287652, + "texture_count": 1, + "tick": 37, + "vertices": 576, + "wall_ms": 6.692434 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 38, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571456, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.721065, + "renderer_cpu_ms": 4.715375, + "renderer_readback_cpu_ms": 0.518387, + "simulation_ms": 0.277694, + "snapshot_ms": 0.294465, + "texture_count": 1, + "tick": 38, + "vertices": 576, + "wall_ms": 5.305047 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 39, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57088, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.145968, + "renderer_cpu_ms": 2.139555, + "renderer_readback_cpu_ms": 0.602677, + "simulation_ms": 0.699549, + "snapshot_ms": 0.287553, + "texture_count": 1, + "tick": 39, + "vertices": 576, + "wall_ms": 3.143439 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 40, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576256, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.210599, + "renderer_cpu_ms": 2.20514, + "renderer_readback_cpu_ms": 0.6309, + "simulation_ms": 0.267806, + "snapshot_ms": 0.247126, + "texture_count": 1, + "tick": 40, + "vertices": 576, + "wall_ms": 2.737183 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 41, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572672, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.113698, + "renderer_cpu_ms": 2.108167, + "renderer_readback_cpu_ms": 0.552682, + "simulation_ms": 0.26498, + "snapshot_ms": 0.19646, + "texture_count": 1, + "tick": 41, + "vertices": 576, + "wall_ms": 2.587101 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 42, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.585024, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.087888, + "renderer_cpu_ms": 2.081146, + "renderer_readback_cpu_ms": 0.541301, + "simulation_ms": 0.269728, + "snapshot_ms": 0.546421, + "texture_count": 1, + "tick": 42, + "vertices": 576, + "wall_ms": 2.913195 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 43, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57456, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.281844, + "renderer_cpu_ms": 2.274691, + "renderer_readback_cpu_ms": 0.643344, + "simulation_ms": 0.265451, + "snapshot_ms": 0.269689, + "texture_count": 1, + "tick": 43, + "vertices": 576, + "wall_ms": 2.827985 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 44, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57232, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 6.495141, + "renderer_cpu_ms": 6.488349, + "renderer_readback_cpu_ms": 4.786889, + "simulation_ms": 0.267013, + "snapshot_ms": 0.355501, + "texture_count": 1, + "tick": 44, + "vertices": 576, + "wall_ms": 7.128827 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 45, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.575488, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.111159, + "renderer_cpu_ms": 3.103865, + "renderer_readback_cpu_ms": 0.680924, + "simulation_ms": 2.487122, + "snapshot_ms": 0.416425, + "texture_count": 1, + "tick": 45, + "vertices": 576, + "wall_ms": 6.025897 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 46, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57312, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.957689, + "renderer_cpu_ms": 2.951086, + "renderer_readback_cpu_ms": 0.998654, + "simulation_ms": 0.267846, + "snapshot_ms": 0.280349, + "texture_count": 1, + "tick": 46, + "vertices": 576, + "wall_ms": 3.517986 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 47, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579776, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.367646, + "renderer_cpu_ms": 2.360453, + "renderer_readback_cpu_ms": 0.716151, + "simulation_ms": 0.267214, + "snapshot_ms": 0.247376, + "texture_count": 1, + "tick": 47, + "vertices": 576, + "wall_ms": 2.894219 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 48, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572608, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.301157, + "renderer_cpu_ms": 3.29263, + "renderer_readback_cpu_ms": 0.680484, + "simulation_ms": 0.281531, + "snapshot_ms": 0.247757, + "texture_count": 1, + "tick": 48, + "vertices": 576, + "wall_ms": 3.84334 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 49, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.582496, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.572753, + "renderer_cpu_ms": 2.56586, + "renderer_readback_cpu_ms": 0.969599, + "simulation_ms": 0.271021, + "snapshot_ms": 0.208343, + "texture_count": 1, + "tick": 49, + "vertices": 576, + "wall_ms": 3.062907 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 50, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57264, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.447637, + "renderer_cpu_ms": 2.439281, + "renderer_readback_cpu_ms": 0.637883, + "simulation_ms": 0.318702, + "snapshot_ms": 0.303051, + "texture_count": 1, + "tick": 50, + "vertices": 576, + "wall_ms": 3.079368 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 51, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572224, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.349979, + "renderer_cpu_ms": 3.343436, + "renderer_readback_cpu_ms": 1.237985, + "simulation_ms": 0.321467, + "snapshot_ms": 0.314313, + "texture_count": 1, + "tick": 51, + "vertices": 576, + "wall_ms": 3.998974 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 52, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.58704, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.380883, + "renderer_cpu_ms": 4.372999, + "renderer_readback_cpu_ms": 0.81103, + "simulation_ms": 0.282092, + "snapshot_ms": 0.273235, + "texture_count": 1, + "tick": 52, + "vertices": 576, + "wall_ms": 4.945689 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 53, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.577728, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.592393, + "renderer_cpu_ms": 4.583866, + "renderer_readback_cpu_ms": 1.055811, + "simulation_ms": 0.299565, + "snapshot_ms": 0.314182, + "texture_count": 1, + "tick": 53, + "vertices": 576, + "wall_ms": 5.218283 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 54, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571552, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.456223, + "renderer_cpu_ms": 2.449721, + "renderer_readback_cpu_ms": 0.661046, + "simulation_ms": 0.351063, + "snapshot_ms": 0.277333, + "texture_count": 1, + "tick": 54, + "vertices": 576, + "wall_ms": 3.099536 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 55, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.580576, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.209765, + "renderer_cpu_ms": 3.192231, + "renderer_readback_cpu_ms": 0.966824, + "simulation_ms": 0.350491, + "snapshot_ms": 0.267255, + "texture_count": 1, + "tick": 55, + "vertices": 576, + "wall_ms": 3.842749 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 56, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.575936, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.564267, + "renderer_cpu_ms": 2.55542, + "renderer_readback_cpu_ms": 0.814506, + "simulation_ms": 0.288985, + "snapshot_ms": 0.279838, + "texture_count": 1, + "tick": 56, + "vertices": 576, + "wall_ms": 3.151194 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 57, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.575264, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.575189, + "renderer_cpu_ms": 7.566954, + "renderer_readback_cpu_ms": 5.034867, + "simulation_ms": 0.260912, + "snapshot_ms": 0.264169, + "texture_count": 1, + "tick": 57, + "vertices": 576, + "wall_ms": 8.113604 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 58, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573184, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.009366, + "renderer_cpu_ms": 3.003025, + "renderer_readback_cpu_ms": 0.735487, + "simulation_ms": 0.550459, + "snapshot_ms": 0.283084, + "texture_count": 1, + "tick": 58, + "vertices": 576, + "wall_ms": 3.855362 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 59, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57616, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.033653, + "renderer_cpu_ms": 3.026659, + "renderer_readback_cpu_ms": 0.682818, + "simulation_ms": 0.336064, + "snapshot_ms": 0.253699, + "texture_count": 1, + "tick": 59, + "vertices": 576, + "wall_ms": 3.640748 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 60, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.587488, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.713318, + "renderer_cpu_ms": 2.705423, + "renderer_readback_cpu_ms": 0.740627, + "simulation_ms": 0.98576, + "snapshot_ms": 0.281651, + "texture_count": 1, + "tick": 60, + "vertices": 576, + "wall_ms": 3.992961 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 61, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573152, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.752122, + "renderer_cpu_ms": 2.743886, + "renderer_readback_cpu_ms": 0.718786, + "simulation_ms": 0.541701, + "snapshot_ms": 0.268256, + "texture_count": 1, + "tick": 61, + "vertices": 576, + "wall_ms": 3.57321 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 62, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579744, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.511981, + "renderer_cpu_ms": 4.504647, + "renderer_readback_cpu_ms": 0.745616, + "simulation_ms": 0.288334, + "snapshot_ms": 0.536412, + "texture_count": 1, + "tick": 62, + "vertices": 576, + "wall_ms": 5.348849 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 63, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.581088, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.663304, + "renderer_cpu_ms": 2.65607, + "renderer_readback_cpu_ms": 0.872907, + "simulation_ms": 0.706412, + "snapshot_ms": 0.266603, + "texture_count": 1, + "tick": 63, + "vertices": 576, + "wall_ms": 3.650105 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 64, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576832, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.645079, + "renderer_cpu_ms": 2.639629, + "renderer_readback_cpu_ms": 0.87452, + "simulation_ms": 0.270149, + "snapshot_ms": 0.359839, + "texture_count": 1, + "tick": 64, + "vertices": 576, + "wall_ms": 3.286279 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 65, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572384, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.762541, + "renderer_cpu_ms": 2.754596, + "renderer_readback_cpu_ms": 0.709088, + "simulation_ms": 0.378043, + "snapshot_ms": 0.34962, + "texture_count": 1, + "tick": 65, + "vertices": 576, + "wall_ms": 3.501926 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 66, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.581536, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.715643, + "renderer_cpu_ms": 2.709702, + "renderer_readback_cpu_ms": 1.014694, + "simulation_ms": 0.26337699999999997, + "snapshot_ms": 0.338819, + "texture_count": 1, + "tick": 66, + "vertices": 576, + "wall_ms": 3.328589 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 67, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.586944, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.871457, + "renderer_cpu_ms": 2.863822, + "renderer_readback_cpu_ms": 0.648613, + "simulation_ms": 0.330453, + "snapshot_ms": 0.288023, + "texture_count": 1, + "tick": 67, + "vertices": 576, + "wall_ms": 3.500894 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 68, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.600128, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.988117, + "renderer_cpu_ms": 2.981594, + "renderer_readback_cpu_ms": 1.070779, + "simulation_ms": 0.270791, + "snapshot_ms": 0.365048, + "texture_count": 1, + "tick": 68, + "vertices": 576, + "wall_ms": 3.635218 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 69, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57216, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.481742, + "renderer_cpu_ms": 2.474748, + "renderer_readback_cpu_ms": 0.753121, + "simulation_ms": 0.27569, + "snapshot_ms": 0.244251, + "texture_count": 1, + "tick": 69, + "vertices": 576, + "wall_ms": 3.011651 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 70, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571904, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.663013, + "renderer_cpu_ms": 2.656931, + "renderer_readback_cpu_ms": 0.571498, + "simulation_ms": 0.275239, + "snapshot_ms": 0.249841, + "texture_count": 1, + "tick": 70, + "vertices": 576, + "wall_ms": 3.200216 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 71, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57776, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.436306, + "renderer_cpu_ms": 2.429954, + "renderer_readback_cpu_ms": 0.761737, + "simulation_ms": 0.320294, + "snapshot_ms": 0.53538, + "texture_count": 1, + "tick": 71, + "vertices": 576, + "wall_ms": 3.301658 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 72, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573984, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.589992, + "renderer_cpu_ms": 3.584061, + "renderer_readback_cpu_ms": 0.662009, + "simulation_ms": 0.262606, + "snapshot_ms": 0.235023, + "texture_count": 1, + "tick": 72, + "vertices": 576, + "wall_ms": 4.097379 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 73, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571488, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 6.826287, + "renderer_cpu_ms": 6.818341, + "renderer_readback_cpu_ms": 0.637863, + "simulation_ms": 0.260521, + "snapshot_ms": 0.235194, + "texture_count": 1, + "tick": 73, + "vertices": 576, + "wall_ms": 7.332963 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 74, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57856, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 8.219264, + "renderer_cpu_ms": 8.212883, + "renderer_readback_cpu_ms": 1.015646, + "simulation_ms": 0.256263, + "snapshot_ms": 0.237919, + "texture_count": 1, + "tick": 74, + "vertices": 576, + "wall_ms": 8.723746 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 75, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.574912, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.373428, + "renderer_cpu_ms": 7.366015, + "renderer_readback_cpu_ms": 0.751557, + "simulation_ms": 1.079266, + "snapshot_ms": 0.259329, + "texture_count": 1, + "tick": 75, + "vertices": 576, + "wall_ms": 8.724006 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 76, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579936, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.201435, + "renderer_cpu_ms": 4.194642, + "renderer_readback_cpu_ms": 0.60946, + "simulation_ms": 0.278656, + "snapshot_ms": 0.248799, + "texture_count": 1, + "tick": 76, + "vertices": 576, + "wall_ms": 4.741023 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 77, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572928, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.060089, + "renderer_cpu_ms": 4.053866, + "renderer_readback_cpu_ms": 0.650147, + "simulation_ms": 3.527244, + "snapshot_ms": 0.423138, + "texture_count": 1, + "tick": 77, + "vertices": 576, + "wall_ms": 8.022463 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 78, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.586016, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.087177, + "renderer_cpu_ms": 2.079483, + "renderer_readback_cpu_ms": 0.546912, + "simulation_ms": 3.527134, + "snapshot_ms": 1.747266, + "texture_count": 1, + "tick": 78, + "vertices": 576, + "wall_ms": 7.375883 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 79, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.5824, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.923436, + "renderer_cpu_ms": 7.91502, + "renderer_readback_cpu_ms": 0.662169, + "simulation_ms": 0.330393, + "snapshot_ms": 0.260792, + "texture_count": 1, + "tick": 79, + "vertices": 576, + "wall_ms": 8.52503 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 80, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572704, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.8097, + "renderer_cpu_ms": 2.802096, + "renderer_readback_cpu_ms": 0.598729, + "simulation_ms": 0.725739, + "snapshot_ms": 0.472572, + "texture_count": 1, + "tick": 80, + "vertices": 576, + "wall_ms": 4.020474 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 81, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579456, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.202624, + "renderer_cpu_ms": 2.195341, + "renderer_readback_cpu_ms": 0.547483, + "simulation_ms": 0.315826, + "snapshot_ms": 0.457563, + "texture_count": 1, + "tick": 81, + "vertices": 576, + "wall_ms": 2.986463 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 82, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.577696, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.12573, + "renderer_cpu_ms": 2.12037, + "renderer_readback_cpu_ms": 0.623796, + "simulation_ms": 0.606033, + "snapshot_ms": 0.412959, + "texture_count": 1, + "tick": 82, + "vertices": 576, + "wall_ms": 3.157816 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 83, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.578624, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.050327, + "renderer_cpu_ms": 2.044176, + "renderer_readback_cpu_ms": 0.580936, + "simulation_ms": 0.249079, + "snapshot_ms": 0.433488, + "texture_count": 1, + "tick": 83, + "vertices": 576, + "wall_ms": 2.743335 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 84, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.580576, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.471652, + "renderer_cpu_ms": 2.463917, + "renderer_readback_cpu_ms": 0.931146, + "simulation_ms": 0.221939, + "snapshot_ms": 0.182284, + "texture_count": 1, + "tick": 84, + "vertices": 576, + "wall_ms": 2.886916 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 85, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.575936, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 5.15845, + "renderer_cpu_ms": 5.153521, + "renderer_readback_cpu_ms": 0.640218, + "simulation_ms": 0.2702, + "snapshot_ms": 0.254841, + "texture_count": 1, + "tick": 85, + "vertices": 576, + "wall_ms": 5.693409 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 86, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.578176, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.886952, + "renderer_cpu_ms": 3.880911, + "renderer_readback_cpu_ms": 2.359841, + "simulation_ms": 0.221067, + "snapshot_ms": 0.201691, + "texture_count": 1, + "tick": 86, + "vertices": 576, + "wall_ms": 4.320139 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 87, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.574432, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 4.342691, + "renderer_cpu_ms": 4.328565, + "renderer_readback_cpu_ms": 0.63636, + "simulation_ms": 0.274287, + "snapshot_ms": 0.209004, + "texture_count": 1, + "tick": 87, + "vertices": 576, + "wall_ms": 4.836543 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 88, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57376, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.879869, + "renderer_cpu_ms": 3.873577, + "renderer_readback_cpu_ms": 0.633455, + "simulation_ms": 0.263327, + "snapshot_ms": 0.183075, + "texture_count": 1, + "tick": 88, + "vertices": 576, + "wall_ms": 4.353542 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 89, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571808, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.255946, + "renderer_cpu_ms": 2.24784, + "renderer_readback_cpu_ms": 0.704448, + "simulation_ms": 0.225876, + "snapshot_ms": 0.204295, + "texture_count": 1, + "tick": 89, + "vertices": 576, + "wall_ms": 2.69824 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 90, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579296, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.367316, + "renderer_cpu_ms": 2.35907, + "renderer_readback_cpu_ms": 0.721321, + "simulation_ms": 0.356663, + "snapshot_ms": 0.264308, + "texture_count": 1, + "tick": 90, + "vertices": 576, + "wall_ms": 3.000821 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 91, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576992, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.471031, + "renderer_cpu_ms": 2.464349, + "renderer_readback_cpu_ms": 0.697206, + "simulation_ms": 0.272714, + "snapshot_ms": 0.276832, + "texture_count": 1, + "tick": 91, + "vertices": 576, + "wall_ms": 3.033111 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 92, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.574176, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.251417, + "renderer_cpu_ms": 2.244224, + "renderer_readback_cpu_ms": 0.654064, + "simulation_ms": 0.296219, + "snapshot_ms": 0.258918, + "texture_count": 1, + "tick": 92, + "vertices": 576, + "wall_ms": 2.818316 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 93, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572064, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.116919, + "renderer_cpu_ms": 3.108524, + "renderer_readback_cpu_ms": 0.734535, + "simulation_ms": 0.274248, + "snapshot_ms": 0.247336, + "texture_count": 1, + "tick": 93, + "vertices": 576, + "wall_ms": 3.651307 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 94, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.603104, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.736962, + "renderer_cpu_ms": 2.729429, + "renderer_readback_cpu_ms": 0.693859, + "simulation_ms": 0.28646, + "snapshot_ms": 0.250733, + "texture_count": 1, + "tick": 94, + "vertices": 576, + "wall_ms": 3.286569 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 95, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.587136, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.19475, + "renderer_cpu_ms": 2.188568, + "renderer_readback_cpu_ms": 0.556369, + "simulation_ms": 0.283906, + "snapshot_ms": 0.268907, + "texture_count": 1, + "tick": 95, + "vertices": 576, + "wall_ms": 2.759545 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 96, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.588224, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 1.981578, + "renderer_cpu_ms": 1.975626, + "renderer_readback_cpu_ms": 0.525611, + "simulation_ms": 0.241165, + "snapshot_ms": 0.193625, + "texture_count": 1, + "tick": 96, + "vertices": 576, + "wall_ms": 2.427319 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 97, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.582784, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 1.987259, + "renderer_cpu_ms": 1.983651, + "renderer_readback_cpu_ms": 0.497759, + "simulation_ms": 0.207792, + "snapshot_ms": 0.183587, + "texture_count": 1, + "tick": 97, + "vertices": 576, + "wall_ms": 2.389648 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 98, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573664, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.415326, + "renderer_cpu_ms": 2.407502, + "renderer_readback_cpu_ms": 0.5358, + "simulation_ms": 0.229232, + "snapshot_ms": 0.188215, + "texture_count": 1, + "tick": 98, + "vertices": 576, + "wall_ms": 2.843223 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 99, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.574496, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.32192, + "renderer_cpu_ms": 2.316129, + "renderer_readback_cpu_ms": 0.493391, + "simulation_ms": 0.304434, + "snapshot_ms": 0.214414, + "texture_count": 1, + "tick": 99, + "vertices": 576, + "wall_ms": 2.855687 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 100, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573536, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.005714, + "renderer_cpu_ms": 2.001025, + "renderer_readback_cpu_ms": 0.59376, + "simulation_ms": 0.305817, + "snapshot_ms": 0.215356, + "texture_count": 1, + "tick": 100, + "vertices": 576, + "wall_ms": 2.537507 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 101, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.579744, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.020652, + "renderer_cpu_ms": 2.014239, + "renderer_readback_cpu_ms": 0.517917, + "simulation_ms": 0.275801, + "snapshot_ms": 0.257896, + "texture_count": 1, + "tick": 101, + "vertices": 576, + "wall_ms": 2.563716 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 102, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.572928, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.095342, + "renderer_cpu_ms": 2.089752, + "renderer_readback_cpu_ms": 0.565607, + "simulation_ms": 0.568453, + "snapshot_ms": 0.255842, + "texture_count": 1, + "tick": 102, + "vertices": 576, + "wall_ms": 2.929957 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 103, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57472, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.312743, + "renderer_cpu_ms": 2.304316, + "renderer_readback_cpu_ms": 0.673911, + "simulation_ms": 0.279988, + "snapshot_ms": 0.273166, + "texture_count": 1, + "tick": 103, + "vertices": 576, + "wall_ms": 2.875945 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 104, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57376, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.649718, + "renderer_cpu_ms": 2.642214, + "renderer_readback_cpu_ms": 0.707565, + "simulation_ms": 0.296319, + "snapshot_ms": 0.250162, + "texture_count": 1, + "tick": 104, + "vertices": 576, + "wall_ms": 3.208582 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 105, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.583104, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.794852, + "renderer_cpu_ms": 2.787759, + "renderer_readback_cpu_ms": 0.890309, + "simulation_ms": 0.42907, + "snapshot_ms": 0.271782, + "texture_count": 1, + "tick": 105, + "vertices": 576, + "wall_ms": 3.508758 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 106, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.581536, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.187476, + "renderer_cpu_ms": 2.180714, + "renderer_readback_cpu_ms": 0.58305, + "simulation_ms": 0.278486, + "snapshot_ms": 0.370689, + "texture_count": 1, + "tick": 106, + "vertices": 576, + "wall_ms": 2.849975 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 107, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.582912, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.317472, + "renderer_cpu_ms": 2.31178, + "renderer_readback_cpu_ms": 0.605132, + "simulation_ms": 0.272163, + "snapshot_ms": 0.313772, + "texture_count": 1, + "tick": 107, + "vertices": 576, + "wall_ms": 2.914288 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 108, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.581472, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.797954, + "renderer_cpu_ms": 3.787945, + "renderer_readback_cpu_ms": 0.934933, + "simulation_ms": 0.205918, + "snapshot_ms": 0.309474, + "texture_count": 1, + "tick": 108, + "vertices": 576, + "wall_ms": 4.324347 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 109, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.580896, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.421163, + "renderer_cpu_ms": 3.413198, + "renderer_readback_cpu_ms": 1.15022, + "simulation_ms": 0.326216, + "snapshot_ms": 0.258928, + "texture_count": 1, + "tick": 109, + "vertices": 576, + "wall_ms": 4.020514 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 110, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.577632, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.139672, + "renderer_cpu_ms": 3.13301, + "renderer_readback_cpu_ms": 0.583911, + "simulation_ms": 0.278635, + "snapshot_ms": 0.268597, + "texture_count": 1, + "tick": 110, + "vertices": 576, + "wall_ms": 3.700721 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 111, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571776, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 1.95597, + "renderer_cpu_ms": 1.95115, + "renderer_readback_cpu_ms": 0.518558, + "simulation_ms": 0.304204, + "snapshot_ms": 0.249591, + "texture_count": 1, + "tick": 111, + "vertices": 576, + "wall_ms": 2.520635 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 112, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57168, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.043365, + "renderer_cpu_ms": 2.036531, + "renderer_readback_cpu_ms": 0.539949, + "simulation_ms": 0.246145, + "snapshot_ms": 0.237087, + "texture_count": 1, + "tick": 112, + "vertices": 576, + "wall_ms": 2.535814 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 113, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573216, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.022315, + "renderer_cpu_ms": 2.017626, + "renderer_readback_cpu_ms": 0.526934, + "simulation_ms": 0.282543, + "snapshot_ms": 0.236206, + "texture_count": 1, + "tick": 113, + "vertices": 576, + "wall_ms": 2.550892 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 114, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.571648, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 7.339675, + "renderer_cpu_ms": 7.334154, + "renderer_readback_cpu_ms": 1.449484, + "simulation_ms": 0.251735, + "snapshot_ms": 0.267054, + "texture_count": 1, + "tick": 114, + "vertices": 576, + "wall_ms": 7.868022 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 115, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.57296, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 3.140805, + "renderer_cpu_ms": 3.134212, + "renderer_readback_cpu_ms": 0.688309, + "simulation_ms": 0.312069, + "snapshot_ms": 0.261313, + "texture_count": 1, + "tick": 115, + "vertices": 576, + "wall_ms": 3.723313 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 116, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.584032, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.225909, + "renderer_cpu_ms": 2.219316, + "renderer_readback_cpu_ms": 0.613958, + "simulation_ms": 0.712645, + "snapshot_ms": 0.288885, + "texture_count": 1, + "tick": 116, + "vertices": 576, + "wall_ms": 3.239581 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 117, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.58096, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.534361, + "renderer_cpu_ms": 2.528409, + "renderer_readback_cpu_ms": 0.613096, + "simulation_ms": 2.193257, + "snapshot_ms": 0.368045, + "texture_count": 1, + "tick": 117, + "vertices": 576, + "wall_ms": 5.109268 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 118, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.573408, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 9.40469, + "renderer_cpu_ms": 9.396144, + "renderer_readback_cpu_ms": 2.411539, + "simulation_ms": 0.259489, + "snapshot_ms": 0.285959, + "texture_count": 1, + "tick": 118, + "vertices": 576, + "wall_ms": 9.960939 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 119, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.575456, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 8.90094, + "renderer_cpu_ms": 8.894248, + "renderer_readback_cpu_ms": 3.140864, + "simulation_ms": 0.292121, + "snapshot_ms": 2.595406, + "texture_count": 1, + "tick": 119, + "vertices": 576, + "wall_ms": 11.802233 + }, + { + "draw_calls": 31, + "dropped_simulation_seconds": 0.0, + "fixed_ticks": 1, + "frame": 120, + "gpu_allocated_bytes": 15787008, + "gpu_ms": 0.576512, + "gpu_visibility_active": false, + "interpolation_alpha": 0.0, + "physics_debug": false, + "render_call_ms": 2.721985, + "renderer_cpu_ms": 2.714661, + "renderer_readback_cpu_ms": 0.589452, + "simulation_ms": 0.255693, + "snapshot_ms": 0.505744, + "texture_count": 1, + "tick": 120, + "vertices": 576, + "wall_ms": 3.497057 + } + ], + "simulation_mode": "synthetic_fixed_timestep", + "startup_ms": { + "main_to_first_frame": 701.578493, + "renderer_initialization": 687.012757, + "scene_read": 0.575256, + "world_initialization": 0.912781 + }, + "summary_ms": { + "gpu": { + "max": 0.603104, + "min": 0.57088, + "p50": 0.57456, + "p95": 0.587488, + "samples": 120 + }, + "render_call": { + "max": 15.27347, + "min": 1.95597, + "p50": 2.713318, + "p95": 8.219264, + "samples": 120 + }, + "renderer_cpu": { + "max": 15.265616, + "min": 1.95115, + "p50": 2.705423, + "p95": 8.212883, + "samples": 120 + }, + "renderer_readback_cpu": { + "max": 5.034867, + "min": 0.493391, + "p50": 0.680484, + "p95": 2.359841, + "samples": 120 + }, + "simulation": { + "max": 9.318287, + "min": 0.205918, + "p50": 0.288985, + "p95": 1.079266, + "samples": 120 + }, + "snapshot": { + "max": 2.595406, + "min": 0.178897, + "p50": 0.267054, + "p95": 0.536412, + "samples": 120 + }, + "wall": { + "max": 15.872521, + "min": 2.389648, + "p50": 3.497057, + "p95": 9.960939, + "samples": 120 + } + }, + "timing_notes": "Durations use steady_clock wall time, not thread CPU usage. render_call/renderer_cpu include GPU waits, readback and window presentation. renderer_readback_cpu measures map/copy/unmap wall time within that call. GPU timestamps cover submitted rendering, not CPU work. A missing/zero GPU timestamp is null. Frame durations exclude profile bookkeeping and final capture/profile file writes. Startup begins at Player application entry after platform argument normalization, excluding OS loader/launcher.", + "validation_enabled": true, + "validation_errors": 0, + "version": 1, + "visibility_mode": "direct", + "width": 1280 +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-run.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-run.json new file mode 100644 index 0000000..f96754b --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-run.json @@ -0,0 +1,18 @@ +{ + "arguments": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/faset_player", + "--headless", + "--frames", + "120", + "--capture", + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/verification.ppm", + "--profile", + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/profile.json" + ], + "cwd": "/tmp/faset-playable-exports-u_8rjufs/empty-working-directory", + "seconds": 1.485020653984975, + "exit_code": 0, + "timed_out": false, + "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"NVIDIA GeForce RTX 2080 Ti\",\"dimension\":3,\"frames\":120,\"gpu_visibility_active\":false,\"ticks\":120,\"validation_errors\":0,\"visibility_mode\":\"direct\"}\n", + "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n" +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-validate.json b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-validate.json new file mode 100644 index 0000000..3e3c260 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/collect-3d-validate.json @@ -0,0 +1,12 @@ +{ + "arguments": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/faset_player", + "--validate" + ], + "cwd": "/tmp/faset-playable-exports-u_8rjufs/empty-working-directory", + "seconds": 0.01345648302230984, + "exit_code": 0, + "timed_out": false, + "stdout": "{\"dimension\":3,\"validated\":true}\n", + "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n" +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/ctest-lavapipe-p2.txt b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-lavapipe-p2.txt new file mode 100644 index 0000000..495190a --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-lavapipe-p2.txt @@ -0,0 +1,39 @@ +Test project /home/emil/Desktop/.worktrees/Faset_Engine-p2/build/p2-release + Start 26: render_gpu_lifecycle + Start 29: render_gpu_open_sequence + 1/15 Test #26: render_gpu_lifecycle ............. Passed 0.80 sec + Start 30: render_gpu_transparent + 2/15 Test #30: render_gpu_transparent ........... Passed 0.43 sec + Start 27: render_gpu_views + 3/15 Test #27: render_gpu_views ................. Passed 0.43 sec + Start 25: render_gpu_near + 4/15 Test #25: render_gpu_near .................. Passed 0.36 sec + Start 23: render_gpu_lod + 5/15 Test #23: render_gpu_lod ................... Passed 0.69 sec + Start 28: render_gpu_projection + 6/15 Test #29: render_gpu_open_sequence ......... Passed 3.05 sec + Start 17: render_gpu_capacity + 7/15 Test #28: render_gpu_projection ............ Passed 0.43 sec + Start 22: render_gpu_resize + 8/15 Test #17: render_gpu_capacity .............. Passed 0.37 sec + Start 18: render_gpu_dense + 9/15 Test #22: render_gpu_resize ................ Passed 0.38 sec + Start 24: render_gpu_teleport +10/15 Test #18: render_gpu_dense ................. Passed 0.30 sec + Start 16: render_gpu_empty +11/15 Test #24: render_gpu_teleport .............. Passed 0.38 sec + Start 21: render_gpu_cut +12/15 Test #16: render_gpu_empty ................. Passed 0.31 sec + Start 19: render_gpu_door +13/15 Test #21: render_gpu_cut ................... Passed 0.44 sec + Start 20: render_gpu_shadow +14/15 Test #19: render_gpu_door .................. Passed 0.42 sec +15/15 Test #20: render_gpu_shadow ................ Passed 0.30 sec + +100% tests passed, 0 tests failed out of 15 + +Label Time Summary: +gpu = 9.09 sec*proc (15 tests) +p2 = 9.09 sec*proc (15 tests) + +Total Test time (real) = 4.65 sec diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-debug.txt b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-debug.txt new file mode 100644 index 0000000..94e1a2c --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-debug.txt @@ -0,0 +1,127 @@ +Test project /home/emil/Desktop/.worktrees/Faset_Engine-p2/build/linux-debug + Start 37: build_schema_publication + Start 50: editor_gui_mcp + Start 44: editor_ui_reload + Start 46: editor_ui_templates + Start 34: lua_player_reload + Start 48: editor_ui_authoring + 1/57 Test #48: editor_ui_authoring .............. Passed 2.61 sec + Start 32: player_shutdown_diagnostics + 2/57 Test #34: lua_player_reload ................ Passed 3.22 sec + Start 47: editor_ui_gizmos + 3/57 Test #46: editor_ui_templates .............. Passed 4.08 sec + Start 43: editor_ui_project_settings + 4/57 Test #47: editor_ui_gizmos ................. Passed 1.50 sec + Start 45: editor_ui_launcher + 5/57 Test #32: player_shutdown_diagnostics ...... Passed 2.37 sec + Start 42: editor_ui_import_conflicts + 6/57 Test #44: editor_ui_reload ................. Passed 4.99 sec + Start 10: render_shader_reload + 7/57 Test #43: editor_ui_project_settings ....... Passed 1.64 sec + Start 57: playable_3d + 8/57 Test #45: editor_ui_launcher ............... Passed 1.24 sec + Start 41: ui_render + 9/57 Test #42: editor_ui_import_conflicts ....... Passed 1.53 sec + Start 29: render_gpu_open_sequence +10/57 Test #50: editor_gui_mcp ................... Passed 6.83 sec + Start 8: render_offscreen +11/57 Test #57: playable_3d ...................... Passed 1.27 sec + Start 12: render_shader_reflection +12/57 Test #41: ui_render ........................ Passed 1.16 sec + Start 9: render_sprite_alpha +13/57 Test #8: render_offscreen ................. Passed 0.95 sec + Start 15: gpu_visibility +14/57 Test #9: render_sprite_alpha .............. Passed 0.76 sec + Start 26: render_gpu_lifecycle +15/57 Test #12: render_shader_reflection ......... Passed 1.58 sec + Start 56: playable_2d +16/57 Test #56: playable_2d ...................... Passed 0.60 sec + Start 28: render_gpu_projection +17/57 Test #15: gpu_visibility ................... Passed 2.00 sec + Start 25: render_gpu_near +18/57 Test #29: render_gpu_open_sequence ......... Passed 4.14 sec + Start 30: render_gpu_transparent +19/57 Test #10: render_shader_reload ............. Passed 6.04 sec + Start 17: render_gpu_capacity +20/57 Test #28: render_gpu_projection ............ Passed 2.29 sec + Start 24: render_gpu_teleport +21/57 Test #26: render_gpu_lifecycle ............. Passed 3.96 sec + Start 22: render_gpu_resize +22/57 Test #25: render_gpu_near .................. Passed 2.20 sec + Start 27: render_gpu_views +23/57 Test #30: render_gpu_transparent ........... Passed 2.74 sec + Start 23: render_gpu_lod +24/57 Test #17: render_gpu_capacity .............. Passed 2.51 sec + Start 16: render_gpu_empty +25/57 Test #24: render_gpu_teleport .............. Passed 2.28 sec + Start 18: render_gpu_dense +26/57 Test #22: render_gpu_resize ................ Passed 2.30 sec + Start 21: render_gpu_cut +27/57 Test #27: render_gpu_views ................. Passed 2.29 sec + Start 20: render_gpu_shadow +28/57 Test #37: build_schema_publication ......... Passed 14.35 sec + Start 36: process_and_cook +29/57 Test #36: process_and_cook ................. Passed 0.33 sec + Start 49: editor_mcp_stdio +30/57 Test #49: editor_mcp_stdio ................. Passed 0.28 sec + Start 19: render_gpu_door +31/57 Test #23: render_gpu_lod ................... Passed 2.55 sec + Start 6: lua_safety_contracts +32/57 Test #18: render_gpu_dense ................. Passed 2.42 sec + Start 3: assets_pipeline +33/57 Test #6: lua_safety_contracts ............. Passed 0.26 sec + Start 51: core +34/57 Test #16: render_gpu_empty ................. Passed 2.70 sec + Start 33: lua_cli_contracts +35/57 Test #3: assets_pipeline .................. Passed 0.17 sec + Start 2: runtime_contracts +36/57 Test #33: lua_cli_contracts ................ Passed 0.18 sec + Start 40: ui_widgets +37/57 Test #51: core ............................. Passed 0.21 sec + Start 5: lua_contracts +38/57 Test #21: render_gpu_cut ................... Passed 2.29 sec + Start 4: assets_blender_bundle +39/57 Test #20: render_gpu_shadow ................ Passed 2.23 sec + Start 55: tutorial_physics +40/57 Test #2: runtime_contracts ................ Passed 0.16 sec + Start 11: render_gpu_shader_contract +41/57 Test #5: lua_contracts .................... Passed 0.14 sec + Start 1: authoring +42/57 Test #55: tutorial_physics ................. Passed 0.09 sec + Start 38: editor_plugins +43/57 Test #4: assets_blender_bundle ............ Passed 0.14 sec + Start 52: tutorial_moving +44/57 Test #11: render_gpu_shader_contract ....... Passed 0.11 sec + Start 39: editor_session_settings +45/57 Test #40: ui_widgets ....................... Passed 0.21 sec +46/57 Test #1: authoring ........................ Passed 0.06 sec + Start 54: tutorial_spawning + Start 53: tutorial_following +47/57 Test #38: editor_plugins ................... Passed 0.08 sec +48/57 Test #52: tutorial_moving .................. Passed 0.07 sec +49/57 Test #54: tutorial_spawning ................ Passed 0.04 sec + Start 35: editor_mcp + Start 31: player_scene_contracts + Start 7: render_graph +50/57 Test #53: tutorial_following ............... Passed 0.05 sec + Start 14: visibility_policy +51/57 Test #35: editor_mcp ....................... Passed 0.03 sec +52/57 Test #31: player_scene_contracts ........... Passed 0.02 sec +53/57 Test #7: render_graph ..................... Passed 0.02 sec + Start 13: render_window_lifecycle +54/57 Test #39: editor_session_settings .......... Passed 0.08 sec +55/57 Test #14: visibility_policy ................ Passed 0.01 sec +56/57 Test #19: render_gpu_door .................. Passed 1.76 sec +57/57 Test #13: render_window_lifecycle ..........***Skipped 4.22 sec + +100% tests passed, 0 tests failed out of 57 + +Label Time Summary: +gpu = 81.79 sec*proc (30 tests) +p2 = 38.66 sec*proc (15 tests) +window = 11.04 sec*proc (2 tests) + +Total Test time (real) = 20.92 sec + +The following tests did not run: + 13 - render_window_lifecycle (Skipped) diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-release.txt b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-release.txt new file mode 100644 index 0000000..dc1f6d4 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/ctest-linux-release.txt @@ -0,0 +1,127 @@ +Test project /home/emil/Desktop/.worktrees/Faset_Engine-p2/build/p2-release + Start 10: render_shader_reload + Start 32: player_shutdown_diagnostics + Start 44: editor_ui_reload + Start 34: lua_player_reload + Start 15: gpu_visibility + Start 29: render_gpu_open_sequence + 1/57 Test #29: render_gpu_open_sequence ......... Passed 3.15 sec + Start 26: render_gpu_lifecycle + 2/57 Test #15: gpu_visibility ................... Passed 3.31 sec + Start 37: build_schema_publication + 3/57 Test #34: lua_player_reload ................ Passed 3.51 sec + Start 28: render_gpu_projection + 4/57 Test #32: player_shutdown_diagnostics ...... Passed 4.60 sec + Start 30: render_gpu_transparent + 5/57 Test #44: editor_ui_reload ................. Passed 5.01 sec + Start 25: render_gpu_near + 6/57 Test #28: render_gpu_projection ............ Passed 1.77 sec + Start 23: render_gpu_lod + 7/57 Test #37: build_schema_publication ......... Passed 2.03 sec + Start 27: render_gpu_views + 8/57 Test #30: render_gpu_transparent ........... Passed 2.48 sec + Start 8: render_offscreen + 9/57 Test #26: render_gpu_lifecycle ............. Passed 3.92 sec + Start 50: editor_gui_mcp +10/57 Test #10: render_shader_reload ............. Passed 7.15 sec + Start 24: render_gpu_teleport +11/57 Test #25: render_gpu_near .................. Passed 2.30 sec + Start 12: render_shader_reflection +12/57 Test #23: render_gpu_lod ................... Passed 2.23 sec + Start 9: render_sprite_alpha +13/57 Test #27: render_gpu_views ................. Passed 2.39 sec + Start 46: editor_ui_templates +14/57 Test #8: render_offscreen ................. Passed 1.53 sec + Start 45: editor_ui_launcher +15/57 Test #9: render_sprite_alpha .............. Passed 1.26 sec + Start 22: render_gpu_resize +16/57 Test #12: render_shader_reflection ......... Passed 1.56 sec + Start 18: render_gpu_dense +17/57 Test #24: render_gpu_teleport .............. Passed 2.04 sec + Start 17: render_gpu_capacity +18/57 Test #46: editor_ui_templates .............. Passed 1.98 sec + Start 16: render_gpu_empty +19/57 Test #50: editor_gui_mcp ................... Passed 2.78 sec + Start 21: render_gpu_cut +20/57 Test #45: editor_ui_launcher ............... Passed 1.57 sec + Start 48: editor_ui_authoring +21/57 Test #18: render_gpu_dense ................. Passed 2.48 sec + Start 19: render_gpu_door +22/57 Test #22: render_gpu_resize ................ Passed 2.74 sec + Start 43: editor_ui_project_settings +23/57 Test #48: editor_ui_authoring .............. Passed 1.58 sec + Start 20: render_gpu_shadow +24/57 Test #17: render_gpu_capacity .............. Passed 2.90 sec + Start 42: editor_ui_import_conflicts +25/57 Test #16: render_gpu_empty ................. Passed 2.48 sec + Start 41: ui_render +26/57 Test #21: render_gpu_cut ................... Passed 2.46 sec + Start 47: editor_ui_gizmos +27/57 Test #43: editor_ui_project_settings ....... Passed 1.66 sec + Start 36: process_and_cook +28/57 Test #36: process_and_cook ................. Passed 0.30 sec + Start 49: editor_mcp_stdio +29/57 Test #49: editor_mcp_stdio ................. Passed 0.25 sec + Start 4: assets_blender_bundle +30/57 Test #42: editor_ui_import_conflicts ....... Passed 1.75 sec + Start 33: lua_cli_contracts +31/57 Test #4: assets_blender_bundle ............ Passed 0.14 sec + Start 40: ui_widgets +32/57 Test #19: render_gpu_door .................. Passed 2.52 sec + Start 57: playable_3d +33/57 Test #41: ui_render ........................ Passed 1.71 sec +34/57 Test #47: editor_ui_gizmos ................. Passed 1.57 sec + Start 6: lua_safety_contracts + Start 51: core +35/57 Test #20: render_gpu_shadow ................ Passed 2.23 sec + Start 56: playable_2d +36/57 Test #51: core ............................. Passed 0.10 sec + Start 3: assets_pipeline +37/57 Test #6: lua_safety_contracts ............. Passed 0.14 sec + Start 38: editor_plugins +38/57 Test #57: playable_3d ...................... Passed 0.18 sec + Start 5: lua_contracts +39/57 Test #38: editor_plugins ................... Passed 0.03 sec + Start 1: authoring +40/57 Test #3: assets_pipeline .................. Passed 0.08 sec + Start 2: runtime_contracts +41/57 Test #40: ui_widgets ....................... Passed 0.22 sec + Start 11: render_gpu_shader_contract +42/57 Test #33: lua_cli_contracts ................ Passed 0.25 sec + Start 31: player_scene_contracts +43/57 Test #56: playable_2d ...................... Passed 0.10 sec + Start 55: tutorial_physics +44/57 Test #1: authoring ........................ Passed 0.03 sec + Start 39: editor_session_settings +45/57 Test #31: player_scene_contracts ........... Passed 0.01 sec + Start 35: editor_mcp +46/57 Test #2: runtime_contracts ................ Passed 0.04 sec +47/57 Test #11: render_gpu_shader_contract ....... Passed 0.03 sec +48/57 Test #39: editor_session_settings .......... Passed 0.02 sec +49/57 Test #35: editor_mcp ....................... Passed 0.01 sec + Start 7: render_graph + Start 14: visibility_policy + Start 54: tutorial_spawning + Start 52: tutorial_moving +50/57 Test #5: lua_contracts .................... Passed 0.09 sec +51/57 Test #7: render_graph ..................... Passed 0.02 sec +52/57 Test #14: visibility_policy ................ Passed 0.02 sec + Start 53: tutorial_following + Start 13: render_window_lifecycle +53/57 Test #55: tutorial_physics ................. Passed 0.06 sec +54/57 Test #54: tutorial_spawning ................ Passed 0.03 sec +55/57 Test #52: tutorial_moving .................. Passed 0.02 sec +56/57 Test #53: tutorial_following ............... Passed 0.02 sec +57/57 Test #13: render_window_lifecycle ..........***Skipped 4.23 sec + +100% tests passed, 0 tests failed out of 57 + +Label Time Summary: +gpu = 79.96 sec*proc (30 tests) +p2 = 38.08 sec*proc (15 tests) +window = 7.01 sec*proc (2 tests) + +Total Test time (real) = 18.39 sec + +The following tests did not run: + 13 - render_window_lifecycle (Skipped) diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/p2-exported-gpu-visibility.json b/docs/validation/p2-gpu-visibility-2026-09-23/p2-exported-gpu-visibility.json new file mode 100644 index 0000000..e0b07ca --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/p2-exported-gpu-visibility.json @@ -0,0 +1,97 @@ +{ + "source_report": "report.json", + "runs": [ + { + "name": "collect-2d", + "mode": "gpu-frustum", + "frames": 6, + "gpu_visibility_active": true, + "validation_errors": 0, + "device": "NVIDIA GeForce RTX 2080 Ti", + "capture_sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a", + "profile": "collect-2d-gpu-frustum-profile.json", + "capture": "collect-2d-gpu-frustum.ppm", + "command": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-2d/faset_player", + "--headless", + "--frames", + "6", + "--visibility", + "gpu-frustum", + "--profile", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-2d-gpu-frustum-profile.json", + "--capture", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-2d-gpu-frustum.ppm" + ] + }, + { + "name": "collect-2d", + "mode": "gpu-occlusion", + "frames": 6, + "gpu_visibility_active": true, + "validation_errors": 0, + "device": "NVIDIA GeForce RTX 2080 Ti", + "capture_sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a", + "profile": "collect-2d-gpu-occlusion-profile.json", + "capture": "collect-2d-gpu-occlusion.ppm", + "command": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-2d/faset_player", + "--headless", + "--frames", + "6", + "--visibility", + "gpu-occlusion", + "--profile", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-2d-gpu-occlusion-profile.json", + "--capture", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-2d-gpu-occlusion.ppm" + ] + }, + { + "name": "collect-3d", + "mode": "gpu-frustum", + "frames": 6, + "gpu_visibility_active": true, + "validation_errors": 0, + "device": "NVIDIA GeForce RTX 2080 Ti", + "capture_sha256": "7d18da12d685ed41705175fd7c65887d767668c1614b1b7669c99f05c694d435", + "profile": "collect-3d-gpu-frustum-profile.json", + "capture": "collect-3d-gpu-frustum.ppm", + "command": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/faset_player", + "--headless", + "--frames", + "6", + "--visibility", + "gpu-frustum", + "--profile", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-3d-gpu-frustum-profile.json", + "--capture", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-3d-gpu-frustum.ppm" + ] + }, + { + "name": "collect-3d", + "mode": "gpu-occlusion", + "frames": 6, + "gpu_visibility_active": true, + "validation_errors": 0, + "device": "NVIDIA GeForce RTX 2080 Ti", + "capture_sha256": "7d18da12d685ed41705175fd7c65887d767668c1614b1b7669c99f05c694d435", + "profile": "collect-3d-gpu-occlusion-profile.json", + "capture": "collect-3d-gpu-occlusion.ppm", + "command": [ + "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d/faset_player", + "--headless", + "--frames", + "6", + "--visibility", + "gpu-occlusion", + "--profile", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-3d-gpu-occlusion-profile.json", + "--capture", + "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/evidence/collect-3d-gpu-occlusion.ppm" + ] + } + ] +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/report.json b/docs/validation/p2-gpu-visibility-2026-09-23/report.json new file mode 100644 index 0000000..83408c2 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/report.json @@ -0,0 +1,435 @@ +{ + "format": "faset.playable-export-verification", + "version": 1, + "started_utc": "2026-09-23T20:13:26.594779+00:00", + "platform": "linux", + "engine": "/home/emil/Desktop/.worktrees/Faset_Engine-p2", + "editor": "/home/emil/Desktop/.worktrees/Faset_Engine-p2/build/p2-release/faset_editor", + "standalone_root": "/tmp/faset-playable-exports-u_8rjufs", + "frames_per_game": 120, + "status": "passed", + "projects": [ + { + "name": "collect-2d", + "dimension": 2, + "source_inputs": [ + { + "path": ".gitignore", + "sha256": "53aa4d7124d4c8d93b8d7c4cb470b6c82b844e019a660d6243ffeadc50602de1" + }, + { + "path": "README.md", + "sha256": "8cf5a2d6de849eb090b9ea6d5e27841f551bd06947e5054f0d2f59639a90edd0" + }, + { + "path": "Scenes/main.scene.json", + "sha256": "be48a6d21385e717b6c8ebf9a3b4322eebbeff6bb067428e089ab5214be79854" + }, + { + "path": "Scripts/Gameplay.cpp", + "sha256": "6b581b24da613e1915819de0a0f0ea820dd3333efa62c4b479a9ea7ffdbc6bcc" + }, + { + "path": "Scripts/Gameplay.hpp", + "sha256": "4121587182ed4f74901b1c0757c53daadbf309af1d6bb5dd87fef142130ccbbe" + }, + { + "path": "project.faset.json", + "sha256": "36e2acd32210f5489372a2331346a3294ead2395f0713e3e5fd2da4e83263689" + } + ], + "generation": "e10bfc78-962f-45ef-a570-1237628cc7ec", + "configuration": "Release", + "standalone_directory": "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-2d", + "executable": "faset_player", + "package_file_count": 27, + "asset_generations": {}, + "device": "NVIDIA GeForce RTX 2080 Ti", + "validation_enabled": true, + "validation_errors": 0, + "completed_frames": 120, + "summary_ms": { + "gpu": { + "max": 0.581792, + "min": 0.55696, + "p50": 0.56032, + "p95": 0.571968, + "samples": 120 + }, + "render_call": { + "max": 8.92785, + "min": 1.767093, + "p50": 2.388886, + "p95": 4.916754, + "samples": 120 + }, + "renderer_cpu": { + "max": 8.922791, + "min": 1.762985, + "p50": 2.372405, + "p95": 4.910192, + "samples": 120 + }, + "renderer_readback_cpu": { + "max": 3.480115, + "min": 0.461981, + "p50": 0.631702, + "p95": 1.483368, + "samples": 120 + }, + "simulation": { + "max": 4.035202, + "min": 0.141437, + "p50": 0.213794, + "p95": 0.321327, + "samples": 120 + }, + "snapshot": { + "max": 0.740767, + "min": 0.13285, + "p50": 0.194106, + "p95": 0.407779, + "samples": 120 + }, + "wall": { + "max": 9.833829, + "min": 2.085394, + "p50": 2.880784, + "p95": 5.96917, + "samples": 120 + } + }, + "capture": { + "width": 1280, + "height": 720, + "sampled_colors": 7, + "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a" + }, + "source_project_paths_unavailable": true, + "status": "passed" + }, + { + "name": "collect-3d", + "dimension": 3, + "source_inputs": [ + { + "path": ".gitignore", + "sha256": "53aa4d7124d4c8d93b8d7c4cb470b6c82b844e019a660d6243ffeadc50602de1" + }, + { + "path": "Assets/exit-arch/create.py", + "sha256": "9c7291124fb1498a3f992ef74afc39cd98f9cc3e2ff4687c633bece85d580905" + }, + { + "path": "Assets/exit-arch/manifest.json", + "sha256": "7a13347adc89761fb02ebeab3c58ba87f319cd62f53ec87a3bb61bcd066ffa55" + }, + { + "path": "Assets/exit-arch/manifest.json.faset-import.json", + "sha256": "ef4eef28a18a0cc40a40df75db34c97faa5d783b891265f862633f3aec514afc" + }, + { + "path": "Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb", + "sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3" + }, + { + "path": "Assets/exit-arch/source.blend", + "sha256": "ff2676bec97ab778e531e87a185ad716049ea3b05b4a4f0027a6345737735035" + }, + { + "path": "README.md", + "sha256": "2df5ca4df47ab5d3d05d41508201296d4ad5ec876245f19f061767ade6a30e8f" + }, + { + "path": "Scenes/main.scene.json", + "sha256": "61b65baf79e52f07ac386a7f98acf985a1b09e88770cdde37ef461dc94b9dcd7" + }, + { + "path": "Scripts/Extensions/Beacon.hpp", + "sha256": "c60d56161eead16f541835053ad32ac3333383d83015709c060b7d45e0af5a97" + }, + { + "path": "Scripts/Gameplay.cpp", + "sha256": "5d419786a6861d7f14ed4eca54634694d8cd43be5dbbd60a2c6790db665c3a6a" + }, + { + "path": "Scripts/Gameplay.hpp", + "sha256": "4121587182ed4f74901b1c0757c53daadbf309af1d6bb5dd87fef142130ccbbe" + }, + { + "path": "project.faset.json", + "sha256": "43d273b1054ec9069369073f54cc1fc7efb3d6b699dcd342c552a2dc2ef852ef" + } + ], + "import": { + "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91", + "cache_hit": false, + "diagnostics": [], + "generation": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2", + "manifest": { + "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91", + "files": [ + { + "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh", + "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97", + "size": 928 + }, + { + "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh", + "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97", + "size": 928 + }, + { + "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh", + "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071", + "size": 928 + } + ], + "generation": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2", + "importer": "faset-gltf-1/cgltf-1.15", + "input_key": { + "bundle_sha256": "7a13347adc89761fb02ebeab3c58ba87f319cd62f53ec87a3bb61bcd066ffa55", + "dependencies": {}, + "importer": "faset-gltf-1/cgltf-1.15", + "settings": {}, + "source": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3", + "target_profile": "desktop-static-pbr-v1", + "toolchain": { + "cgltf": "360db1a95480fe102ae9c69b27c5d101167ff5ba", + "stb": "2c980bb59875b0d32144a71867fbdebb2f77cd20" + } + }, + "kind": "scene", + "materials": [ + { + "alpha_cutoff": 0.5, + "alpha_mode": "OPAQUE", + "base_color": [ + 0.2199999988079071, + 0.28999999165534973, + 0.3400000035762787, + 1.0 + ], + "base_color_texture": -1, + "double_sided": true, + "emissive": [ + 0.0, + 0.0, + 0.0 + ], + "emissive_texture": -1, + "format": "faset.material", + "id": "material-bb63b094febbf90bb7049c9bcf7587bc", + "metallic": 0.07999999821186066, + "metallic_roughness_texture": -1, + "name": "Weathered stone", + "normal_texture": -1, + "occlusion_texture": -1, + "roughness": 0.800000011920929, + "unlit": false, + "version": 1 + } + ], + "meshes": [ + { + "id": "mesh-fc069a07a87e0f831fd92efdbc4efa1f", + "name": "Cube.001", + "primitives": [ + { + "material": 0, + "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh" + } + ] + }, + { + "id": "mesh-0961e2a3f92977836a3aa80cab09277e", + "name": "Cube.002", + "primitives": [ + { + "material": 0, + "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh" + } + ] + }, + { + "id": "mesh-93b5b3e52cb6bb120fefb80e2d8e222b", + "name": "Cube.003", + "primitives": [ + { + "material": 0, + "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh" + } + ] + } + ], + "nodes": [ + { + "id": "node-cec6e8cea80cf5a98ba3263a0156bee4", + "local_transform": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.4500000476837158, + 1.2999999523162842, + 1.0 + ], + "mesh": 0, + "name": "Left post", + "parent_id": "", + "stable_source_id": true + }, + { + "id": "node-5f8a90a6c4d27020d20bd4fa81d1d958", + "local_transform": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.4500000476837158, + -1.2999999523162842, + 1.0 + ], + "mesh": 1, + "name": "Right post", + "parent_id": "", + "stable_source_id": true + }, + { + "id": "node-482463e486a8d1fd741340c653cd128f", + "local_transform": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 3.0, + 0.0, + 1.0 + ], + "mesh": 2, + "name": "Lintel", + "parent_id": "", + "stable_source_id": true + } + ], + "outputs": [ + "node-cec6e8cea80cf5a98ba3263a0156bee4", + "node-5f8a90a6c4d27020d20bd4fa81d1d958", + "node-482463e486a8d1fd741340c653cd128f", + "mesh-fc069a07a87e0f831fd92efdbc4efa1f", + "mesh-0961e2a3f92977836a3aa80cab09277e", + "mesh-93b5b3e52cb6bb120fefb80e2d8e222b", + "material-bb63b094febbf90bb7049c9bcf7587bc" + ], + "payload_source": "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/Faset Café 世界/collect-3d/Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb", + "schema_version": 1, + "settings": {}, + "source": "/home/emil/Desktop/.worktrees/Faset_Engine-p2/.cache/p2-playable-exports-retry/Faset Café 世界/collect-3d/Assets/exit-arch/manifest.json", + "source_sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3", + "textures": [] + }, + "previous_generation": "", + "removed_output_ids": [] + }, + "generation": "013fe953-8787-45ac-963f-ffbd9ac5f636", + "configuration": "Release", + "standalone_directory": "/tmp/faset-playable-exports-u_8rjufs/Faset Café 世界/collect-3d", + "executable": "faset_player", + "package_file_count": 32, + "asset_generations": { + "5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2" + }, + "device": "NVIDIA GeForce RTX 2080 Ti", + "validation_enabled": true, + "validation_errors": 0, + "completed_frames": 120, + "summary_ms": { + "gpu": { + "max": 0.603104, + "min": 0.57088, + "p50": 0.57456, + "p95": 0.587488, + "samples": 120 + }, + "render_call": { + "max": 15.27347, + "min": 1.95597, + "p50": 2.713318, + "p95": 8.219264, + "samples": 120 + }, + "renderer_cpu": { + "max": 15.265616, + "min": 1.95115, + "p50": 2.705423, + "p95": 8.212883, + "samples": 120 + }, + "renderer_readback_cpu": { + "max": 5.034867, + "min": 0.493391, + "p50": 0.680484, + "p95": 2.359841, + "samples": 120 + }, + "simulation": { + "max": 9.318287, + "min": 0.205918, + "p50": 0.288985, + "p95": 1.079266, + "samples": 120 + }, + "snapshot": { + "max": 2.595406, + "min": 0.178897, + "p50": 0.267054, + "p95": 0.536412, + "samples": 120 + }, + "wall": { + "max": 15.872521, + "min": 2.389648, + "p50": 3.497057, + "p95": 9.960939, + "samples": 120 + } + }, + "capture": { + "width": 1280, + "height": 720, + "sampled_colors": 42, + "sha256": "914060401de93d08b33bf09a1e210859e491a0060c331e5e2044f517356f4980" + }, + "source_project_paths_unavailable": true, + "status": "passed" + } + ], + "finished_utc": "2026-09-23T20:19:17.315585+00:00" +} diff --git a/docs/validation/p2-gpu-visibility-2026-09-23/shader-validation.txt b/docs/validation/p2-gpu-visibility-2026-09-23/shader-validation.txt new file mode 100644 index 0000000..b92d255 --- /dev/null +++ b/docs/validation/p2-gpu-visibility-2026-09-23/shader-validation.txt @@ -0,0 +1,10 @@ +spirv-val --target-env vulkan1.3 (Release bundle) +compatibility.spv sha256=83d519113c99c7b14cf92bc6e0e9867edd91da1f370f964df6ba978d51470a54 exit=0 +fragmentMain.spv sha256=f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505 exit=0 +gpuCullMain.spv sha256=7691360ec55f41d40d43652f506b051cef8b3a3ddcdcc7db61a7d4d97f9e87d8 exit=0 +gpuHzbMain.spv sha256=08682362ee2120ed19d260e613285071747c3e436bb09bb6238e46f9cedc2308 exit=0 +gpuPostCullMain.spv sha256=62cb72e356346e1511c6d640a3cecb4a6e5283795338299b357edae5f7f52be4 exit=0 +gpuShadowMain.spv sha256=9078577943bf9c51220d5341434834eb4a28cf0f0f6203bad2b96e1b0e11b360 exit=0 +gpuVertexMain.spv sha256=041c1e5f0db4007c51e01ed5db6e0fbf4db09b8dcbcb085c0c73612cdc682fe3 exit=0 +shadowMain.spv sha256=7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8 exit=0 +vertexMain.spv sha256=1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898 exit=0