Skip to content

perf(agc): keep draw snapshots in resizable BAR memory - #9712

Open
panicDa3m0n wants to merge 10 commits into
boykopovar:mainfrom
panicDa3m0n:topic/bar-snapshots
Open

panicDa3m0n wants to merge 10 commits into
boykopovar:mainfrom
panicDa3m0n:topic/bar-snapshots

Conversation

@panicDa3m0n

@panicDa3m0n panicDa3m0n commented Oct 22, 2026 •

Copy link
Copy Markdown

What

Summary. Draw snapshots of read-only storage buffers and vertex copies go to resizable BAR memory when the device exposes one, and stay in host memory otherwise or with APS5_NO_BAR_SNAPSHOTS=1; index copies stay in host memory. On an RTX 4070 Ti SUPER at Astro Bot's Crash Site, three alternating rounds against main 8499ea5 give a frame p50 of 152.8-160.3 ms instead of 174.5-174.6 ms, and GPU time per present of 91.6-96.4 ms instead of about 152 ms. New tests cover the memory choice, the index copies and the mapped-buffer fallbacks, and each fails on a deliberate mistake.

Draw snapshots of read-only storage buffers and the vertex copies of draws now live in device-local host-visible memory when the device exposes a resizable BAR over its device-local heap (a host-visible device-local type on a heap of at least 4 GiB), and in host memory otherwise. The CPU still fills them with memcpy, but the GPU reads them from VRAM instead of over PCIe. Index copies stay in host memory: the CPU scans them for the highest index and the mesh restart table, and those scans read the same copy the draw binds.

The CPU never reads BAR memory back on the draw path: refreshing a stale snapshot rewrites its changed blocks without comparing them. APS5_NO_BAR_SNAPSHOTS=1 keeps the snapshots and vertex copies in host memory as before.

A mapped device-local Buffer takes host memory in three cases:

  • when none of the types in its memoryTypeBits is mapped device-local, since Vulkan reports the supported types per resource and they may exclude the BAR type the device lists;
  • when the reported budget of the device-local heap has no room for it, as DeviceMemoryType places device buffers;
  • when its allocation, or that of its slab block, is still refused after the pool trim and the cache reclaim, as device buffers and images do through RefusedDeviceMemoryFallback.

Properties() then reports host memory, so refreshing such a snapshot compares its blocks again. The kept snapshots stay within the existing budgets: 1 GiB for storage snapshots and 1 GiB for draw inputs.

Why: on an RTX 4070 Ti SUPER (driver 616.64, PCIe 4.0 x16) shaders read host memory at 6-8 GB/s sequentially and 1.4 GB/s scattered, against 650 and 92 GB/s from VRAM.

Tests:

  • snapshotMemoryTests in tests/Graphics.cpp checks the choice of memory:
    • a BAR over the whole device heap is taken;
    • the switch keeps host memory;
    • a 256 MiB BAR window is not taken;
    • a device without host-visible device memory keeps host snapshots.
  • agc_draw_input_memory copies indices, stores to the guest source, and checks that the copy is in host memory and keeps its highest index.
  • MappedDevicePlacement in tests/BufferPool.cpp places a mapped device-local buffer and a slab within the budget, over it, after a refused allocation, and with the BAR type excluded from their memoryTypeBits, with and without VK_EXT_memory_budget.

Related:

Tested

Windows 11 (10.0.26200), NVIDIA GeForce RTX 4070 Ti SUPER (driver 616.64, PCIe 4.0 x16), i7-11700K, 32 GB; Astro Bot (PPSA21567, 01.019.000) at Crash Site with its default settings, 3840x2160. main below is 8499ea5, the base of this PR.

  • Each new check fails when the code it covers is changed, and passes on the head:
    • snapshotMemoryTests, without the heap-size check of SnapshotMemoryProperties: a 256 MiB BAR window was taken. This ran on b5b8d4e, which has the same check and test.
    • agc_draw_input_memory, with index copies in snapshot memory: an index copy left host memory, so its highest index would be scanned from the guest instead of the copy.
    • agc_buffer_pool (MappedDevicePlacement):
      • without the budget placement: a mapped device-local buffer over the device-local budget was not placed in host memory;
      • without the refused-memory fallback of Buffer: the refused allocation throws (vkAllocateMemory buffer ... Vulkan result -2);
      • without the fallback of its slabs: the refused slab block throws (vkAllocateMemory buffer slab ... Vulkan result -2);
      • with the budget check given the slab's size instead of its block's: a mapped device-local slab whose block exceeds the device-local budget was not placed in host memory;
      • with the memory type check moved back after the early return taken without VK_EXT_memory_budget: the buffer whose mask excludes the BAR type throws (AGC graphics: required Vulkan memory type is unavailable);
      • with the throwing MemoryType lookup in place of the mask check: the same throw with the budget extension.
  • ctest -R ^agc_ on this PR's head (895 tests): all pass except four, and three skip on this device (sparse host import, dma-buf import, stencil reference export).
    • agc_driver_sample_order, agc_driver_sample_order_grid_reference and agc_driver_sample_order_recipe_depth_locations fail the same way on main's build at 3ca07d0 on this machine ("the slopes did not leave depth both at and below the clear value").
    • agc_compute_pipeline_capture_optional_byte_cap timed out in the parallel run: it writes 256 MiB to this machine's slow temporary folder.
  • Khronos validation layer 1.4.363.0, with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1 and ctest -V:
    • The tests are the draw, vertex, index and snapshot tests (agc_driver_draw_*, agc_driver_vertex_*, agc_driver_rect_list_*, agc_driver_mesh_index_cache, agc_driver_graphics, agc_driver_zero_stride_vertex_fetch), plus agc_draw_input_memory on the head.
    • They ran on main's build at 8499ea5 (26 tests), on this PR's head (27) and on the head with APS5_NO_BAR_SNAPSHOTS=1 (27).
    • In all three runs every test passes, and no log has a VUID- error or a was not found but was requested by env var VK_INSTANCE_LAYERS line.
    • Each log has the same 10 warnings: 9 Undefined-Value-ShaderOutputNotConsumed-DynamicRendering and 1 Undefined-Value-ShaderOutputNotConsumed.
  • Performance, captured as the Performance report form describes:
    • Capture. Each run uses APS5_TRACE_SECONDS=150:5 and no other APS5_TRACE_* or APS5_PROFILE_* switch, with warm shader caches. Builds alternate main and this PR in one session.
    • Log. Every run's stdout and stderr went to files through the launcher (Start-Process -RedirectStandardOutput), the same for all runs.
    • Import budget. Both sides ran with APS5_HOST_IMPORT_MIB=13312. On this 32 GB machine the default host import budget is 8149 MiB, below what Crash Site's largest heaps need, so they fall back to copies. fix(agc): keep half the host heap out of the host import budget #6472 set that budget; fix(agc): keep at most 4 GiB of the host heap from the host import budget #7844 changes it.
    • Windows. The windows are time-based because the number of presents before Crash Site varies between runs. For the same reason performance_compare.py lists window.first_present as the only configuration difference. The absolute times include the trace's own cost.

Over the three rounds, frame p50 goes from 174.5-174.6 ms on main to 152.8-160.3 ms with this PR (−19.2, −14.3 and −21.7 ms per round), and GPU busy time per present from 152.0-152.6 ms to 91.6-96.4 ms. Index copies in host memory account for about 12-15 ms of GPU time per present against the first version of this PR, which kept them in BAR memory (83.5-88.1 ms against 98.3-99.7 ms, both on d6eafa5).

Run Build Commit Frame p50 / p90 / p99 (ms) GPU busy per present (ms) Busiest queue workers (%)
1 main 8499ea52e 174.5 / 183.4 / 189.2 152.2 99, 98, 94
2 this PR b8663c514 155.3 / 164.0 / 165.2 96.2 99, 98, 94
3 main 8499ea52e 174.6 / 182.9 / 185.6 152.6 99, 98, 94
4 this PR b8663c514 160.3 / 167.4 / 172.9 91.6 99, 98, 95
5 main 8499ea52e 174.5 / 183.5 / 184.9 152.0 99, 97, 94
6 this PR b8663c514 152.8 / 161.1 / 166.5 96.4 99, 98, 94

Summary lines, in run order:

{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2938,"ms":5090.897},"presents":29,"frame_ms":{"p50":174.458,"p90":183.441,"p99":189.159,"max":189.159},"gpu_busy_ms_per_present":152.250,"worker_busy_pct":{"queue worker 0x0":98.786,"queue worker 0x40":97.544,"queue worker 0x48":94.148,"queue worker 0x46":10.122},"top_phases_ms_per_frame":{"Driver.Packet":527.312,"Driver.Packet.memory_wait":302.260,"Driver.Packet.draw":91.258,"Driver.Draw":90.090,"Graphics.Draw":83.514,"Graphics.Draw.draw_and_resource_release":66.774,"Driver.Packet.prepare_memory":60.030,"Driver.Draw.shader_compile_and_link":55.787},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-25288.json.gz"}
{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2753,"ms":5110.320},"presents":33,"frame_ms":{"p50":155.333,"p90":164.003,"p99":165.208,"max":165.208},"gpu_busy_ms_per_present":96.173,"worker_busy_pct":{"queue worker 0x0":98.684,"queue worker 0x40":97.781,"queue worker 0x48":94.318,"queue worker 0x46":11.173},"top_phases_ms_per_frame":{"Driver.Packet":467.172,"Driver.Packet.memory_wait":275.849,"Driver.Packet.draw":87.205,"Graphics.Draw":86.542,"Driver.Draw":86.075,"Graphics.Draw.draw_and_resource_release":69.994,"Driver.Draw.shader_compile_and_link":52.713,"Driver.Packet.dispatch":43.352},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-26736.json.gz"}
{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2660,"ms":5017.386},"presents":29,"frame_ms":{"p50":174.619,"p90":182.895,"p99":185.561,"max":185.561},"gpu_busy_ms_per_present":152.577,"worker_busy_pct":{"queue worker 0x0":98.804,"queue worker 0x40":97.803,"queue worker 0x48":93.909,"queue worker 0x46":9.464},"top_phases_ms_per_frame":{"Driver.Packet":518.590,"Driver.Packet.memory_wait":298.946,"Driver.Packet.draw":86.549,"Driver.Draw":85.458,"Graphics.Draw":81.895,"Driver.Packet.prepare_memory":65.500,"Graphics.Draw.draw_and_resource_release":65.075,"Driver.Draw.shader_compile_and_link":52.003},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-12684.json.gz"}
{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":4310,"ms":5118.256},"presents":32,"frame_ms":{"p50":160.333,"p90":167.439,"p99":172.874,"max":172.874},"gpu_busy_ms_per_present":91.612,"worker_busy_pct":{"queue worker 0x0":98.652,"queue worker 0x40":97.934,"queue worker 0x48":94.517,"queue worker 0x46":9.894},"top_phases_ms_per_frame":{"Driver.Packet":481.041,"Driver.Packet.memory_wait":286.595,"Driver.Packet.draw":92.170,"Graphics.Draw":91.690,"Driver.Draw":90.991,"Graphics.Draw.draw_and_resource_release":75.211,"Driver.Draw.shader_compile_and_link":55.081,"Shader.DrawStage":44.516},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-3760.json.gz"}
{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2658,"ms":5045.459},"presents":29,"frame_ms":{"p50":174.497,"p90":183.493,"p99":184.907,"max":184.907},"gpu_busy_ms_per_present":151.991,"worker_busy_pct":{"queue worker 0x0":98.787,"queue worker 0x40":97.445,"queue worker 0x48":94.411,"queue worker 0x46":9.031},"top_phases_ms_per_frame":{"Driver.Packet":520.917,"Driver.Packet.memory_wait":298.770,"Driver.Packet.draw":91.749,"Driver.Draw":90.597,"Graphics.Draw":83.471,"Graphics.Draw.draw_and_resource_release":66.106,"Driver.Packet.prepare_memory":55.606,"Driver.Draw.shader_compile_and_link":53.222},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-25028.json.gz"}
{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2779,"ms":5089.771},"presents":33,"frame_ms":{"p50":152.754,"p90":161.061,"p99":166.455,"max":166.455},"gpu_busy_ms_per_present":96.415,"worker_busy_pct":{"queue worker 0x0":98.647,"queue worker 0x40":97.920,"queue worker 0x48":94.465,"queue worker 0x46":11.271},"top_phases_ms_per_frame":{"Driver.Packet":465.854,"Driver.Packet.memory_wait":274.814,"Driver.Packet.draw":87.031,"Graphics.Draw":86.515,"Driver.Draw":85.879,"Graphics.Draw.draw_and_resource_release":70.117,"Driver.Draw.shader_compile_and_link":51.299,"Driver.Packet.dispatch":43.309},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-27560.json.gz"}
performance_compare.py, round 1

Performance comparison

Capture Commit Trace Presents Window (ms)
baseline 8499ea5 aps5-trace-8499ea52e571-25288.json.gz 29 5090.897
candidate b8663c5 aps5-trace-b8663c514ef5-26736.json.gz 33 5110.320
  • Compare captures from the same machine, title, content version and scene; matching recorded metadata cannot verify the physical machine or scene.
  • Changes are candidate minus baseline. A negative frame-time change means a shorter frame interval.
  • A missing top phase is unreported, not zero; its change is unavailable.
  • Recorded configuration differs; these measurements do not isolate the code change.

Configuration differences

Setting Baseline Candidate
window.first_present 2938 2753

Frame and GPU times (ms)

Metric Baseline Candidate Change Change (%)
frame_ms.p50 174.458 155.333 -19.125 -10.963
frame_ms.p90 183.441 164.003 -19.438 -10.596
frame_ms.p99 189.159 165.208 -23.951 -12.662
frame_ms.max 189.159 165.208 -23.951 -12.662
mean_frame_ms 175.548 154.858 -20.690 -11.786
gpu_busy_ms_per_present 152.250 96.173 -56.077 -36.832

Top phases (ms per frame)

Metric Baseline Candidate Change Change (%)
Driver.Draw 90.090 86.075 -4.015 -4.457
Driver.Draw.shader_compile_and_link 55.787 52.713 -3.074 -5.510
Driver.Packet 527.312 467.172 -60.140 -11.405
Driver.Packet.dispatch n/a 43.352 n/a n/a
Driver.Packet.draw 91.258 87.205 -4.053 -4.441
Driver.Packet.memory_wait 302.260 275.849 -26.411 -8.738
Driver.Packet.prepare_memory 60.030 n/a n/a n/a
Graphics.Draw 83.514 86.542 +3.028 +3.626
Graphics.Draw.draw_and_resource_release 66.774 69.994 +3.220 +4.822
performance_compare.py, round 2

Performance comparison

Capture Commit Trace Presents Window (ms)
baseline 8499ea5 aps5-trace-8499ea52e571-12684.json.gz 29 5017.386
candidate b8663c5 aps5-trace-b8663c514ef5-3760.json.gz 32 5118.256
  • Compare captures from the same machine, title, content version and scene; matching recorded metadata cannot verify the physical machine or scene.
  • Changes are candidate minus baseline. A negative frame-time change means a shorter frame interval.
  • A missing top phase is unreported, not zero; its change is unavailable.
  • Recorded configuration differs; these measurements do not isolate the code change.

Configuration differences

Setting Baseline Candidate
window.first_present 2660 4310

Frame and GPU times (ms)

Metric Baseline Candidate Change Change (%)
frame_ms.p50 174.619 160.333 -14.286 -8.181
frame_ms.p90 182.895 167.439 -15.456 -8.451
frame_ms.p99 185.561 172.874 -12.687 -6.837
frame_ms.max 185.561 172.874 -12.687 -6.837
mean_frame_ms 173.013 159.946 -13.068 -7.553
gpu_busy_ms_per_present 152.577 91.612 -60.965 -39.957

Top phases (ms per frame)

Metric Baseline Candidate Change Change (%)
Driver.Draw 85.458 90.991 +5.533 +6.475
Driver.Draw.shader_compile_and_link 52.003 55.081 +3.078 +5.919
Driver.Packet 518.590 481.041 -37.549 -7.241
Driver.Packet.draw 86.549 92.170 +5.621 +6.495
Driver.Packet.memory_wait 298.946 286.595 -12.351 -4.132
Driver.Packet.prepare_memory 65.500 n/a n/a n/a
Graphics.Draw 81.895 91.690 +9.795 +11.960
Graphics.Draw.draw_and_resource_release 65.075 75.211 +10.136 +15.576
Shader.DrawStage n/a 44.516 n/a n/a
performance_compare.py, round 3

Performance comparison

Capture Commit Trace Presents Window (ms)
baseline 8499ea5 aps5-trace-8499ea52e571-25028.json.gz 29 5045.459
candidate b8663c5 aps5-trace-b8663c514ef5-27560.json.gz 33 5089.771
  • Compare captures from the same machine, title, content version and scene; matching recorded metadata cannot verify the physical machine or scene.
  • Changes are candidate minus baseline. A negative frame-time change means a shorter frame interval.
  • A missing top phase is unreported, not zero; its change is unavailable.
  • Recorded configuration differs; these measurements do not isolate the code change.

Configuration differences

Setting Baseline Candidate
window.first_present 2658 2779

Frame and GPU times (ms)

Metric Baseline Candidate Change Change (%)
frame_ms.p50 174.497 152.754 -21.743 -12.460
frame_ms.p90 183.493 161.061 -22.432 -12.225
frame_ms.p99 184.907 166.455 -18.452 -9.979
frame_ms.max 184.907 166.455 -18.452 -9.979
mean_frame_ms 173.981 154.235 -19.746 -11.349
gpu_busy_ms_per_present 151.991 96.415 -55.576 -36.565

Top phases (ms per frame)

Metric Baseline Candidate Change Change (%)
Driver.Draw 90.597 85.879 -4.718 -5.208
Driver.Draw.shader_compile_and_link 53.222 51.299 -1.923 -3.613
Driver.Packet 520.917 465.854 -55.063 -10.570
Driver.Packet.dispatch n/a 43.309 n/a n/a
Driver.Packet.draw 91.749 87.031 -4.718 -5.142
Driver.Packet.memory_wait 298.770 274.814 -23.956 -8.018
Driver.Packet.prepare_memory 55.606 n/a n/a n/a
Graphics.Draw 83.471 86.515 +3.044 +3.647
Graphics.Draw.draw_and_resource_release 66.106 70.117 +4.011 +6.068
trace_digest.py, run 1 (main)

seconds 150:5 from present 2938: 29 presents, frame p50 174.5 / p90 183.4 / p99 189.2 / max 189.2 ms, GPU busy 152.2 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit 8499ea5, dropped: no

{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2938,"ms":5090.897},"presents":29,"frame_ms":{"p50":174.458,"p90":183.441,"p99":189.159,"max":189.159},"gpu_busy_ms_per_present":152.25,"worker_busy_pct":{"queue worker 0x0":98.786,"queue worker 0x40":97.544,"queue worker 0x48":94.148,"queue worker 0x46":10.122},"top_phases_ms_per_frame":{"Driver.Packet":527.312,"Driver.Packet.memory_wait":302.26,"Driver.Packet.draw":91.258,"Driver.Draw":90.09,"Graphics.Draw":83.514,"Graphics.Draw.draw_and_resource_release":66.774,"Driver.Packet.prepare_memory":60.03,"Driver.Draw.shader_compile_and_link":55.787},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-25288.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2959: 189.2 ms at 3678 ms: Driver.Packet (queue worker 0x40) 188.4, Driver.Packet (queue worker 0x48) 185.5, Driver.Packet.memory_wait (queue worker 0x48) 185.0, Driver.Packet (queue worker 0x0) 167.1
  • present 2963: 189.1 ms at 4378 ms: Driver.Packet (queue worker 0x40) 188.6, Driver.Packet (queue worker 0x48) 185.2, Driver.Packet.memory_wait (queue worker 0x48) 184.7, Driver.Packet (queue worker 0x0) 167.7
  • present 2945: 183.4 ms at 1238 ms: Driver.Packet (queue worker 0x40) 183.0, Driver.Packet (queue worker 0x48) 179.1, Driver.Packet.memory_wait (queue worker 0x48) 178.7, Driver.WorkerWait (queue worker 0x46) 177.8
  • present 2951: 183.0 ms at 2268 ms: Driver.Packet (queue worker 0x40) 182.6, Driver.Packet (queue worker 0x48) 176.9, Driver.Packet.memory_wait (queue worker 0x48) 176.4, Driver.WorkerWait (queue worker 0x46) 161.7
  • present 2941: 182.9 ms at 537 ms: Driver.Packet (queue worker 0x40) 182.4, Driver.Packet (queue worker 0x48) 178.8, Driver.Packet.memory_wait (queue worker 0x48) 178.3, Driver.Packet (queue worker 0x0) 161.5

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 134.8 (77 %) 18.8 (11 %) 22.0 123.5 Driver.Packet 153.4, Driver.EndSubmission 0.0
title 0.3 (0 %) 0.0 (0 %) 175.2 0.1 Shader.ResolveGraphicsStagesAbi 0.3, Shader.ResolveAbi 0.1
title 1.2 (1 %) 0.0 (0 %) 174.4 0.9 Shader.ResolveGraphicsStagesAbi 1.2, Shader.ResolveAbi 0.0
title 0.8 (0 %) 0.0 (0 %) 174.7 0.3 Shader.ResolveGraphicsStagesAbi 0.7, Shader.ResolveAbi 0.1
title 0.8 (0 %) 0.0 (0 %) 174.7 0.9 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.1
queue worker 0x40 13.8 (8 %) 157.1 (90 %) 4.7 2.1 Driver.Packet 170.8, Driver.EndSubmission 0.1
queue worker 0x48 0.5 (0 %) 168.9 (96 %) 6.2 0.2 Driver.Packet 165.1, Driver.EndSubmission 0.1
draw committer 74.2 (42 %) 7.1 (4 %) 94.2 37.1 Graphics.Draw 70.1, Recorder.Submit 3.4
presenter 1.1 (1 %) 1.8 (1 %) 172.7 0.0 VideoOut.Flip 2.8, Driver.Present 0.1
queue worker 0x46 0.8 (0 %) 169.3 (96 %) 5.4 0.8 Driver.Packet 17.5, Driver.EndSubmission 0.1
title 0.9 (0 %) 0.0 (0 %) 174.7 0.3 Shader.ResolveGraphicsStagesAbi 0.9
gpu 152.1 (87 %) 0.0 (0 %) 23.4 0.0 batch 152.1

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 506.8, Driver.Packet.memory_wait 302.3, Driver.WorkerWait 156.6, batch 152.1, Driver.WorkerWait.dequeue_order 144.8, Driver.Packet.draw 78.7, Driver.Draw 77.5, Graphics.Draw 70.5, Driver.Packet.prepare_memory 58.7, Graphics.Draw.draw_and_resource_release 56.9

Longest waits

  • Driver.WorkerWait (queue worker 0x46) 284.1 ms at 4042 ms, present 2961
  • Driver.WorkerWait (queue worker 0x46) 282.2 ms at 1244 ms, present 2945
  • Driver.WorkerWait (queue worker 0x46) 210.3 ms at 3826 ms, present 2959
  • Driver.WorkerWait (queue worker 0x46) 202.4 ms at 1037 ms, present 2943
  • Driver.Packet.memory_wait (queue worker 0x48) 185.7 ms at 3685 ms, present 2959
  • Driver.WorkerWait (queue worker 0x46) 184.7 ms at 2205 ms, present 2950
  • Driver.Packet.memory_wait (queue worker 0x48) 184.3 ms at 4385 ms, present 2963
  • Driver.WorkerWait (queue worker 0x46) 182.7 ms at 2564 ms, present 2952
  • Driver.Packet.memory_wait (queue worker 0x48) 178.7 ms at 544 ms, present 2941
  • Driver.Packet.memory_wait (queue worker 0x48) 178.4 ms at 1246 ms, present 2945

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 10: 20.3 ms at 17 ms, present 2938: GPU no ranges; recorded by Graphics.Draw (draw committer) 5.2, Graphics.Draw.draw_and_resource_release (draw committer) 4.5, Recorder.Submit (draw committer) 0.1, Graphics.Draw.validate (draw committer) 0.0
  • batch 1758: 20.3 ms at 2131 ms, present 2950: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.2, Graphics.Draw.draw_and_resource_release (draw committer) 3.6, Graphics.Draw.validate (draw committer) 0.1, Recorder.Submit (draw committer) 0.1
  • batch 880: 20.0 ms at 1091 ms, present 2944: GPU no ranges; recorded by Graphics.Draw (draw committer) 6.1, Graphics.Draw.draw_and_resource_release (draw committer) 5.4, Graphics.Draw.validate (draw committer) 0.1, Recorder.Submit (draw committer) 0.1
  • batch 1630: 19.9 ms at 1965 ms, present 2949: GPU no ranges; recorded by Graphics.Draw (draw committer) 3.6, Graphics.Draw.draw_and_resource_release (draw committer) 3.0, Recorder.Submit (draw committer) 0.0
  • batch 2031: 19.9 ms at 2495 ms, present 2952: GPU no ranges; recorded by Graphics.Draw (draw committer) 3.5, Graphics.Draw.draw_and_resource_release (draw committer) 3.0, Recorder.Submit (draw committer) 0.0
trace_digest.py, run 2 (this PR)

seconds 150:5 from present 2753: 33 presents, frame p50 155.3 / p90 164.0 / p99 165.2 / max 165.2 ms, GPU busy 96.2 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit b8663c5, dropped: no

{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2753,"ms":5110.32},"presents":33,"frame_ms":{"p50":155.333,"p90":164.003,"p99":165.208,"max":165.208},"gpu_busy_ms_per_present":96.173,"worker_busy_pct":{"queue worker 0x0":98.684,"queue worker 0x40":97.781,"queue worker 0x48":94.318,"queue worker 0x46":11.173},"top_phases_ms_per_frame":{"Driver.Packet":467.172,"Driver.Packet.memory_wait":275.849,"Driver.Packet.draw":87.205,"Graphics.Draw":86.542,"Driver.Draw":86.075,"Graphics.Draw.draw_and_resource_release":69.994,"Driver.Draw.shader_compile_and_link":52.713,"Driver.Packet.dispatch":43.352},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-26736.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2756: 165.2 ms at 481 ms: Driver.Packet (queue worker 0x40) 164.7, Driver.Packet (queue worker 0x48) 161.9, Driver.Packet.memory_wait (queue worker 0x48) 161.5, Driver.Packet.memory_wait (queue worker 0x40) 145.9
  • present 2769: 164.6 ms at 2500 ms: Driver.Packet (queue worker 0x40) 164.0, Driver.Packet (queue worker 0x48) 160.2, Driver.Packet.memory_wait (queue worker 0x48) 159.8, Driver.WorkerWait (queue worker 0x46) 145.9
  • present 2783: 164.3 ms at 4627 ms: Driver.Packet (queue worker 0x40) 163.9, Driver.Packet (queue worker 0x48) 161.0, Driver.Packet.memory_wait (queue worker 0x48) 160.5, Driver.WorkerWait (queue worker 0x46) 145.7
  • present 2768: 164.0 ms at 2336 ms: Driver.Packet (queue worker 0x40) 163.6, Driver.Packet (queue worker 0x48) 159.2, Driver.Packet.memory_wait (queue worker 0x48) 158.7, Driver.WorkerWait (queue worker 0x46) 144.8
  • present 2771: 163.4 ms at 2818 ms: Driver.Packet (queue worker 0x40) 162.9, Driver.Packet (queue worker 0x48) 159.2, Driver.Packet.memory_wait (queue worker 0x48) 158.6, Driver.Packet.memory_wait (queue worker 0x40) 145.1

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 127.2 (82 %) 5.9 (4 %) 21.8 126.1 Driver.Packet 132.9, Driver.EndSubmission 0.1
title 0.3 (0 %) 0.0 (0 %) 154.5 0.1 Shader.ResolveGraphicsStagesAbi 0.3, Shader.ResolveAbi 0.1
title 1.0 (1 %) 0.0 (0 %) 153.8 0.9 Shader.ResolveGraphicsStagesAbi 1.0, Shader.ResolveAbi 0.0
title 0.8 (1 %) 0.0 (0 %) 154.1 0.3 Shader.ResolveGraphicsStagesAbi 0.7, Shader.ResolveAbi 0.1
title 0.8 (1 %) 0.0 (0 %) 154.1 0.8 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.1
queue worker 0x40 10.5 (7 %) 140.6 (91 %) 3.7 2.0 Driver.Packet 151.0, Driver.EndSubmission 0.1
queue worker 0x48 0.5 (0 %) 149.6 (97 %) 4.8 0.2 Driver.Packet 145.9, Driver.EndSubmission 0.1
draw committer 77.2 (50 %) 5.8 (4 %) 71.9 37.7 Graphics.Draw 73.0, Recorder.Submit 3.5
presenter 1.1 (1 %) 1.9 (1 %) 151.9 0.0 VideoOut.Flip 2.8, Driver.Present 0.1
queue worker 0x46 0.8 (0 %) 149.7 (97 %) 4.4 0.8 Driver.Packet 17.1, Driver.EndSubmission 0.0
title 0.7 (0 %) 0.0 (0 %) 154.1 0.3 Shader.ResolveGraphicsStagesAbi 0.7
gpu 96.2 (62 %) 0.0 (0 %) 58.6 0.0 batch 96.2

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 446.9, Driver.Packet.memory_wait 275.8, Driver.WorkerWait 137.4, Driver.WorkerWait.dequeue_order 128.4, batch 96.2, Driver.Packet.draw 74.6, Graphics.Draw 73.5, Driver.Draw 73.4, Graphics.Draw.draw_and_resource_release 59.9, Driver.Packet.dispatch 43.2

Longest waits

  • Driver.Packet.memory_wait (queue worker 0x48) 160.7 ms at 488 ms, present 2756
  • Driver.Packet.memory_wait (queue worker 0x48) 159.5 ms at 2508 ms, present 2769
  • Driver.Packet.memory_wait (queue worker 0x48) 159.4 ms at 4634 ms, present 2783
  • Driver.Packet.memory_wait (queue worker 0x48) 158.7 ms at 2344 ms, present 2768
  • Driver.Packet.memory_wait (queue worker 0x48) 158.4 ms at 2825 ms, present 2771
  • Driver.Packet.memory_wait (queue worker 0x48) 157.9 ms at 169 ms, present 2754
  • Driver.Packet.memory_wait (queue worker 0x48) 155.8 ms at 8 ms, present 2753
  • Driver.Packet.memory_wait (queue worker 0x48) 154.0 ms at 4799 ms, present 2784
  • Driver.Packet.memory_wait (queue worker 0x48) 153.8 ms at 331 ms, present 2755
  • Driver.Packet.memory_wait (queue worker 0x48) 153.4 ms at 654 ms, present 2757

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 2423: 16.6 ms at 2534 ms, present 2769: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 2723: 16.5 ms at 2853 ms, present 2771: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 166: 16.3 ms at 195 ms, present 2754: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 3475: 16.3 ms at 3595 ms, present 2776: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 4815: 16.3 ms at 4984 ms, present 2785: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
trace_digest.py, run 3 (main)

seconds 150:5 from present 2660: 29 presents, frame p50 174.6 / p90 182.9 / p99 185.6 / max 185.6 ms, GPU busy 152.6 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit 8499ea5, dropped: no

{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2660,"ms":5017.386},"presents":29,"frame_ms":{"p50":174.619,"p90":182.895,"p99":185.561,"max":185.561},"gpu_busy_ms_per_present":152.577,"worker_busy_pct":{"queue worker 0x0":98.804,"queue worker 0x40":97.803,"queue worker 0x48":93.909,"queue worker 0x46":9.464},"top_phases_ms_per_frame":{"Driver.Packet":518.59,"Driver.Packet.memory_wait":298.946,"Driver.Packet.draw":86.549,"Driver.Draw":85.458,"Graphics.Draw":81.895,"Driver.Packet.prepare_memory":65.5,"Graphics.Draw.draw_and_resource_release":65.075,"Driver.Draw.shader_compile_and_link":52.003},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-12684.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2688: 185.6 ms at 4832 ms: Driver.Packet (queue worker 0x0) 163.4, batch (gpu) 155.2, Driver.Packet (queue worker 0x40) 146.8, Driver.WorkerWait (queue worker 0x46) 105.3
  • present 2667: 183.3 ms at 1226 ms: Driver.Packet (queue worker 0x40) 182.5, Driver.Packet (queue worker 0x48) 179.1, Driver.Packet.memory_wait (queue worker 0x48) 178.7, batch (gpu) 163.1
  • present 2664: 182.9 ms at 703 ms: Driver.Packet (queue worker 0x40) 182.5, Driver.Packet (queue worker 0x48) 178.9, Driver.Packet.memory_wait (queue worker 0x48) 178.4, batch (gpu) 161.2
  • present 2687: 181.0 ms at 4651 ms: Driver.Packet (queue worker 0x40) 180.6, Driver.Packet (queue worker 0x48) 176.0, Driver.Packet.memory_wait (queue worker 0x48) 175.6, Driver.WorkerWait (queue worker 0x46) 160.5
  • present 2682: 179.9 ms at 3773 ms: Driver.Packet (queue worker 0x40) 179.3, Driver.Packet (queue worker 0x48) 174.9, Driver.Packet.memory_wait (queue worker 0x48) 174.3, Driver.WorkerWait (queue worker 0x46) 160.5

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 125.7 (73 %) 25.2 (15 %) 22.1 124.2 Driver.Packet 150.8, Driver.EndSubmission 0.1
title 0.3 (0 %) 0.0 (0 %) 172.7 0.1 Shader.ResolveGraphicsStagesAbi 0.2, Shader.ResolveAbi 0.0
title 1.1 (1 %) 0.0 (0 %) 171.9 0.9 Shader.ResolveGraphicsStagesAbi 1.1, Shader.ResolveAbi 0.0
title 0.8 (0 %) 0.0 (0 %) 172.2 0.4 Shader.ResolveGraphicsStagesAbi 0.7, Shader.ResolveAbi 0.1
title 0.8 (0 %) 0.0 (0 %) 172.2 0.8 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.2
queue worker 0x40 12.2 (7 %) 156.6 (91 %) 4.2 2.1 Driver.Packet 168.7, Driver.EndSubmission 0.1
queue worker 0x48 0.5 (0 %) 166.1 (96 %) 6.4 0.2 Driver.Packet 162.3, Driver.EndSubmission 0.1
draw committer 72.6 (42 %) 6.0 (3 %) 94.4 37.4 Graphics.Draw 68.5, Recorder.Submit 3.4
presenter 1.1 (1 %) 2.0 (1 %) 169.9 0.0 VideoOut.Flip 3.0, Driver.Present 0.1
queue worker 0x46 0.8 (0 %) 164.6 (95 %) 7.7 0.8 Driver.Packet 16.1, Driver.EndSubmission 0.1
title 0.8 (0 %) 0.0 (0 %) 172.2 0.3 Shader.ResolveGraphicsStagesAbi 0.8
gpu 152.4 (88 %) 0.0 (0 %) 20.6 0.0 batch 152.4

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 497.9, Driver.Packet.memory_wait 298.9, Driver.WorkerWait 153.5, batch 152.4, Driver.WorkerWait.dequeue_order 138.5, Driver.Packet.draw 73.7, Driver.Draw 72.6, Graphics.Draw 68.9, Driver.Packet.prepare_memory 64.2, Graphics.Draw.draw_and_resource_release 55.0

Longest waits

  • Driver.WorkerWait (queue worker 0x46) 288.2 ms at 4303 ms, present 2685
  • Driver.WorkerWait (queue worker 0x46) 286.4 ms at 184 ms, present 2661
  • Driver.WorkerWait (queue worker 0x46) 255.3 ms at 3088 ms, present 2678
  • Driver.WorkerWait (queue worker 0x46) 240.4 ms at 1581 ms, present 2669
  • Driver.WorkerWait (queue worker 0x46) 210.4 ms at 4087 ms, present 2683
  • Driver.WorkerWait (queue worker 0x46) 204.7 ms at 1371 ms, present 2667
  • Driver.WorkerWait (queue worker 0x46) 201.0 ms at 2547 ms, present 2674
  • Driver.WorkerWait (queue worker 0x46) 193.6 ms at 2889 ms, present 2676
  • Driver.Packet.memory_wait (queue worker 0x48) 178.5 ms at 1233 ms, present 2667
  • Driver.Packet.memory_wait (queue worker 0x48) 178.1 ms at 710 ms, present 2664

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 3988: 22.1 ms at 4878 ms, present 2688: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.7, Graphics.Draw.draw_and_resource_release (draw committer) 4.1, Recorder.Submit (draw committer) 0.0, Graphics.Draw.validate (draw committer) 0.0
  • batch 1459: 20.3 ms at 1780 ms, present 2670: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.0, Graphics.Draw.draw_and_resource_release (draw committer) 3.3, Recorder.Submit (draw committer) 0.0, Graphics.Draw.validate (draw committer) 0.0
  • batch 1585: 20.3 ms at 1956 ms, present 2671: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.9, Graphics.Draw.draw_and_resource_release (draw committer) 4.3, Recorder.Submit (draw committer) 0.0, Graphics.Draw.validate (draw committer) 0.0
  • batch 2138: 20.2 ms at 2599 ms, present 2675: GPU no ranges; recorded by Graphics.Draw (draw committer) 5.5, Graphics.Draw.draw_and_resource_release (draw committer) 4.9, Recorder.Submit (draw committer) 0.1, Graphics.Draw.validate (draw committer) 0.0
  • batch 280: 20.1 ms at 368 ms, present 2662: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.8, Graphics.Draw.draw_and_resource_release (draw committer) 4.2, Recorder.Submit (draw committer) 0.1
trace_digest.py, run 4 (this PR)

seconds 150:5 from present 4310: 32 presents, frame p50 160.3 / p90 167.4 / p99 172.9 / max 172.9 ms, GPU busy 91.6 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit b8663c5, dropped: no

{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":4310,"ms":5118.256},"presents":32,"frame_ms":{"p50":160.333,"p90":167.439,"p99":172.874,"max":172.874},"gpu_busy_ms_per_present":91.612,"worker_busy_pct":{"queue worker 0x0":98.652,"queue worker 0x40":97.934,"queue worker 0x48":94.517,"queue worker 0x46":9.894},"top_phases_ms_per_frame":{"Driver.Packet":481.041,"Driver.Packet.memory_wait":286.595,"Driver.Packet.draw":92.17,"Graphics.Draw":91.69,"Driver.Draw":90.991,"Graphics.Draw.draw_and_resource_release":75.211,"Driver.Draw.shader_compile_and_link":55.081,"Shader.DrawStage":44.516},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-3760.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 4324: 172.9 ms at 2235 ms: Driver.Packet (queue worker 0x40) 172.4, Driver.Packet (queue worker 0x48) 169.0, Driver.Packet.memory_wait (queue worker 0x48) 168.4, Driver.WorkerWait (queue worker 0x46) 154.6
  • present 4339: 172.5 ms at 4628 ms: Driver.Packet (queue worker 0x40) 172.1, Driver.Packet (queue worker 0x48) 169.0, Driver.Packet.memory_wait (queue worker 0x48) 168.5, Driver.WorkerWait (queue worker 0x46) 155.3
  • present 4319: 169.7 ms at 1411 ms: Driver.Packet (queue worker 0x40) 169.2, Driver.Packet (queue worker 0x48) 165.8, Driver.Packet.memory_wait (queue worker 0x48) 165.4, Driver.WorkerWait (queue worker 0x46) 149.5
  • present 4337: 167.4 ms at 4296 ms: Driver.Packet (queue worker 0x40) 167.0, Driver.Packet (queue worker 0x48) 163.0, Driver.Packet.memory_wait (queue worker 0x48) 162.5, Driver.WorkerWait (queue worker 0x46) 157.4
  • present 4323: 167.0 ms at 2068 ms: Driver.Packet (queue worker 0x40) 166.5, Driver.Packet (queue worker 0x48) 162.7, Driver.Packet.memory_wait (queue worker 0x48) 162.2, Driver.WorkerWait (queue worker 0x46) 149.8

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 132.5 (83 %) 5.7 (4 %) 21.7 125.6 Driver.Packet 138.1, Driver.EndSubmission 0.0
shader prepare 0.0 (0 %) 0.0 (0 %) 159.9 0.0 Vulkan.GraphicsPipelinePrebuild 0.0
title 0.4 (0 %) 0.0 (0 %) 159.6 0.1 Shader.ResolveGraphicsStagesAbi 0.3, Shader.ResolveAbi 0.1
title 1.2 (1 %) 0.0 (0 %) 158.8 0.9 Shader.ResolveGraphicsStagesAbi 1.2, Shader.ResolveAbi 0.0
title 0.9 (1 %) 0.0 (0 %) 159.1 0.3 Shader.ResolveGraphicsStagesAbi 0.8, Shader.ResolveAbi 0.1
title 0.8 (1 %) 0.0 (0 %) 159.1 0.8 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.1
queue worker 0x40 10.7 (7 %) 145.6 (91 %) 3.6 2.1 Driver.Packet 156.3, Driver.EndSubmission 0.1
queue worker 0x48 0.6 (0 %) 154.7 (97 %) 4.6 0.2 Driver.Packet 151.0, Driver.EndSubmission 0.1
draw committer 82.5 (52 %) 5.8 (4 %) 71.6 37.0 Graphics.Draw 78.3, Recorder.Submit 3.5
presenter 1.0 (1 %) 1.9 (1 %) 157.0 0.0 VideoOut.Flip 2.9, Driver.Present 0.0
queue worker 0x46 0.8 (0 %) 154.7 (97 %) 4.5 0.8 Driver.Packet 15.6, Driver.EndSubmission 0.0
title 0.8 (0 %) 0.0 (0 %) 159.2 0.3 Shader.ResolveGraphicsStagesAbi 0.8
gpu 94.7 (59 %) 0.0 (0 %) 65.3 0.0 batch 94.7

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 460.9, Driver.Packet.memory_wait 286.6, Driver.WorkerWait 144.0, Driver.WorkerWait.dequeue_order 134.5, batch 94.7, Driver.Packet.draw 79.7, Graphics.Draw 78.8, Driver.Draw 78.5, Graphics.Draw.draw_and_resource_release 65.5, Driver.Draw.shader_compile_and_link 44.4

Longest waits

  • Driver.Packet.memory_wait (queue worker 0x48) 168.3 ms at 2242 ms, present 4324
  • Driver.Packet.memory_wait (queue worker 0x48) 168.2 ms at 4635 ms, present 4339
  • Driver.Packet.memory_wait (queue worker 0x48) 164.3 ms at 1418 ms, present 4319
  • Driver.Packet.memory_wait (queue worker 0x48) 162.3 ms at 4303 ms, present 4337
  • Driver.Packet.memory_wait (queue worker 0x48) 162.0 ms at 2076 ms, present 4323
  • Driver.Packet.memory_wait (queue worker 0x48) 161.6 ms at 1910 ms, present 4322
  • Driver.Packet.memory_wait (queue worker 0x48) 161.5 ms at 4808 ms, present 4340
  • Driver.Packet.memory_wait (queue worker 0x48) 159.6 ms at 4471 ms, present 4338
  • Driver.WorkerWait (queue worker 0x46) 159.3 ms at 4248 ms, present 4336
  • Driver.Packet.memory_wait (queue worker 0x48) 157.3 ms at 3982 ms, present 4335

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 628: 16.3 ms at 654 ms, present 4314: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 2168: 16.2 ms at 2270 ms, present 4324: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 1394: 16.0 ms at 1451 ms, present 4319: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 2015: 15.8 ms at 2115 ms, present 4323: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 939: 15.8 ms at 969 ms, present 4316: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
trace_digest.py, run 5 (main)

seconds 150:5 from present 2658: 29 presents, frame p50 174.5 / p90 183.5 / p99 184.9 / max 184.9 ms, GPU busy 152.0 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit 8499ea5, dropped: no

{"commit":"8499ea52e571","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2658,"ms":5045.459},"presents":29,"frame_ms":{"p50":174.497,"p90":183.493,"p99":184.907,"max":184.907},"gpu_busy_ms_per_present":151.991,"worker_busy_pct":{"queue worker 0x0":98.787,"queue worker 0x40":97.445,"queue worker 0x48":94.411,"queue worker 0x46":9.031},"top_phases_ms_per_frame":{"Driver.Packet":520.917,"Driver.Packet.memory_wait":298.77,"Driver.Packet.draw":91.749,"Driver.Draw":90.597,"Graphics.Draw":83.471,"Graphics.Draw.draw_and_resource_release":66.106,"Driver.Packet.prepare_memory":55.606,"Driver.Draw.shader_compile_and_link":53.222},"trace_dropped":false,"trace":"aps5-trace-8499ea52e571-25028.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2675: 184.9 ms at 2951 ms: Driver.Packet (queue worker 0x40) 184.5, Driver.Packet (queue worker 0x48) 180.7, Driver.Packet.memory_wait (queue worker 0x48) 180.2, Driver.WorkerWait (queue worker 0x46) 163.7
  • present 2660: 184.2 ms at 356 ms: Driver.Packet (queue worker 0x40) 183.8, Driver.Packet (queue worker 0x48) 180.1, Driver.Packet.memory_wait (queue worker 0x48) 179.5, Driver.WorkerWait (queue worker 0x46) 162.9
  • present 2674: 183.5 ms at 2767 ms: Driver.Packet (queue worker 0x40) 183.1, Driver.Packet (queue worker 0x48) 179.2, Driver.Packet.memory_wait (queue worker 0x48) 178.4, Driver.WorkerWait (queue worker 0x46) 163.6
  • present 2658: 183.2 ms at 0 ms: Driver.Packet (queue worker 0x48) 176.4, Driver.Packet.memory_wait (queue worker 0x48) 175.9, Driver.Packet (queue worker 0x0) 161.4, batch (gpu) 156.7
  • present 2666: 181.9 ms at 1398 ms: Driver.Packet (queue worker 0x40) 181.4, Driver.Packet (queue worker 0x48) 177.5, Driver.Packet.memory_wait (queue worker 0x48) 177.0, Driver.WorkerWait (queue worker 0x46) 176.3

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 134.4 (77 %) 17.6 (10 %) 22.0 125.2 Driver.Packet 151.8, Driver.EndSubmission 0.0
title 0.3 (0 %) 0.0 (0 %) 173.7 0.1 Shader.ResolveGraphicsStagesAbi 0.2, Shader.ResolveAbi 0.0
title 1.2 (1 %) 0.0 (0 %) 172.8 0.9 Shader.ResolveGraphicsStagesAbi 1.1, Shader.ResolveAbi 0.0
title 0.9 (1 %) 0.0 (0 %) 173.1 0.3 Shader.ResolveGraphicsStagesAbi 0.8, Shader.ResolveAbi 0.1
title 0.8 (0 %) 0.0 (0 %) 173.2 0.8 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.2
queue worker 0x40 15.9 (9 %) 153.3 (88 %) 4.8 2.1 Driver.Packet 169.0, Driver.EndSubmission 0.2
queue worker 0x48 0.5 (0 %) 168.1 (97 %) 5.4 0.2 Driver.Packet 164.1, Driver.EndSubmission 0.1
draw committer 74.3 (43 %) 9.1 (5 %) 90.6 37.5 Graphics.Draw 70.1, Recorder.Submit 3.5
presenter 1.0 (1 %) 1.9 (1 %) 171.1 0.0 VideoOut.Flip 2.8, Driver.Present 0.1
queue worker 0x46 0.9 (0 %) 167.5 (96 %) 5.6 0.8 Driver.Packet 15.5, Driver.EndSubmission 0.1
title 0.8 (0 %) 0.0 (0 %) 173.2 0.3 Shader.ResolveGraphicsStagesAbi 0.8
gpu 151.0 (87 %) 0.0 (0 %) 23.0 0.0 batch 151.0

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 500.3, Driver.Packet.memory_wait 298.8, Driver.WorkerWait 157.2, batch 151.0, Driver.WorkerWait.dequeue_order 143.9, Driver.Packet.draw 79.0, Driver.Draw 77.9, Graphics.Draw 70.5, Graphics.Draw.draw_and_resource_release 56.1, Driver.Packet.prepare_memory 54.3

Longest waits

  • Driver.WorkerWait (queue worker 0x46) 283.8 ms at 1916 ms, present 2669
  • Driver.WorkerWait (queue worker 0x46) 281.0 ms at 880 ms, present 2663
  • Driver.WorkerWait (queue worker 0x46) 277.4 ms at 1404 ms, present 2666
  • Driver.WorkerWait (queue worker 0x46) 212.6 ms at 661 ms, present 2661
  • Driver.WorkerWait (queue worker 0x46) 208.1 ms at 1190 ms, present 2664
  • Driver.WorkerWait (queue worker 0x46) 202.2 ms at 1709 ms, present 2667
  • Driver.Packet.memory_wait (queue worker 0x48) 179.4 ms at 363 ms, present 2660
  • Driver.Packet.memory_wait (queue worker 0x48) 179.0 ms at 2775 ms, present 2674
  • Driver.Packet.memory_wait (queue worker 0x48) 178.7 ms at 2959 ms, present 2675
  • Driver.Packet.memory_wait (queue worker 0x48) 178.0 ms at 7 ms, present 2658

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 1017: 21.4 ms at 1246 ms, present 2665: GPU no ranges; recorded by Graphics.Draw (draw committer) 5.3, Graphics.Draw.draw_and_resource_release (draw committer) 4.7, Recorder.Submit (draw committer) 0.0
  • batch 589: 21.1 ms at 743 ms, present 2662: GPU no ranges; recorded by Graphics.Draw (draw committer) 3.9, Graphics.Draw.draw_and_resource_release (draw committer) 3.3, Recorder.Submit (draw committer) 0.0
  • batch 1174: 20.6 ms at 1447 ms, present 2666: GPU no ranges; recorded by Graphics.Draw (draw committer) 3.6, Graphics.Draw.draw_and_resource_release (draw committer) 3.0, Recorder.Submit (draw committer) 0.0, Graphics.Draw.validate (draw committer) 0.0
  • batch 1751: 20.2 ms at 2120 ms, present 2670: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.3, Graphics.Draw.draw_and_resource_release (draw committer) 3.6, Recorder.Submit (draw committer) 0.1
  • batch 2481: 19.8 ms at 2998 ms, present 2675: GPU no ranges; recorded by Graphics.Draw (draw committer) 4.3, Graphics.Draw.draw_and_resource_release (draw committer) 3.7, Graphics.Draw.validate (draw committer) 0.0, Recorder.Submit (draw committer) 0.0
trace_digest.py, run 6 (this PR)

seconds 150:5 from present 2779: 33 presents, frame p50 152.8 / p90 161.1 / p99 166.5 / max 166.5 ms, GPU busy 96.4 ms per present
NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA 616.64, Windows 10.0.26200, 3840x2160, commit b8663c5, dropped: no

{"commit":"b8663c514ef5","dirty":false,"env":{"APS5_HOST_IMPORT_MIB":"13312","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:5"},"gpu":"NVIDIA GeForce RTX 4070 Ti SUPER","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz","cpu_threads":16,"memory_mib":32599,"title_id":"PPSA21567","title":"ASTRO BOT","content_version":"01.019.000","resolution":"3840x2160","window":{"spec":"seconds 150:5","first_present":2779,"ms":5089.771},"presents":33,"frame_ms":{"p50":152.754,"p90":161.061,"p99":166.455,"max":166.455},"gpu_busy_ms_per_present":96.415,"worker_busy_pct":{"queue worker 0x0":98.647,"queue worker 0x40":97.92,"queue worker 0x48":94.465,"queue worker 0x46":11.271},"top_phases_ms_per_frame":{"Driver.Packet":465.854,"Driver.Packet.memory_wait":274.814,"Driver.Packet.draw":87.031,"Graphics.Draw":86.515,"Driver.Draw":85.879,"Graphics.Draw.draw_and_resource_release":70.117,"Driver.Draw.shader_compile_and_link":51.299,"Driver.Packet.dispatch":43.309},"trace_dropped":false,"trace":"aps5-trace-b8663c514ef5-27560.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2803: 166.5 ms at 3719 ms: Driver.Packet (queue worker 0x40) 165.8, Driver.Packet (queue worker 0x48) 162.2, Driver.Packet.memory_wait (queue worker 0x48) 161.7, Driver.WorkerWait (queue worker 0x46) 146.5
  • present 2804: 164.9 ms at 3885 ms: Driver.Packet (queue worker 0x40) 164.5, Driver.Packet (queue worker 0x48) 160.3, Driver.Packet.memory_wait (queue worker 0x48) 159.6, Driver.WorkerWait (queue worker 0x46) 146.1
  • present 2788: 163.4 ms at 1405 ms: Driver.Packet (queue worker 0x40) 162.9, Driver.Packet (queue worker 0x48) 159.4, Driver.Packet.memory_wait (queue worker 0x48) 158.9, Driver.WorkerWait (queue worker 0x46) 144.5
  • present 2785: 161.1 ms at 924 ms: Driver.Packet (queue worker 0x40) 160.6, Driver.Packet (queue worker 0x48) 155.8, Driver.Packet.memory_wait (queue worker 0x48) 155.4, Driver.WorkerWait (queue worker 0x46) 143.1
  • present 2783: 160.7 ms at 604 ms: Driver.Packet (queue worker 0x40) 160.2, Driver.Packet (queue worker 0x48) 155.9, Driver.Packet.memory_wait (queue worker 0x48) 155.2, Driver.WorkerWait (queue worker 0x46) 144.3

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 126.3 (82 %) 5.9 (4 %) 22.0 125.9 Driver.Packet 132.0, Driver.EndSubmission 0.1
title 0.3 (0 %) 0.0 (0 %) 154.0 0.1 Shader.ResolveGraphicsStagesAbi 0.2, Shader.ResolveAbi 0.1
title 1.0 (1 %) 0.0 (0 %) 153.2 0.9 Shader.ResolveGraphicsStagesAbi 1.0, Shader.ResolveAbi 0.0
title 0.8 (1 %) 0.0 (0 %) 153.5 0.4 Shader.ResolveGraphicsStagesAbi 0.7, Shader.ResolveAbi 0.1
title 0.7 (0 %) 0.0 (0 %) 153.5 0.8 Shader.ResolveGraphicsStagesAbi 0.6, Shader.ResolveAbi 0.1
queue worker 0x40 11.0 (7 %) 139.7 (91 %) 3.5 2.1 Driver.Packet 150.6, Driver.EndSubmission 0.1
queue worker 0x48 0.5 (0 %) 149.2 (97 %) 4.6 0.2 Driver.Packet 145.5, Driver.EndSubmission 0.1
draw committer 76.8 (50 %) 6.4 (4 %) 71.1 38.1 Graphics.Draw 72.6, Recorder.Submit 3.5
presenter 1.0 (1 %) 1.8 (1 %) 151.4 0.1 VideoOut.Flip 2.8, Driver.Present 0.1
queue worker 0x46 0.8 (1 %) 149.1 (97 %) 4.3 0.8 Driver.Packet 17.2, Driver.EndSubmission 0.1
title 0.7 (0 %) 0.0 (0 %) 153.5 0.3 Shader.ResolveGraphicsStagesAbi 0.7
gpu 96.5 (63 %) 0.0 (0 %) 57.8 0.0 batch 96.5

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 445.3, Driver.Packet.memory_wait 274.8, Driver.WorkerWait 136.7, Driver.WorkerWait.dequeue_order 127.8, batch 96.5, Driver.Packet.draw 74.1, Graphics.Draw 73.1, Driver.Draw 72.8, Graphics.Draw.draw_and_resource_release 60.0, Driver.Packet.dispatch 43.1

Longest waits

  • Driver.Packet.memory_wait (queue worker 0x48) 161.2 ms at 3726 ms, present 2803
  • Driver.Packet.memory_wait (queue worker 0x48) 159.8 ms at 3893 ms, present 2804
  • Driver.Packet.memory_wait (queue worker 0x48) 159.3 ms at 1412 ms, present 2788
  • Driver.Packet.memory_wait (queue worker 0x48) 156.6 ms at 1251 ms, present 2787
  • Driver.Packet.memory_wait (queue worker 0x48) 155.5 ms at 932 ms, present 2785
  • Driver.Packet.memory_wait (queue worker 0x48) 155.0 ms at 612 ms, present 2783
  • Driver.Packet.memory_wait (queue worker 0x48) 154.5 ms at 1093 ms, present 2786
  • Driver.Packet.memory_wait (queue worker 0x48) 154.4 ms at 772 ms, present 2784
  • Driver.Packet.memory_wait (queue worker 0x48) 154.3 ms at 3252 ms, present 2800
  • Driver.Packet.memory_wait (queue worker 0x48) 152.7 ms at 8 ms, present 2779

Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)

  • batch 3776: 16.1 ms at 3920 ms, present 2804: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 3020: 16.0 ms at 3120 ms, present 2799: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 2273: 16.0 ms at 2349 ms, present 2794: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.1
  • batch 3626: 16.0 ms at 3759 ms, present 2803: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.0
  • batch 4230: 16.0 ms at 4371 ms, present 2807: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Recorder.Submit (draw committer) 0.1

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 4070 Ti SUPER, driver 616.64, Windows 11 (10.0.26200); AMD Radeon 860M (RADV, Mesa 26.2.5, Fedora 44), the focused tests with and without the validation layer, run by Lander0606 (the BAR path is taken): perf(agc): keep draw snapshots in resizable BAR memory #9712 (comment)
  • AI-assisted: yes

@github-actions github-actions Bot added the perf Performance change label Oct 22, 2026
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 862 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 4040 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 4472 core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
docs/dev/ENVIRONMENT.md
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6146 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6185 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6194 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6223 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 6235 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6340 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6501 docs/dev/ENVIRONMENT.md
PR 6548 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6553 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 6615 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6905 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6924 docs/dev/ENVIRONMENT.md
PR 6970 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6973 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6987 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6989 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6995 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7002 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7085 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7223 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 7369 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 7410 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 7449 docs/dev/ENVIRONMENT.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 7464 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 7622 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 7643 docs/dev/ENVIRONMENT.md
PR 7668 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 7689 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8004 docs/dev/ENVIRONMENT.md
PR 8089 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8212 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 8246 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 8484 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 8748 core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 8912 core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 8963 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 9012 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9154 docs/dev/ENVIRONMENT.md
PR 9248 docs/dev/ENVIRONMENT.md
PR 9289 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 9318 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 9335 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9345 docs/dev/ENVIRONMENT.md
PR 9356 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 9387 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 9489 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 9592 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 9604 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9671 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9674 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 9675 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9676 docs/dev/ENVIRONMENT.md
PR 9700 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9748 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9852 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 9875 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 9884 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 9891 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 9895 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9897 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9898 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 9915 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9999 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10000 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10043 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10049 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10064 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10069 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10141 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 10159 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10193 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10249 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 10256 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10351 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 10359 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10442 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 10443 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 10472 core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 10489 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10492 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10497 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10556 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 10668 docs/dev/ENVIRONMENT.md
PR 10678 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/ENVIRONMENT.md
PR 10743 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 10757 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10779 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 10867 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10894 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 10920 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 11265 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 11351 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 11435 docs/dev/ENVIRONMENT.md
PR 11436 docs/dev/ENVIRONMENT.md
PR 11444 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 11452 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 11485 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 11551 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 11557 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 11566 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 11587 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 11825 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 11847 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 11901 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 11920 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 11948 docs/dev/ENVIRONMENT.md
PR 11995 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 11998 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 12066 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 12070 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 12120 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
docs/dev/ENVIRONMENT.md
PR 12125 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 12132 docs/dev/ENVIRONMENT.md
PR 12158 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 12323 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 12324 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 12478 docs/dev/ENVIRONMENT.md
PR 12544 docs/dev/ENVIRONMENT.md
PR 12567 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12568 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12575 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 12662 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 12696 docs/dev/ENVIRONMENT.md
PR 12720 docs/dev/ENVIRONMENT.md
PR 12745 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12746 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 12764 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12828 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 12840 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12848 docs/dev/ENVIRONMENT.md
PR 12849 docs/dev/ENVIRONMENT.md
PR 12855 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 12863 docs/dev/ENVIRONMENT.md
PR 12895 docs/dev/ENVIRONMENT.md
PR 12904 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 12921 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 12930 docs/dev/ENVIRONMENT.md
PR 12944 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 12970 docs/dev/ENVIRONMENT.md
PR 12980 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 12994 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 13021 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 13023 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 13044 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13131 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 13145 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 13147 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 13148 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 13159 docs/dev/ENVIRONMENT.md
PR 13169 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 13178 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 13248 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 13251 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13262 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 13263 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13646 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
docs/dev/ENVIRONMENT.md
PR 13707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 13793 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13796 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 13809 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13858 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 13863 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13920 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13928 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13929 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 13942 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13963 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13991 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14032 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14051 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/ENVIRONMENT.md
PR 14076 core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14219 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 14220 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 14235 docs/dev/ENVIRONMENT.md
PR 14243 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14260 docs/dev/ENVIRONMENT.md
PR 14261 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14262 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 14263 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 14264 docs/dev/ENVIRONMENT.md
PR 14299 docs/dev/ENVIRONMENT.md
PR 14302 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14330 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14344 docs/dev/ENVIRONMENT.md
PR 14367 docs/dev/ENVIRONMENT.md
PR 14473 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14561 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14621 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14709 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 14794 docs/dev/ENVIRONMENT.md
PR 14815 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp
PR 14838 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 14857 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 14868 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14871 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 14880 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 14891 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 14904 docs/dev/ENVIRONMENT.md
PR 14909 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 14914 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14940 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 14943 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
docs/dev/ENVIRONMENT.md
PR 14944 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 15004 docs/dev/ENVIRONMENT.md
PR 15015 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
docs/dev/ENVIRONMENT.md
PR 15056 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 15059 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 15064 docs/dev/ENVIRONMENT.md
PR 15067 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp

@panicDa3m0n

Copy link
Copy Markdown
Author

Traces of the four runs whose summary lines are in the description, in run order (main, this PR, main, this PR). GitHub did not take the .json.gz files as attachments here, so they are stored unchanged in one zip; trace_digest.py and performance_compare.py read them as they are.

aps5-traces-pr9712.zip

Run Trace in the zip
1, main aps5-trace-d6eafa54d046-16512.json.gz
2, this PR aps5-trace-b5b8d4e27aa8-452.json.gz
3, main aps5-trace-d6eafa54d046-14692.json.gz
4, this PR aps5-trace-b5b8d4e27aa8-23524.json.gz

@Scramblrrrr

Copy link
Copy Markdown
Contributor

Preparing a Windows 007 cross-test of b5b8d4e, not a duplicate implementation. Source-only integration merges cleanly on current main 4777cac with our existing bring-up stack; conventions pass and original authorship is retained:
https://github.com/Scramblrrrr/AnyPS5/tree/codex/first-light-oct22-bar-snapshots (4b61c25)
Base without this change: codex/first-light-oct22-current-base (52c69fb).

UNBUILT/UNTESTED here so far; our pinned same-build input-policy control is running first. Planned checks are the same native draw/vertex/index/snapshot selection on the base and candidate, actual Khronos layer, no shader cache, plus the disabled-BAR control before a title comparison. Hardware is Windows 11 / RTX 5070 Ti 617.42 / 7800X3D / 32 GiB.

One concern from your stated limitation: our 007 runs are already memory-constrained. Before I stress the title, are you planning the Buffer/slab host-memory fallback in this branch? I will not attribute an allocation failure under VRAM pressure to the title itself. No speed claim yet; raw title code/captures stay local. AI-assisted: Codex.

@Scramblrrrr

Scramblrrrr commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

One source-review question before my native run: HostReadableInput takes a second GuestMemory::Read for BAR-backed index buffers, after CopyDrawInput already populated the draw snapshot. If the guest writes those indices between the copy and the highest-index/restart-table scan, the CPU can scan different indices from the snapshot bound for this draw. The host-memory path scans copy.buffer itself, so it preserves that relationship.

Could we retain a host shadow of the exact index snapshot (or read back the snapshot for these scans), rather than re-read mutable guest memory? A focused regression could copy indices, mutate the guest source, then check that the derived highest index / restart table still match the bound snapshot. This is a source-review concern; I have not reproduced it in a title or run that regression yet. AI-assisted: Codex.

@panicDa3m0n

Copy link
Copy Markdown
Author

Thanks, both points are right.

  • Fallback: yes, in this branch. Buffer and its slabs get the same two placements device buffers already have. A mapped device-local buffer goes to host memory when the reported budget of the device-local heap has no room for it, as DeviceMemoryType places device buffers. It also goes there when its allocation is still refused after the pool trim and the cache reclaim, as with RefusedDeviceMemoryFallback. Properties() then reports host memory, so refreshing such a snapshot compares its blocks again.
  • Index scans: index copies stay in host memory, as on main. The highest index, the mesh restart table and the bound copy then come from the same bytes, and HostReadableInput goes away. Vertex copies and storage snapshots stay in BAR memory. A new test copies indices, stores to the guest source, and checks the copy's memory and its highest index.

I will push both today with their tests, the validation runs on main and on the new head, and new numbers for the head, and say so here.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed exact head b5b8d4e. Two blocking issues remain in this head: the BAR index path scans guest memory again after creating the GPU-bound snapshot, and BAR-backed Buffer allocations have no host-memory fallback when the selected heap cannot satisfy them. Both were already raised in the discussion, and the author acknowledged both with a plan to address them; those fixes are not present in the reviewed head. Please keep the index snapshot and all derived index metadata from the same byte copy, and add the agreed allocation fallback before treating this as ready. The branch is also 15 commits behind current upstream/main, so update it and rerun the focused draw/index tests plus the documented main-vs-change validation run on the updated tree. The current GitHub check list contains successful conventions/intake/label checks but no product build or test job; I could not run a local build because there is no configured build tree and the filesystem is full. I have not independently reproduced the performance figures. Please also coordinate the already-disclosed interaction with open #8756 and confirm the landing/rebase order.

@panicDa3m0n

Copy link
Copy Markdown
Author

Rebased onto current main (3ca07d0). The branch is now three commits, and the review fixes are the last two.

@Scramblrrrr, both of your points are fixed:

  • 88d4e7b fix(agc): keep index copies in host memory. HostReadableInput is gone; the highest index and the mesh restart table are scanned from the copy the draw binds. agc_draw_input_memory copies indices, stores to the guest source, and checks the copy's memory and its highest index. It fails when index copies take the snapshot memory.

  • 8231521 fix(agc): give mapped device-local buffers a host memory fallback. A mapped device-local Buffer, slabs included, takes host memory in two cases:

    • when the reported budget of the device-local heap has no room for it, as DeviceMemoryType places device buffers;
    • when its allocation is still refused after the pool trim and the cache reclaim, as RefusedDeviceMemoryFallback does.

    Both cases print rate-limited lines ([gpu] mapped buffer: ..., [bufferpool] ... placed in host memory type ...), so a run under VRAM pressure shows when they happened. MappedDevicePlacement in tests/BufferPool.cpp checks a buffer and a slab within the budget, over it, and after a refusal. It fails without each of the placements.

@MarcZX10, both blocking points are fixed in those two commits. On the updated tree:

  • ctest -R ^agc_ passes except four tests that fail the same way on main's build on this machine: the three agc_driver_sample_order* tests, and the agc_compute_pipeline_capture_optional_byte_cap timeout from its 256 MiB write to this machine's slow temporary folder.
  • The documented main-versus-change validation run (Khronos layer, the draw, vertex, index and snapshot tests) has no VUID- errors and the same 10 warnings on main's build (3ca07d0), on the head, and on the head with APS5_NO_BAR_SNAPSHOTS=1.

On the order with #8756: whichever is merged first stays as it is, and the other rebases its neighbouring lines in PrepareDrawBindings, which is a small change either way. If #8756 goes first, I will rebase this one.

The description has the new performance numbers for the head, measured against main on the same base.

@panicDa3m0n

Copy link
Copy Markdown
Author

Traces of the six runs in the description (rounds 1, 2 and 3 there), each with its aps5-summary.jsonl line, one zip per round. The files are unchanged apart from the runN-main- or runN-pr- prefix, which gives their row in the table.

aps5-traces-pr9712-round1.zip
aps5-traces-pr9712-round2.zip
aps5-traces-pr9712-round3.zip

Run Build Trace
1 main 3ca07d086 run1-main-aps5-trace-3ca07d086d5f-13120.json.gz
2 this PR 82315210c run2-pr-aps5-trace-82315210ced9-12056.json.gz
3 main 3ca07d086 run3-main-aps5-trace-3ca07d086d5f-25904.json.gz
4 this PR 82315210c run4-pr-aps5-trace-82315210ced9-25932.json.gz
5 main 3ca07d086 run5-main-aps5-trace-3ca07d086d5f-23908.json.gz
6 this PR 82315210c run6-pr-aps5-trace-82315210ced9-4512.json.gz

@MarcZX10 MarcZX10 left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR contains title-specific Astro Bot performance measurements, so I am not treating it as a title-agnostic change. However, the baseline uses main 3ca07d0, not current main, and current main has since changed AGC draw code. Please rerun the comparison on current main so the reported performance evidence can be evaluated against the current code.

The branch is 19 commits behind main. Please update it and rerun the focused snapshot, draw-input and buffer-pool tests plus the main-vs-change performance run on the updated tree. Current hosted checks show conventions and labels passing, with no product build/test run. The author-reported AGC tests and Astro Bot A/B results have not been independently reproduced here.

The review also found a portability issue in Context::MappedBufferProperties: snapshot memory selection uses device-wide physical properties, but the buffer’s VkMemoryRequirements::memoryTypeBits may exclude the selected BAR type while allowing a host-visible type. In that case MemoryType(mask, flags) throws rather than falling back to HostBufferProperties. Please add a regression where the BAR type is excluded but a compatible host type remains. I syntax-checked the relevant production and test sources, and git diff --check and current-main conventions pass. The current hosted checks have no product build/test run.

@MarcZX10

Copy link
Copy Markdown
Contributor

Follow-up: I reproduced the per-buffer compatibility case in a small executable built against the exact PR-head Context.hpp. The physical properties exposed both a host-visible/coherent host type and a host-visible/coherent/device-local BAR type, while the buffer memoryTypeBits mask contained only the host type. Calling MappedBufferProperties(mask, MappedDeviceProperties, 4096) throws “AGC graphics: required Vulkan memory type is unavailable” instead of selecting the compatible host type.

@panicDa3m0n

Copy link
Copy Markdown
Author

Thanks for reproducing it. I'll make MappedBufferProperties fall back to host memory when the buffer's memoryTypeBits has no mapped device-local type, add the regression test you describe (the BAR type excluded from the mask, the host type kept), then rebase onto current main and rerun the focused tests, the validation run and the main-versus-change performance runs on the new base.

Draw snapshots of read-only storage buffers and the vertex and index
copies of draws now live in device-local host-visible memory when the
device exposes it through a resizable BAR (a heap of at least 4 GiB),
and in host memory otherwise. The CPU still fills them with memcpy,
but the GPU reads them from VRAM instead of over PCIe.

The CPU never reads that memory back: refreshing a stale snapshot
rewrites its changed blocks without comparing them, and the highest
index of a copied index buffer is scanned from a host copy.
APS5_NO_BAR_SNAPSHOTS keeps the previous host memory.

On an RTX 4070 Ti SUPER (driver 616.64, PCIe 4.0 x16), shaders read
host memory at 6-8 GB/s sequentially and 1.4 GB/s scattered, against
650 and 92 GB/s from VRAM.

AI-assisted: yes.
The CPU scans an index copy for its highest index and, for mesh strips,
its restart table. With the copy in device-local memory the scans read
the guest's index buffer a second time, so a store between the copy and
the scan gave a highest index or restart table that did not match the
bound copy. Index copies now stay in host memory and the scans read the
copy itself; vertex copies stay in BAR memory.

agc_draw_input_memory copies indices, stores to the guest source, and
checks that the copy is in host memory and keeps its highest index.
A Buffer asked for device-local host-visible memory now takes host
memory when the reported budget of the device-local heap has no room
for it, as DeviceMemoryType places device buffers. It also takes host
memory when its allocation, or the allocation of its slab block, is
still refused after the pool trim and the cache reclaim, as device
buffers and images do through RefusedDeviceMemoryFallback. Properties()
then reports host memory, so refreshing such a snapshot compares its
blocks again.

MappedDevicePlacement in tests/BufferPool.cpp checks both placements
for a buffer and for a slab.
…ry types is mapped device-local

MappedBufferProperties looked up the BAR type with MemoryType(mask, flags),
which throws when the buffer's memoryTypeBits exclude it, and returned
the flags unchanged without VK_EXT_memory_budget, so BufferMemoryType
threw the same way. The buffer's own memory types are checked first now:
a mask with no mapped device-local type takes HostBufferProperties, with
a rate-limited line. MappedDevicePlacement checks a buffer and a slab
whose mask excludes the BAR type and keeps the host type, with and
without the budget extension.
@MarcZX10

MarcZX10 commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

I’ve noticed that asking you to hold this PR was unnecessary. It’s fine to keep submitting PRs; maintainers will handle them in due course.

@MarcZX10 MarcZX10 left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This follow-up is redundant: I removed the #5239 intake sentence from my prior review. The remaining requests concern current-main performance validation and the mapped-buffer fallback regression.

@panicDa3m0n

Copy link
Copy Markdown
Author

Rebased onto current main (8499ea5). The per-buffer case is fixed in b8663c5 fix(agc): place mapped buffers in host memory when none of their memory types is mapped device-local.

@MarcZX10, thanks for the reproduction. MappedBufferProperties now checks the buffer's own memoryTypeBits first: when none of them is mapped device-local, the buffer takes HostBufferProperties. That also covers the path without VK_EXT_memory_budget, which returned the flags unchanged so that BufferMemoryType threw the same way. MappedDevicePlacement adds the case you describe, the BAR type excluded from the mask and the host type kept, for a buffer and a slab, with and without the budget extension. Each new case fails when the check moves back after the early return or the throwing MemoryType lookup replaces it (AGC graphics: required Vulkan memory type is unavailable).

On the updated tree:

  • ctest -R ^agc_ (895 tests) passes except the same four as before: the three agc_driver_sample_order* tests and the agc_compute_pipeline_capture_optional_byte_cap timeout.
  • The main-versus-change validation run has no VUID- errors and the same 10 warnings on main's build (8499ea5), on the head, and on the head with APS5_NO_BAR_SNAPSHOTS=1.
  • The description has new main-versus-change runs on this base.

@panicDa3m0n

Copy link
Copy Markdown
Author

Traces of the six runs in the description, one zip per round, each with its aps5-summary.jsonl line. The files are unchanged apart from the runN-main- or runN-pr- prefix, which gives their row in the table.

aps5-traces-pr9712-v4-round1.zip
aps5-traces-pr9712-v4-round2.zip
aps5-traces-pr9712-v4-round3.zip

Run Build Trace
1 main 8499ea52e run1-main-aps5-trace-8499ea52e571-25288.json.gz
2 this PR b8663c514 run2-pr-aps5-trace-b8663c514ef5-26736.json.gz
3 main 8499ea52e run3-main-aps5-trace-8499ea52e571-12684.json.gz
4 this PR b8663c514 run4-pr-aps5-trace-b8663c514ef5-3760.json.gz
5 main 8499ea52e run5-main-aps5-trace-8499ea52e571-25028.json.gz
6 this PR b8663c514 run6-pr-aps5-trace-b8663c514ef5-27560.json.gz

panicDa3m0n added a commit to panicDa3m0n/NativeFrame that referenced this pull request Oct 22, 2026
…ativeFrame main

The line carried the first BAR snapshot port with HostReadableInput,
which read index bytes back from the guest after the copy. It now has
the reviewed pull request: index copies in host memory scanned from
the copy the draw binds, MatchingMemoryType and the host fallbacks of
mapped buffers and slabs. The stack's snapshot shadow stays: storage
snapshots still fill through FillDrawSnapshot, and a device-local
snapshot with a shadow is still compared on refresh.
@panicDa3m0n

Copy link
Copy Markdown
Author

@savvaniss, this pull request also lists only NVIDIA. If you have time for a run like the one you did on #8756, your RX 9070 XT would cover AMD here. What would help most:

  • Whether Smart Access Memory (resizable BAR) is on, that is, whether vulkaninfo lists a memory type that is both DEVICE_LOCAL and HOST_VISIBLE on the VRAM heap. Without it the snapshots stay in host memory and this pull request behaves like main.
  • agc_buffer_pool and agc_draw_input_memory on this head (b8663c514).
  • The validation set from the description (agc_driver_draw_*, agc_driver_vertex_*, agc_driver_rect_list_*, agc_driver_mesh_index_cache, agc_driver_graphics, agc_driver_zero_stride_vertex_fetch) on main and on this head, and on the head once more with APS5_NO_BAR_SNAPSHOTS=1, with the variables you used there: ANYPS5_GPU=AMD, ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation.

No title run is needed. Thanks either way.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@panicDa3m0n thanks for the TakeSlot fix. I ran a same-machine pair of head 539e1d1 against its main base (01cd4a4) on an RTX 4090 (resizable BAR on, Linux, driver 610.57.04), twice on 26 Oct and again twice on a quiet box on 27 Oct (no builds or other jobs running). Both times the PR is slower on the title screen and in the menu, by the same amount:

Scene main p50 frame PR p50 frame
Title 36.9 / 36.7 ms 39.2 / 39.4 ms
Menu 37.6 / 37.2 ms 40.0 / 40.4 ms

That is about +2 ms (6-8%) per frame, well outside the control spread. Intro and level are equal, peak VRAM is 11.0 / 11.0 GB vs 10.8 / 10.3 GB on main, and there are no faults. So on this NVIDIA card the BAR path costs time where it should save it, while @BunnyFl's and @QDarkRex's AMD numbers show it saving ~1.4 ms of GPU time.

Could you look at what the title/menu frames do differently on the BAR path (for example many small snapshots per frame, or reads back from BAR memory)? If the gain is AMD-specific, an option is to enable it only where it measures faster, with the default staying as on main. A same-machine main-vs-head run of the title screen on your side would help too.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I re-reviewed the latest head 4e93e34d8e0929f29032c4a81712e4dd899e65f7. The earlier code concerns about keeping index metadata with its copy, memoryTypeBits fallback, and fallback slab indexing have been addressed in later changes and the reported agc_buffer_pool regression checks are useful. The reported AMD measurements show 1.4–1.5 ms lower GPU-busy time on two Radeon systems, with little frame-time change on the CPU-bound RX 9060 XT run.

A new blocking result is the RTX 4090 A/B reported against the same main base: title/menu p50 worsened by about 2 ms (6–8%) in repeated quiet runs, while intro/level were unchanged. The current implementation enables BAR snapshots for any qualifying device, so the PR's current evidence shows a material regression on NVIDIA alongside the AMD gain. Please investigate the title/menu path and either address the regression or narrow the default enablement to hardware where the benefit is demonstrated; then rerun the same-machine main/head comparison and focused tests on the resolved head. GitHub currently reports this PR DIRTY / non-mergeable against current main, and the current head is 1,319 commits behind. The hosted checks shown are conventions and labels only; no product build/test is reported here. I did not run a local GPU build or performance test.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@panicDa3m0n a nudge on this one. Two things are open:

  1. It conflicts with main again; could you merge or rebase onto current main?
  2. Our RTX 4090 runs (same-machine pairs, including two on a quiet box, results in the comment above) show the title and menu 6-8% slower with the BAR path (about +2 ms median frame time), while the two AMD reports here show lower GPU time and an unchanged frame. Could you either find what costs the extra time on NVIDIA, or limit the BAR snapshot path to the devices where it helps (or make it opt-in) and say which you chose?

Once that's in, we'll run one more 4090 pair on the new head and merge on a pass with green CI.

@QDarkRex

QDarkRex commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

@oneandonlydean, the title-screen A/B on AMD that the NVIDIA result calls for. On an RX 9060 XT the BAR path does not slow the title screen: in all three rounds it is 0.3–0.5 ms per frame faster than the host-memory path. So the cost you see on the RTX 4090 looks NVIDIA-specific, at least on this scene.

  • Host: Windows 11 (26300), Ryzen 7 5700X, 32 GB RAM, Radeon RX 9060 XT 16 GB, AMD driver 26.10.1, resizable BAR on (memory type 2 is DEVICE_LOCAL | HOST_VISIBLE on the 15.92 GiB VRAM heap). WinLibs GCC 15.2.0 r7, Release.
  • Build: this PR's head 4e93e34. Both arms run the same binary; the host-memory arm sets APS5_NO_BAR_SNAPSHOTS=1.
  • Scene: ASTRO BOT PPSA21564 01.007.000, normal boot with no input, so the game stops at the "PRESS ANY BUTTON" title screen. A frame-dump run (APS5_DUMP_FRAMES_EVERY=200) shows the Team Asobi logo at about 80 s from the first present and the title screen from about 105 s on. I did not measure the menu, because reaching it needs input.
  • Runs: 300 s each, one warm-up per arm, then three rounds in the order B A / A B / B A (A = BAR). APS5_HOST_IMPORT_MIB=14336 and APS5_TRACE_SUMMARY_EVERY=10. FPS is the mean, and the frame percentiles and GPU busy the median, of the 14 windows from 150 s on (all title screen).
Round Snapshots FPS frame p50 frame p90 GPU busy / present
1 host (APS5_NO_BAR_SNAPSHOTS=1) 14.93 67.2 ms 69.3 ms 45.1 ms
1 BAR 14.98 66.9 ms 69.0 ms 44.9 ms
2 BAR 15.04 66.9 ms 68.9 ms 44.8 ms
2 host 14.94 67.4 ms 69.3 ms 45.2 ms
3 host 14.97 67.4 ms 69.4 ms 45.0 ms
3 BAR 15.01 66.9 ms 69.0 ms 44.9 ms
  • Paired differences, BAR minus host: frame p50 −0.3, −0.5 and −0.5 ms; GPU busy −0.2, −0.4 and −0.1 ms per present. The control spread within each arm is 0.0–0.2 ms, so the direction is consistent but the size is small.
  • The BAR warm-up run is not comparable and is left out with the other warm-up. It sat on the title screen at 67 ms like the others until about 110 s from the first present. Then it moved into another state: 7 presents in 23 s, then a steady 440 ms p50 and 310 ms GPU busy per present to the end. That run had no frame dumps, so I can't say which scene it was (the runs were unattended, with an Xbox 360 controller connected). The six measured runs and the host warm-up stayed on the title screen for the whole window.
  • One host-arm run logged a single non-fatal guest snapshot differs from registered memory line (0x50cc30350+0x40, "the live region serves the GPU"). No other errors and no stalls of 5 s or more in the measured runs.
  • Combined with the Crash Site rounds above, on this AMD card the BAR path is equal or slightly better in both scenes. That supports enabling it only where it measures faster rather than dropping it.

AI-assisted: yes (Claude Code). The runs were made on my machine.

@milescoviello

Copy link
Copy Markdown
Contributor

@panicDa3m0n #15570 builds on this PR. It places the other CPU-written, shader-read driver buffers through Context::SnapshotProperties(): shader data and the flattened SRT, image table maps, BDA tables, expanded index copies, and read-only region copies. It leaves your snapshots, vertex copies and upload ring as they are here, and lists this PR under Depends on.

In case it helps here, from Ghost of Tsushima (PPSA02225) on an RTX 4070 Ti with a GPU profile and both placements together: GPU time per present went from 227 to 180 ms, and its instanced decal draws from 88 to 48 ms. Your snapshot refresh without the compare also mattered there: without it the committer threads spent most of their time reading BAR memory back, at about 95 MB/s.

AI-assisted: yes (Claude Code)

@TripyFox

TripyFox commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

NVIDIA data on Windows, as asked in the review above. On an RTX 5090 the BAR path does not slow the title screen: over three rounds the frame p50 is 56.8 ms with it and 57.1 ms without it, and GPU busy per present is 41.3 ms against 41.6 ms. At Crash Site it is faster in every round, by 3.9-4.8 ms of frame p50 and 10.4-10.8 ms of GPU busy per present. So the +2 ms on the RTX 4090 does not show on this NVIDIA/Windows machine. This data cannot tell whether it comes from Linux or from that machine.

  • Host: Windows 11 (10.0.26200), AMD Ryzen 7 9800X3D, 64 GB RAM, NVIDIA GeForce RTX 5090 (driver 621.01, PCIe 5.0 x16), 3840x2160.
  • Resizable BAR: on.
    • vulkaninfo lists memory type 4 as DEVICE_LOCAL | HOST_VISIBLE | HOST_COHERENT on the 31.43 GiB VRAM heap.
    • nvidia-smi reports a 32768 MiB BAR1.
    • So the device meets the PR's rule for the BAR path.
  • Builds: Release, MinGW GCC 15.2. Both are clean.
    • This PR's head 4e93e34d8e. Both PR arms run this binary; the host arm sets APS5_NO_BAR_SNAPSHOTS=1.
    • As a control, the head's main parent 8ff4baf534.
    • The head is about 8,500 commits behind current main and was measured as-is, not rebased.
  • Title: ASTRO BOT PPSA21567 01.019.000, no input (APS5_NO_PAD_INPUT=1).
    • Title screen: normal boot; window = intervals from 120 s on (7 per run), all on the "PRESS ANY BUTTON" screen (checked with frame dumps); the menu needs input and was not measured.
    • Crash Site: -lvl hub_crashsite, intervals from 30 s on (15-16 per run).
  • Runs:
    • 200 s each, APS5_TRACE_SUMMARY_EVERY=10 and APS5_TRACE_BENCH=1, no other trace or profile switch.
    • Warm shader caches: one warm-up run per binary and scene first.
    • Rounds in the order bar/host/main, main/host/bar, host/bar.
    • Frame p50, frame p90 and GPU busy are the medians of the 10 s windows; FPS is presents over time in the window.

Title screen:

Round Snapshots Commit FPS frame p50 frame p90 GPU busy / present
1 BAR 4e93e34d8e 17.50 57.2 ms 58.8 ms 41.4 ms
1 host (APS5_NO_BAR_SNAPSHOTS=1) 4e93e34d8e 17.41 57.6 ms 59.3 ms 41.9 ms
1 main 8ff4baf534 17.41 57.5 ms 59.2 ms 42.0 ms
2 main 8ff4baf534 17.12 58.2 ms 60.5 ms 42.6 ms
2 host 4e93e34d8e 17.64 56.7 ms 58.3 ms 41.5 ms
2 BAR 4e93e34d8e 17.45 57.3 ms 58.8 ms 41.5 ms
3 host 4e93e34d8e 17.46 57.1 ms 59.3 ms 41.5 ms
3 BAR 4e93e34d8e 17.87 55.9 ms 57.4 ms 41.0 ms

Crash Site:

Round Snapshots Commit FPS frame p50 frame p90 GPU busy / present
1 BAR 4e93e34d8e 9.53 105.1 ms 114.3 ms 73.3 ms
1 host 4e93e34d8e 9.21 109.9 ms 114.1 ms 83.7 ms
1 main 8ff4baf534 9.06 110.2 ms 115.0 ms 84.4 ms
2 main 8ff4baf534 9.15 110.2 ms 115.0 ms 83.9 ms
2 host 4e93e34d8e 9.28 108.5 ms 113.5 ms 83.8 ms
2 BAR 4e93e34d8e 9.61 103.9 ms 113.5 ms 73.0 ms
3 host 4e93e34d8e 9.23 109.3 ms 114.2 ms 83.7 ms
3 BAR 4e93e34d8e 9.51 105.4 ms 115.0 ms 73.0 ms
  • Title screen, BAR minus host in each round: frame p50 -0.4, +0.6 and -1.3 ms; GPU busy -0.5, -0.0 and -0.5 ms.
    • On this machine the title screen is bound by the queue workers, not the GPU (busiest workers 100 / 99.9 / 99.2 %, GPU busy about 41.5 of 57 ms).
    • A CPU cost on the snapshot path would therefore reach the frame, and a GPU cost would show in GPU busy. Neither moves.
    • The trace phases (Driver.Packet, Driver.Packet.memory_wait, Driver.Packet.dispatch, Driver.Packet.draw) are equal within noise.
  • Crash Site, BAR minus host in each round: frame p50 -4.8, -4.6 and -3.9 ms; GPU busy -10.4, -10.8 and -10.7 ms.
    • Graphics.Draw is 1.4 ms per frame higher with BAR (48.2 against 46.8 ms, summed over threads), but Driver.Packet falls by about 10 ms.
  • The host arm matches main 8ff4baf534 on both scenes (title 57.9 / 42.3 ms, Crash Site 110.2 / 84.2 ms), so APS5_NO_BAR_SNAPSHOTS=1 gives main's behaviour here.
  • performance_compare.py on matched single intervals lists env.APS5_NO_BAR_SNAPSHOTS as the only configuration difference. It gives the same signs: title -0.3 / +0.7 / -1.6 ms frame p50, Crash Site -3.7 / -3.9 / -5.3 ms frame p50 and -10.3 / -11.5 / -10.5 ms GPU busy.
  • No errors. In two extra 150 s Crash Site runs with stdout/stderr redirected, one per arm, there are no FATAL, ASSERT, device-lost, VK_ERROR or exception lines, and no [gpu] mapped buffer fallback lines, so every BAR allocation was placed in BAR memory. The [gpu] lines are the same 26 kinds in both arms.

AI-assisted: yes (Claude Code)

XairRrR
XairRrR previously requested changes Nov 3, 2026

@XairRrR XairRrR left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed — changes requested

This pull request does not merge cleanly into main (1c8c0ef): head 4e93e34 conflicts in

  • core/libs/prx/libSceAgcDriver/CMakeLists.txt
  • core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
  • core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
  • core/libs/prx/libSceAgcDriver/tests/BufferPool.cpp

Please rebase it onto current main. I will review the change once it merges cleanly.

Device-local snapshot buffers skipped the byte compare to avoid reading
resizable BAR memory back, so every CPU store of identical bytes copied
the draw input again. Keep a host copy of each device-local storage
snapshot, compare against it, and write changed blocks to both; BAR is
never read.
@JJenkx

JJenkx commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

I checked head 4e93e34d8e on plain main 1e24993fa3a7 (2026-11-05). This needs four conflict resolutions on that base. I prepared and tested a private compatibility integration, leaving your branch untouched: source dc4d864d67, branch evidence/9712-main1e-20261105.

The resolutions preserve main's retained-part memory accounting and staging-headroom gate, keep your selected slab memory type and mapped-memory fallback, unify the mock memory-type mask fields, retain both sets of tests, and register agc_draw_input_memory in main's split recorder CMake fragment. The archive includes the resolution diff and a complete candidate patch against the pinned main.

Linux 7.2.11-arch1-1, GCC16.2.1, RX6650XT8GB with full8GB PCI BAR, RADV Mesa26.2.6-arch1.1:

  • Full SDK (libs) and relinker build: passed; conventions: passed.
  • Allocation/memory-accounting CPU tests: 4/4 on main, 4/4 on the integration, including the BAR placement/fallback and main staging-headroom test calls.
  • Same focused Vulkan selection on each side: ^(agc_driver_graphics|agc_driver_sparse_dma_buf_cpu_lead)$, 2/2 each, no skips, verified real validation-layer insertion, zero VUIDs, unchanged source/SDK hashes. ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation; strict shared-backing CPU-lead GPU fill/publication/readback coverage was checked, not inferred from a skipped fixture.
  • New agc_draw_input_memory: passed on the integration with the real device and validation layer, no skip/VUID, checked marker present. This checks host-resident index copies and independence from a later guest write; it is not a rendered game test.

Logs, exact pins, patches and per-file hashes (27,619 bytes; uploaded/downloaded SHA-256 verified): 0654b490d9677deec8e1d7486abdd9d9acd3f11739dfff98c262454d5cb9f95d.

This is scoped compatibility/regression evidence, not title performance evidence, a new negative-control run, or a claim that the original branch is rebased/mergeable. No native game was launched with this integration. The larger live-buffer allocations in my separate plain-main Trek memory diagnostic also mean I will measure memory pressure before assuming additional BAR placement helps that title.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 5, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head 601e9e9 merged onto main 4639eff · tested 2026-11-05 09:19 UTC · 40 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,867 passed · 9 failed (0 new, 8 also fail on main, 1 unstable on main) · 67 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,943 of 3,962 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (996 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 121.8 s, ⚠️ agc_driver_image_sample_unnormalized 58.0 s, ⚠️ public_headers 52.2 s, ⚠️ agc_driver_lazy_resolved_abi 50.0 s, ⚠️ agc_driver_stream_copy 37.7 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 9 of the last 10 main runs
Failing on main too (8, not counted against this PR)
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (2, not in the main baseline's validation pass)
agc_draw_input_memory
guest_job_manager_worker_spin_scale_0.1
Validation IDs already present on main (4 IDs in 556 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (556 tests): agc_driver, agc_driver_address_draw_space_reuse, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, and 548 more
VUID-vkCmdCopyImage-srcImage-01548 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (67)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_recorded_draw_staging: skipped, the device does not keep host imports write-watched, so the target is never resident
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_idle_publish_wait: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a forced watch of the import reads its submissions as CPU stores
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_net_ctl_disconnected: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_disabled: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_four_k: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_height_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_limit: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_malformed: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | 
Reproduce
git fetch origin 601e9e99a9aca5301ed0eaf79449540debc644e5 4639eff7f4c23325a916875a0e37f1e312fa18f4
git checkout 4639eff7f4c23325a916875a0e37f1e312fa18f4 && git merge --no-ff 601e9e99a9aca5301ed0eaf79449540debc644e5
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 601e9e9 merged onto main c5bd55a · tested 2026-11-05 10:03 UTC · 27 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,883 passed · 4 failed (0 new, 3 also fail on main, 1 unstable on main) · 55 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,942 of 3,972 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (991 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 3 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (1, not in the main baseline's validation pass)
agc_draw_input_memory
Validation IDs already present on main (9 IDs in 550 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (550 tests): agc_driver, agc_driver_address_draw_space_reuse, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, and 542 more
VUID-VkShaderModuleCreateInfo-pCode-08737 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08739 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08741 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
VUID-VkPipelineShaderStageCreateInfo-module-parameter (1 test): agc_driver_float16_unused_nan_payloads
VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849 (1 test): agc_driver_float16_unused_nan_payloads
Skipped (55)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_stencil_ref_export: skipped, the device lacks VK_EXT_shader_stencil_export
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_net_ctl_disconnected: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_disabled: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_four_k: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_height_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_limit: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_malformed: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_width_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no disp
Reproduce
git fetch origin 601e9e99a9aca5301ed0eaf79449540debc644e5 c5bd55a89a07d39840867cc671f622f3d7c4869c
git checkout c5bd55a89a07d39840867cc671f622f3d7c4869c && git merge --no-ff 601e9e99a9aca5301ed0eaf79449540debc644e5
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@oneandonlydean
oneandonlydean dismissed stale reviews from adriadam10 and XairRrR November 5, 2026 15:25

Stale: the points on head 174fe9b (index scans from the bound copy, host fallback for mapped device-local buffers and slabs, memoryTypeBits without a mapped device-local type) are fixed and covered by tests, and main is merged into the current head 601e9e9.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

Hi @panicDa3m0n, thanks for this. To get it merged we pushed a merge of current main to your branch. The conflicts, and how each was resolved:

  • main moved the recorder test registrations into tests/cmake/agc_driver_recorder_tests.cmake, so agc_draw_input_memory is now registered there, also in the Windows PATH list.
  • main added a device-local headroom check to Buffer::Buffer. It now runs after your mapped placement and uses placedBytes.
  • main added mock.typeBits to tests/BufferPool.cpp for the same purpose as your mock.memoryTypeBits. Your tests now use typeBits, so the mock has one field.
  • SlabSlot, SlabBlock and TakeSlot keep your memoryType fields and the hostType parameter on top of main's image suballocation changes.

Thanks also to @JJenkx, whose separate integration of this PR onto main (evidence/9712-main1e-20261105, dc4d864) resolved the same five conflicts the same way; the only differences are the mock field name in tests/BufferPool.cpp (one field either way) and one #ifdef __APPLE__ that our merge indented in Resources.cpp (whitespace only).

We also pushed one small fix on top, in Graphics/src/Recorder.cpp (refreshDrawSnapshot, KeepDrawSnapshot) and Recorder.hpp:

  • With the snapshot in resizable BAR memory, refreshDrawSnapshot skipped CompareSpans (to avoid reading BAR back). That meant every CPU store of identical bytes copied the draw input again, which agc_driver_recorder catches ("a CPU store of the same bytes made the draw input copy again") on a ReBAR GPU.
  • Each device-local storage snapshot now keeps a host copy of its bytes. The compare runs against that copy, changed blocks are written to both BAR and the copy, and BAR is never read. The host copy is extra host memory up to the storage snapshot budget.
  • This repeated copy on unchanged data is likely part of the NVIDIA slowdown we asked about on 30 Oct.

Tested on Linux with an RTX 4090: agc_driver_recorder failed before the fix and passes after it; the full ^agc_ suite with the Vulkan validation layer passes (1311 passed, 14 skipped, no new validation messages). Paired A/B vs main on the same machine, in-level in PPSA21564: fps is within noise (median of 3 paired rounds: Rocket Space Station 4.58 vs 4.56, Big Hand Pirate Island 3.13 vs 3.23; main alone varied 9% and 2.5% between rounds), driver time per draw packet is unchanged (30.4 vs 30.4 µs and 19.3 vs 19.3 µs), and time per draw on the submitting thread was 7.75 vs 7.57 µs and 4.85 vs 4.69 µs in one profiled pair per level, inside the 7.57 to 7.78 µs that main itself measured in different runs.

@oneandonlydean
oneandonlydean dismissed MarcZX10’s stale review November 5, 2026 21:44

The RTX 4090 title/menu regression does not reproduce on the current head. Paired same-machine A/B, RTX 4090, empty NVIDIA shader cache per arm: main 0540ef0 vs head 601e9e9. Title: 31.1 vs 31.2 fps, p50 32.0 vs 31.9 ms, p99 35.1 vs 34.5 ms. Menu: 30.3 vs 30.2 fps, p50 32.7 vs 32.6 ms, p99 39.4 vs 39.8 ms. Differences are at most 0.6 ms, within run-to-run noise, with no 2 ms / 6-8% slowdown. The PR is also mergeable against current main now.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* build docs perf Performance change

Projects

None yet

Development

Successfully merging this pull request may close these issues.