Skip to content

perf(agc): GPU descriptor heap on VK_EXT_descriptor_heap (APS5_GPU_HEAP) - #9508

Open
Raghav314 wants to merge 156 commits into
boykopovar:mainfrom
Raghav314:perf/agc-vk-descriptor-heap
Open

Raghav314 wants to merge 156 commits into
boykopovar:mainfrom
Raghav314:perf/agc-vk-descriptor-heap

Conversation

@Raghav314

@Raghav314 Raghav314 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

What

An opt-in GPU descriptor heap, APS5_GPU_HEAP=1, built on VK_EXT_descriptor_heap. Stages that can use it stop rebuilding and binding descriptor sets on the CPU for every draw and dispatch. It builds on the draw pipeline (#6946, merged) and replaces #6947, which is closed.

  • Heaps. One resource heap (one pool of 233415 image slots shared by every binding kind, after the 57 slots each kind reserves for its absent descriptor; APS5_HEAP_SLOT_CAP) and one sampler heap (2048 slots, D3D12's limit), both in device-local host-visible memory when the device has it (APS5_NO_HEAP_DEVICE_DESCRIPTORS keeps them in host-visible memory). Per-draw shader data, the flattened SRT and the image table map go into a ring. When the resource heap has room for the ring (at most maxResourceHeapSize, in whole 2 MiB chunks; 20 MiB on NVIDIA), the ring sits inside the resource heap after the descriptors, and each stage reads its shader data as a uniform buffer mapped from heap data (VK_DESCRIPTOR_MAPPING_SOURCE_RESOURCE_HEAP_DATA_EXT) at the ring offset already in its push data, the way vkd3d-proton reads root constant buffers as uniform buffers. Each stage also writes a run of storage buffer descriptors into the ring, its flattened SRT then its guest buffers, and the pipeline maps the stage's SRT and buffer bindings over that run with VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT, the way vkd3d-proton binds descriptor tables. Otherwise the ring is its own buffer and shaders reach shader data, the SRT and guest buffers by pushed address. The table map is always read by address. A heap draw binds no descriptor set.
  • GPU-mode stages. A vertex, fragment or compute stage whose images all come from descriptors is recompiled in GPU mode (gpuResolvedImages). Its image metadata names the binding element, and the driver writes the resolved heap slots into the stage's shader data. Guest buffers are read by device address (addressedBuffers), not through storage buffer descriptors: through read-only (NonWritable) pointers when the shader writes no guest memory, the rule Mesa infers for per-draw bindings, and with clamped, branch-free loads that return zero out of range. A stage whose module doesn't map onto the heap, or a draw whose stages come out mixed, is rebuilt on the per-draw path.
  • Coverage.
    • Sampled and storage images and samplers.
    • Image, storage image and sampler tables, image atomics through tables included.
    • Compute dispatches, including indirect dispatches with thread dimensions (their thread limit is written into the dispatch's own ring span).
    • Detile and repack passes, the presentation pass, and in-place refreshes of fast-cleared storage images.
  • Reuse.
    • A heap stage keeps one compiled template per binding plan shape, and each draw carries its own descriptor words.
    • Unchanged stage data reuses its ring span while the ring chunk is held.
    • A heap image slot is copied from the view's already encoded descriptor instead of calling vkWriteResourceDescriptorsEXT again (keyed by view, layout and kind, with a generation check), as vkd3d-proton copies CPU descriptors.
    • Each Vulkan device function is resolved once per device instead of by name on every call.
    • The CPU walk of a heap stage is memoized and admitted on its second sighting.
    • An address-based draw whose BDA accesses only read reuses its address space within the collect epoch.
  • Pipeline journal. The journal knows the heap layouts, so GPU-mode pipelines are replayed on the next run.
  • Without the extension, or on a device whose heaps can't hold those slots, every stage takes the existing per-draw path, so lavapipe CI and other drivers are unaffected. The heap also stays off, with one log line, when the driver's VK_EXT_descriptor_heap is an older revision than the released one (specVersion below VK_EXT_DESCRIPTOR_HEAP_SPEC_VERSION; a pre-release revision crashed every heap test on an earlier 595.99.02 build, and 595.99.02 now runs the heap), or when VK_LAYER_KHRONOS_validation older than 1.4.363 is enabled (older layers check heap push data against the pre-heap rules).
  • Vulkan-Headers goes to 1.4.340, the first release with VK_EXT_descriptor_heap.

APS5_VERIFY_GPU_HEAP=1 checks sampled heap slots against the bound textures and storage heap slots against the bound image and view, rebuilds 1 in N GPU-mode stages on the per-draw path and compares them, and fails when a reused stage data span would differ ([heap-slots], [gpu-heap]). APS5_GPU_HEAP_EXCLUDE sends stage classes (compute, pixel, ..., tables, storage, sampled) to the per-draw path while the heap stays on, for bisecting.

PPSA36082 (Hades II)

Title and scene: PPSA36082 (Hades II) 01.006.000, the hub (Crossroads), player standing still, 1920x1080, APS5_TRACE_SECONDS=60:10. Captured as the Performance report form describes: same machine, scene and settings, in one session on 2026-10-31, main first; caches warm (each build ran once into the hub and the title was restarted before its captures; no shader cache file was written during any capture); no other APS5_TRACE_* or APS5_PROFILE_* switch; log not redirected (each capture ran in its own terminal window). All with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1. Every build had its submodules at their pins ("dirty":false).

Current main still stops Hades II while the hub loads (native multisample depth metadata fill transition is not implemented, then external GPU writes over native multisample depth are not implemented with #6300 alone). #9533 (EagleBearerYS) fixes both, so both builds have #9533 (dcf420e) merged locally, without conflicts:

presents / 10 s frame p50 p90 p99 GPU busy per present queue worker busy
main 0835ec8 + #9533, APS5_DRAW_PIPELINE=1 952 10.41 ms 11.20 ms 12.26 ms 2.34 ms 97%
this PR 95e1f33 + #9533, APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 1032 9.55 ms 10.73 ms 11.94 ms 2.29 ms 96%
main 0835ec8 + #9533 (no draw pipeline) 902 11.02 ms 11.79 ms 12.95 ms 2.44 ms 97%

The first two rows are the comparison (same draw pipeline, captured back to back): with the heap the frame p50 is 8% lower and presents 8% higher. The GPU is busy about 2.3 ms of a 10 ms frame in all of them: Hades II is bound by the queue worker recording draws, which is what the heap shortens. The third row is main with its default settings, for reference.

Summary lines

main 0835ec8 + #9533, APS5_DRAW_PIPELINE=1

{"commit":"9837bacfcdac","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":5794,"ms":10004.558},"presents":952,"frame_ms":{"p50":10.414,"p90":11.198,"p99":12.259,"max":13.377},"gpu_busy_ms_per_present":2.344,"worker_busy_pct":{"queue worker 0x0":96.595},"top_phases_ms_per_frame":{"Driver.Packet":10.142,"Driver.Packet.draw":7.277,"Graphics.Draw":7.264,"Driver.Draw":7.206,"Driver.DrawFinish":6.438,"Graphics.Draw.draw_and_resource_release":6.036,"Driver.Draw.prepare":4.157,"Driver.DrawFinish.shader_compile_and_link":3.928},"trace_dropped":false,"trace":"aps5-trace-9837bacfcdac-823993.json.gz"}

this PR 95e1f33 + #9533, APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1

{"commit":"37724aa7680e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_GPU_HEAP":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":6131,"ms":10008.044},"presents":1032,"frame_ms":{"p50":9.552,"p90":10.734,"p99":11.937,"max":13.199},"gpu_busy_ms_per_present":2.285,"worker_busy_pct":{"queue worker 0x0":96.278},"top_phases_ms_per_frame":{"Driver.Packet":9.327,"Driver.Packet.draw":6.576,"Driver.Draw":6.507,"Driver.DrawFinish":6.079,"Graphics.Draw":6.022,"Graphics.Draw.draw_and_resource_release":4.888,"Driver.DrawFinish.shader_compile_and_link":4.021,"Driver.Draw.prepare":3.902},"trace_dropped":false,"trace":"aps5-trace-37724aa7680e-824541.json.gz"}

main 0835ec8 + #9533 (no draw pipeline)

{"commit":"9837bacfcdac","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":5563,"ms":10006.024},"presents":902,"frame_ms":{"p50":11.019,"p90":11.793,"p99":12.945,"max":15.162},"gpu_busy_ms_per_present":2.436,"worker_busy_pct":{"queue worker 0x0":97.470},"top_phases_ms_per_frame":{"Driver.Packet":10.801,"Driver.Packet.draw":9.072,"Driver.Draw":8.983,"Graphics.Draw":7.347,"Graphics.Draw.draw_and_resource_release":6.089,"Driver.Draw.shader_compile_and_link":5.295,"Shader.DrawStage":3.481,"Shader.DrawStage.capture_resources":1.745},"trace_dropped":false,"trace":"aps5-trace-9837bacfcdac-821781.json.gz"}

Traces:

Digests (python3 tools/trace_digest.py <trace>)

`main` 0835ec8 + #9533, `APS5_DRAW_PIPELINE=1`

seconds 60:10 from present 5794: 952 presents, frame p50 10.4 / p90 11.2 / p99 12.3 / max 13.4 ms, GPU busy 2.3 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-3-cachyos, 1920x1080, commit 9837bacfcdac, dropped: no

{"commit":"9837bacfcdac","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":5794,"ms":10004.558},"presents":952,"frame_ms":{"p50":10.414,"p90":11.198,"p99":12.259,"max":13.377},"gpu_busy_ms_per_present":2.344,"worker_busy_pct":{"queue worker 0x0":96.595},"top_phases_ms_per_frame":{"Driver.Packet":10.142,"Driver.Packet.draw":7.277,"Graphics.Draw":7.264,"Driver.Draw":7.206,"Driver.DrawFinish":6.438,"Graphics.Draw.draw_and_resource_release":6.036,"Driver.Draw.prepare":4.157,"Driver.DrawFinish.shader_compile_and_link":3.928},"trace_dropped":false,"trace":"aps5-trace-9837bacfcdac-823993.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 6381: 13.4 ms at 6177 ms: Driver.Packet (queue worker 0x0) 5.6, Graphics.Draw (draw committer) 4.7, batch (gpu) 4.3, Driver.Packet.draw (queue worker 0x0) 4.2
  • present 6073: 13.1 ms at 2921 ms: Driver.Packet (queue worker 0x0) 4.0, Driver.Packet.draw (queue worker 0x0) 3.6, Driver.Draw (queue worker 0x0) 3.6, Driver.Draw.prepare (queue worker 0x0) 3.2
  • present 6374: 12.8 ms at 6097 ms: Graphics.Draw (draw committer) 5.0, batch (gpu) 4.6, Graphics.Draw.draw_and_resource_release (draw committer) 4.4, Driver.Packet (queue worker 0x0) 4.1
  • present 6609: 12.8 ms at 8568 ms: Driver.Packet (queue worker 0x0) 4.3, Graphics.Draw (draw committer) 3.3, Driver.Packet.draw (queue worker 0x0) 2.5, Driver.Draw (queue worker 0x0) 2.5
  • present 6129: 12.6 ms at 3514 ms: Driver.Packet (queue worker 0x0) 3.7, batch (gpu) 2.7, Graphics.Draw (draw committer) 2.6, Driver.Packet.draw (queue worker 0x0) 2.4

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 2.2 (21 %) 0.0 (0 %) 8.3 27.5 Driver.Packet 2.2, Driver.Completion 0.0
draw committer 2.9 (27 %) 0.1 (1 %) 7.6 10.3 Graphics.Draw 2.9, Recorder.Submit 0.0
title 0.0 (0 %) 0.0 (0 %) 10.5 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
draw finisher 1.5 (14 %) 0.0 (0 %) 9.0 16.6 Driver.DrawFinish 1.5
presenter 0.5 (4 %) 0.0 (0 %) 10.0 0.1 VideoOut.Flip 0.5, Driver.Present 0.0
gpu 2.3 (22 %) 0.0 (0 %) 8.2 0.0 batch 2.3

Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 2.9, batch 2.3, Driver.Packet 2.2, Graphics.Draw.draw_and_resource_release 2.1, Driver.Packet.draw 1.5, Driver.Draw 1.5, Driver.DrawFinish 1.5, Driver.DrawFinish.draw_enqueued 1.0, Driver.Draw.prepare 0.6, Driver.Draw.draw_handed_off 0.6

Longest waits

  • Driver.Present.render_fence_wait (presenter) 1.3 ms at 6063 ms, present 6371
  • GpuMutex.wait.hook (presenter) 0.8 ms at 7538 ms, present 6510
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 2805 ms, present 6062
  • Driver.Present.gpu_mutex_wait (presenter) 0.4 ms at 2730 ms, present 6055
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 4671 ms, present 6239
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 3832 ms, present 6159
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 2480 ms, present 6031
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 2989 ms, present 6079
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 5209 ms, present 6290
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 5284 ms, present 6297

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

  • batch 8213: 1.9 ms at 6066 ms, present 6371: GPU no ranges; recorded by Recorder.Sync (draw committer) 2.2, Graphics.Draw (draw committer) 0.7, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
  • batch 8240: 1.8 ms at 6089 ms, present 6373: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.5, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
  • batch 8226: 1.7 ms at 6077 ms, present 6372: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.3, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
  • batch 8255: 1.4 ms at 6101 ms, present 6374: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.5, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 8432: 1.2 ms at 6239 ms, present 6386: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.2, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
this PR 95e1f33 + #9533, `APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1`

seconds 60:10 from present 6131: 1032 presents, frame p50 9.6 / p90 10.7 / p99 11.9 / max 13.2 ms, GPU busy 2.3 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-3-cachyos, 1920x1080, commit 37724aa7680e, dropped: no

{"commit":"37724aa7680e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_GPU_HEAP":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":6131,"ms":10008.044},"presents":1032,"frame_ms":{"p50":9.552,"p90":10.734,"p99":11.937,"max":13.199},"gpu_busy_ms_per_present":2.285,"worker_busy_pct":{"queue worker 0x0":96.278},"top_phases_ms_per_frame":{"Driver.Packet":9.327,"Driver.Packet.draw":6.576,"Driver.Draw":6.507,"Driver.DrawFinish":6.079,"Graphics.Draw":6.022,"Graphics.Draw.draw_and_resource_release":4.888,"Driver.DrawFinish.shader_compile_and_link":4.021,"Driver.Draw.prepare":3.902},"trace_dropped":false,"trace":"aps5-trace-37724aa7680e-824541.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 6212: 13.2 ms at 816 ms: batch (gpu) 5.6, Driver.Packet (queue worker 0x0) 5.1, Driver.Packet.draw (queue worker 0x0) 4.6, Driver.Draw (queue worker 0x0) 4.6
  • present 6206: 12.8 ms at 748 ms: Driver.Packet (queue worker 0x0) 4.4, batch (gpu) 4.4, Driver.Packet.draw (queue worker 0x0) 3.3, Driver.Draw (queue worker 0x0) 3.3
  • present 7064: 12.6 ms at 9063 ms: Driver.Packet (queue worker 0x0) 3.3, Driver.Packet.draw (queue worker 0x0) 3.0, Driver.Draw (queue worker 0x0) 3.0, Driver.Draw.prepare (queue worker 0x0) 2.5
  • present 6221: 12.5 ms at 906 ms: Driver.Packet (queue worker 0x0) 3.7, Driver.Packet.draw (queue worker 0x0) 3.5, Driver.Draw (queue worker 0x0) 3.5, Driver.DrawFinish (draw finisher) 3.3
  • present 6200: 12.5 ms at 680 ms: batch (gpu) 4.7, Driver.Packet (queue worker 0x0) 4.4, Driver.Packet.draw (queue worker 0x0) 3.6, Driver.Draw (queue worker 0x0) 3.6

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 1.8 (18 %) 0.0 (0 %) 7.9 25.7 Driver.Packet 1.8, Driver.Completion 0.0
draw committer 1.1 (12 %) 0.1 (1 %) 8.5 10.1 Graphics.Draw 1.1, Recorder.Reap 0.0
title 0.0 (0 %) 0.0 (0 %) 9.7 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
draw finisher 1.1 (11 %) 0.0 (0 %) 8.6 16.0 Driver.DrawFinish 1.1
presenter 0.4 (4 %) 0.0 (0 %) 9.3 0.1 VideoOut.Flip 0.4, Driver.Present 0.0
gpu 2.3 (24 %) 0.0 (0 %) 7.4 0.0 batch 2.3

Largest slices (ms per frame, inclusive, all threads): batch 2.3, Driver.Packet 1.8, Driver.Packet.draw 1.3, Driver.Draw 1.2, Graphics.Draw 1.1, Driver.DrawFinish 1.1, Graphics.Draw.draw_and_resource_release 0.9, Driver.Draw.prepare 0.7, Driver.DrawFinish.draw_enqueued 0.6, Recorder.Sync 0.5

Longest waits

  • Driver.Present.gpu_mutex_wait (presenter) 0.6 ms at 3023 ms, present 6443
  • Driver.Present.render_fence_wait (presenter) 0.5 ms at 704 ms, present 6202
  • Driver.Present.render_fence_wait (presenter) 0.5 ms at 9037 ms, present 7061
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 8920 ms, present 7049
  • Driver.Present.gpu_mutex_wait (presenter) 0.4 ms at 2010 ms, present 6337
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 9371 ms, present 7096
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 5799 ms, present 6728
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 9104 ms, present 7068
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 5557 ms, present 6703
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 5666 ms, present 6714

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

  • batch 1156: 1.9 ms at 797 ms, present 6210: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 1187: 1.9 ms at 821 ms, present 6212: GPU no ranges; recorded by Recorder.Sync (draw committer) 3.2, Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.0
  • batch 1068: 1.4 ms at 728 ms, present 6204: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 1024: 1.4 ms at 696 ms, present 6201: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 1112: 1.4 ms at 764 ms, present 6207: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
`main` 0835ec8 + #9533 (no draw pipeline)

seconds 60:10 from present 5563: 902 presents, frame p50 11.0 / p90 11.8 / p99 12.9 / max 15.2 ms, GPU busy 2.4 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-3-cachyos, 1920x1080, commit 9837bacfcdac, dropped: no

{"commit":"9837bacfcdac","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"60:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-3-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31742,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 60:10","first_present":5563,"ms":10006.024},"presents":902,"frame_ms":{"p50":11.019,"p90":11.793,"p99":12.945,"max":15.162},"gpu_busy_ms_per_present":2.436,"worker_busy_pct":{"queue worker 0x0":97.47},"top_phases_ms_per_frame":{"Driver.Packet":10.801,"Driver.Packet.draw":9.072,"Driver.Draw":8.983,"Graphics.Draw":7.347,"Graphics.Draw.draw_and_resource_release":6.089,"Driver.Draw.shader_compile_and_link":5.295,"Shader.DrawStage":3.481,"Shader.DrawStage.capture_resources":1.745},"trace_dropped":false,"trace":"aps5-trace-9837bacfcdac-821781.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 6117: 15.2 ms at 6127 ms: Driver.Packet (queue worker 0x0) 5.0, Driver.Packet.draw (queue worker 0x0) 4.8, Driver.Draw (queue worker 0x0) 4.7, Graphics.Draw (draw committer) 3.9
  • present 6236: 14.4 ms at 7464 ms: Driver.Packet (queue worker 0x0) 6.1, Driver.Packet.draw (queue worker 0x0) 5.9, Driver.Draw (queue worker 0x0) 5.9, Graphics.Draw (draw committer) 4.2
  • present 6116: 14.3 ms at 6113 ms: Driver.Packet (queue worker 0x0) 5.5, Driver.Packet.draw (queue worker 0x0) 4.8, Driver.Draw (queue worker 0x0) 4.8, Graphics.Draw (draw committer) 3.7
  • present 5858: 14.0 ms at 3265 ms: Driver.Packet (queue worker 0x0) 5.6, Driver.Packet.draw (queue worker 0x0) 5.1, Driver.Draw (queue worker 0x0) 5.1, Graphics.Draw (draw committer) 3.4
  • present 6363: 13.3 ms at 8866 ms: Driver.Packet (queue worker 0x0) 4.5, Driver.Packet.draw (queue worker 0x0) 4.3, Driver.Draw (queue worker 0x0) 4.3, Graphics.Draw (draw committer) 2.9

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 2.8 (25 %) 0.0 (0 %) 8.3 35.8 Driver.Packet 2.8, Driver.Completion 0.0
draw committer 2.8 (25 %) 0.1 (1 %) 8.2 10.6 Graphics.Draw 2.8, Recorder.Submit 0.0
title 0.0 (0 %) 0.0 (0 %) 11.1 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
presenter 0.4 (4 %) 0.0 (0 %) 10.7 0.1 VideoOut.Flip 0.4, Driver.Present 0.0
gpu 2.4 (22 %) 0.0 (0 %) 8.7 0.0 batch 2.4

Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 2.8, Driver.Packet 2.8, Driver.Packet.draw 2.7, Driver.Draw 2.6, batch 2.4, Graphics.Draw.draw_and_resource_release 2.0, Driver.Draw.shader_compile_and_link 0.5, Driver.Draw.draw_enqueued 0.5, VideoOut.Flip 0.4, VideoOut.Flip.present 0.4

Longest waits

  • Driver.Present.render_fence_wait (presenter) 0.6 ms at 8725 ms, present 6350
  • Driver.Present.render_fence_wait (presenter) 0.6 ms at 6249 ms, present 6127
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 3640 ms, present 5892
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 1236 ms, present 5675
  • Driver.Present.render_fence_wait (presenter) 0.4 ms at 8989 ms, present 6374
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 8526 ms, present 6332
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 4992 ms, present 6015
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 1597 ms, present 5707
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 859 ms, present 5641
  • Driver.Present.render_fence_wait (presenter) 0.3 ms at 136 ms, present 5575

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

  • batch 4828: 0.9 ms at 3590 ms, present 5887: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
  • batch 12479: 0.9 ms at 9274 ms, present 6399: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 929: 0.8 ms at 688 ms, present 5625: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.9, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 3291: 0.8 ms at 2457 ms, present 5784: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 1581: 0.7 ms at 1172 ms, present 5669: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
Previous capture (superseded): main 1189ec3 + #9533 against this PR d8c243b + #9533, 2026-10-30
presents / 10 s frame p50 p90 p99 GPU busy per present queue worker busy
main 1189ec3 + #9533 896 11.10 ms 11.88 ms 12.96 ms 2.38 ms 97%
this PR d8c243b + #9533, APS5_DRAW_PIPELINE=1 929 10.68 ms 11.47 ms 13.07 ms 2.38 ms 97%
this PR d8c243b + #9533, APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 1015 9.72 ms 10.75 ms 12.30 ms 2.25 ms 96%

Traces: https://github.com/Raghav314/AnyPS5/releases/tag/perf-traces-9508-hades-hub

Earlier comparison (superseded): main a6dcea9 + #6300 against this PR 23b2a3f + #6300

That comparison is kept for the record. Its main trace (de49f41349a9) reported dropped: yes: the trace dropped events, so its digest undercounts slices for that capture, while its summary line's frame times are complete. The two PR traces reported dropped: no. None of the three captures above dropped events.

Title and scene: PPSA36082 (Hades II), the hub (Crossroads), player standing still, APS5_TRACE_SECONDS=120:10. Caches warm: each setting was run once into the hub and the title restarted before its capture. No other APS5_TRACE_* or APS5_PROFILE_* switch, log not redirected (the title ran in a terminal). All three with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 and nothing else changed.

Current main stops Hades II while the hub loads (native multisample depth metadata fill transition is not implemented), so every build here has #6300 merged locally. The main build is a6dcea9 + #6300 (local merge commit de49f41349); this PR's is 23b2a3f + #6300 (local merge commit 568369d27a), the PR as of the descriptor heap rebind fix on main a6dcea9. Since then the PR's commits changed only by test-only commits and rebases onto newer main; the numbers were not captured again on the current head.

presents / 10 s frame p50 p99 GPU busy per present queue worker busy
main a6dcea9 + #6300 706 14.0 ms 18.7 ms 2.22 ms 98%
this PR + #6300, APS5_DRAW_PIPELINE=1 886 11.2 ms 13.7 ms 2.34 ms 96%
this PR + #6300, APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 1014 9.7 ms 12.1 ms 2.08 ms 96%

The heap is +14% over the draw pipeline alone and +44% over main.

Summary lines

main a6dcea9 + #6300

{"commit":"de49f41349a9","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":8859,"ms":10001.243},"presents":706,"frame_ms":{"p50":13.955,"p90":15.665,"p99":18.680,"max":25.064},"gpu_busy_ms_per_present":2.224,"worker_busy_pct":{"queue worker 0x0":97.766},"top_phases_ms_per_frame":{"Driver.Packet":13.844,"Driver.Packet.draw":11.959,"Driver.Draw":11.850,"Driver.Draw.shader_compile_and_link":8.284,"Graphics.Draw":8.166,"Graphics.Draw.draw_and_resource_release":6.859,"Shader.DrawStage":5.206,"Shader.DrawStage.capture_resources":3.196},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":6.816,"events_lost":132221,"totals_full":false}},"trace":"aps5-trace-de49f41349a9-624652.json.gz"}

this PR + #6300, APS5_DRAW_PIPELINE=1

{"commit":"568369d27a2e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":10851,"ms":10010.638},"presents":886,"frame_ms":{"p50":11.172,"p90":12.083,"p99":13.652,"max":41.180},"gpu_busy_ms_per_present":2.340,"worker_busy_pct":{"queue worker 0x0":96.015},"top_phases_ms_per_frame":{"Driver.Packet":10.838,"Driver.Packet.draw":8.115,"Graphics.Draw":8.087,"Driver.Draw":8.030,"Driver.DrawFinish":7.151,"Graphics.Draw.draw_and_resource_release":6.678,"Driver.Draw.prepare":4.793,"Driver.DrawFinish.shader_compile_and_link":4.199},"trace_dropped":false,"trace":"aps5-trace-568369d27a2e-626697.json.gz"}

this PR + #6300, APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1

{"commit":"568369d27a2e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_GPU_HEAP":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":12138,"ms":10004.892},"presents":1014,"frame_ms":{"p50":9.743,"p90":10.718,"p99":12.061,"max":17.616},"gpu_busy_ms_per_present":2.080,"worker_busy_pct":{"queue worker 0x0":95.834},"top_phases_ms_per_frame":{"Driver.Packet":9.445,"Driver.Packet.draw":6.921,"Driver.Draw":6.847,"Graphics.Draw":6.376,"Driver.DrawFinish":6.362,"Graphics.Draw.draw_and_resource_release":5.216,"Driver.Draw.prepare":3.983,"Driver.DrawFinish.shader_compile_and_link":3.903},"trace_dropped":false,"trace":"aps5-trace-568369d27a2e-625697.json.gz"}

Traces:

Digests (python3 tools/trace_digest.py <trace>)

`main` a6dcea9 + #6300

seconds 120:10 from present 8859: 706 presents, frame p50 14.0 / p90 15.7 / p99 18.7 / max 25.1 ms, GPU busy 2.2 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.2.10-1-cachyos, 1920x1080, commit de49f41349a9, dropped: yes

{"commit":"de49f41349a9","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":8859,"ms":10001.243},"presents":706,"frame_ms":{"p50":13.955,"p90":15.665,"p99":18.68,"max":25.064},"gpu_busy_ms_per_present":2.224,"worker_busy_pct":{"queue worker 0x0":97.766},"top_phases_ms_per_frame":{"Driver.Packet":13.844,"Driver.Packet.draw":11.959,"Driver.Draw":11.85,"Driver.Draw.shader_compile_and_link":8.284,"Graphics.Draw":8.166,"Graphics.Draw.draw_and_resource_release":6.859,"Shader.DrawStage":5.206,"Shader.DrawStage.capture_resources":3.196},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":6.816,"events_lost":132221,"totals_full":false}},"trace":"aps5-trace-de49f41349a9-624652.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 9448: 25.1 ms at 8235 ms: Graphics.Draw (draw committer) 8.2, Graphics.Draw.draw_and_resource_release (draw committer) 6.7, batch (gpu) 2.4, Recorder.Sync (draw committer) 0.5
  • present 9447: 21.4 ms at 8214 ms: Graphics.Draw (draw committer) 6.8, Graphics.Draw.draw_and_resource_release (draw committer) 5.3, batch (gpu) 2.2, Recorder.Sync (draw committer) 0.4
  • present 8967: 20.6 ms at 1554 ms: Driver.Packet (queue worker 0x0) 12.8, Driver.Packet.draw (queue worker 0x0) 12.6, Driver.Draw (queue worker 0x0) 12.5, Driver.Draw.shader_compile_and_link (queue worker 0x0) 5.6
  • present 9476: 20.0 ms at 8689 ms: Graphics.Draw (draw committer) 5.0, Graphics.Draw.draw_and_resource_release (draw committer) 3.9, batch (gpu) 2.1, Recorder.Sync (draw committer) 0.4
  • present 9436: 19.6 ms at 8054 ms: Graphics.Draw (draw committer) 5.2, Graphics.Draw.draw_and_resource_release (draw committer) 3.5, batch (gpu) 2.1, Graphics.Draw.validate (draw committer) 0.8

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 3.6 (26 %) 0.0 (0 %) 10.5 28.8 Driver.Packet 3.6, Driver.Draw.shader_compile_and_link 0.0
draw committer 2.6 (18 %) 0.2 (1 %) 11.4 12.8 Graphics.Draw 2.5, Recorder.Reap 0.0
title 0.0 (0 %) 0.0 (0 %) 14.2 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
presenter 0.3 (2 %) 0.0 (0 %) 13.9 0.1 VideoOut.Flip 0.3, Driver.Present 0.0
gpu 2.2 (16 %) 0.0 (0 %) 11.9 0.0 batch 2.2

Largest slices (ms per frame, inclusive, all threads): Driver.Packet 3.6, Driver.Packet.draw 3.5, Driver.Draw 3.4, Graphics.Draw 2.5, batch 2.2, Graphics.Draw.draw_and_resource_release 1.6, Driver.Draw.shader_compile_and_link 1.4, Recorder.Sync 0.3, VideoOut.Flip 0.3, VideoOut.Flip.present 0.3

Longest waits

  • GpuMutex.wait.fill (draw committer) 0.6 ms at 8989 ms, present 9495
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 5107 ms, present 9226
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 9740 ms, present 9547
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 7700 ms, present 9411
  • GpuMutex.wait.fill (draw committer) 0.5 ms at 2460 ms, present 9032
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 1154 ms, present 8940
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 9985 ms, present 9564
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 8917 ms, present 9490
  • Driver.Present.render_fence_wait (presenter) 0.5 ms at 1099 ms, present 8936
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 5976 ms, present 9289

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

  • batch 2230: 0.6 ms at 2082 ms, present 9004: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.7, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
  • batch 8347: 0.5 ms at 7633 ms, present 9406: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.7, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 7720: 0.5 ms at 7050 ms, present 9366: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.6, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 1246: 0.5 ms at 1159 ms, present 8940: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.6, Graphics.Draw.draw_and_resource_release (draw committer) 0.2, Recorder.Reap (draw committer) 0.0
  • batch 9168: 0.5 ms at 8421 ms, present 9459: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.6, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
this PR + #6300, `APS5_DRAW_PIPELINE=1`

seconds 120:10 from present 10851: 886 presents, frame p50 11.2 / p90 12.1 / p99 13.7 / max 41.2 ms, GPU busy 2.3 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.2.10-1-cachyos, 1920x1080, commit 568369d27a2e, dropped: no

{"commit":"568369d27a2e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":10851,"ms":10010.638},"presents":886,"frame_ms":{"p50":11.172,"p90":12.083,"p99":13.652,"max":41.18},"gpu_busy_ms_per_present":2.34,"worker_busy_pct":{"queue worker 0x0":96.015},"top_phases_ms_per_frame":{"Driver.Packet":10.838,"Driver.Packet.draw":8.115,"Graphics.Draw":8.087,"Driver.Draw":8.03,"Driver.DrawFinish":7.151,"Graphics.Draw.draw_and_resource_release":6.678,"Driver.Draw.prepare":4.793,"Driver.DrawFinish.shader_compile_and_link":4.199},"trace_dropped":false,"trace":"aps5-trace-568369d27a2e-626697.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 11411: 41.2 ms at 6239 ms: Driver.Packet (queue worker 0x0) 32.8, Driver.Packet.draw (queue worker 0x0) 31.6, Driver.Draw (queue worker 0x0) 31.6, Driver.Draw.prepare (queue worker 0x0) 30.1
  • present 11229: 16.1 ms at 4198 ms: Driver.Packet (queue worker 0x0) 5.6, Graphics.Draw (draw committer) 4.7, Driver.DrawFinish (draw finisher) 4.6, Driver.Packet.draw (queue worker 0x0) 4.4
  • present 11231: 15.2 ms at 4228 ms: Driver.Packet (queue worker 0x0) 5.0, Graphics.Draw (draw committer) 3.4, Driver.Packet.draw (queue worker 0x0) 3.0, Driver.Draw (queue worker 0x0) 2.9
  • present 11479: 13.8 ms at 7077 ms: Driver.Packet (queue worker 0x0) 4.4, Graphics.Draw (draw committer) 3.8, Driver.Packet.draw (queue worker 0x0) 3.6, Driver.Draw (queue worker 0x0) 3.5
  • present 11407: 13.8 ms at 6190 ms: Driver.Packet (queue worker 0x0) 4.8, Graphics.Draw (draw committer) 3.6, Graphics.Draw.draw_and_resource_release (draw committer) 3.0, Driver.Packet.draw (queue worker 0x0) 3.0

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 2.4 (21 %) 0.0 (0 %) 8.9 29.5 Driver.Packet 2.4, Driver.Completion 0.0
draw committer 2.6 (23 %) 0.2 (2 %) 8.4 12.5 Graphics.Draw 2.6, Recorder.Reap 0.0
title 0.0 (0 %) 0.0 (0 %) 11.3 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
draw finisher 1.7 (15 %) 0.0 (0 %) 9.6 17.8 Driver.DrawFinish 1.7
presenter 0.3 (3 %) 0.0 (0 %) 11.0 0.1 VideoOut.Flip 0.3, Driver.Present 0.0
gpu 2.3 (21 %) 0.0 (0 %) 9.0 0.0 batch 2.3

Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 2.6, Driver.Packet 2.4, batch 2.3, Driver.Packet.draw 1.9, Driver.Draw 1.8, Graphics.Draw.draw_and_resource_release 1.8, Driver.DrawFinish 1.7, Driver.DrawFinish.draw_enqueued 1.0, Driver.Draw.prepare 0.9, Driver.Draw.draw_handed_off 0.5

Longest waits

  • Driver.Present.gpu_mutex_wait (presenter) 1.3 ms at 7138 ms, present 11484
  • GpuMutex.wait.draw (draw committer) 0.8 ms at 6553 ms, present 11434
  • GpuMutex.wait.fill (draw committer) 0.8 ms at 4401 ms, present 11246
  • Driver.Present.gpu_mutex_wait (presenter) 0.7 ms at 690 ms, present 10913
  • GpuMutex.wait.fill (draw committer) 0.6 ms at 1700 ms, present 11004
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 1654 ms, present 11000
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 9033 ms, present 11651
  • GpuMutex.wait.fill (draw committer) 0.6 ms at 4685 ms, present 11272
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 1710 ms, present 11005
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 6239 ms, present 11411

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

  • batch 10494: 0.7 ms at 7733 ms, present 11535: GPU no ranges; recorded by Graphics.Draw (draw committer) 1.0, Recorder.Sync (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.4
  • batch 979: 0.7 ms at 716 ms, present 10915: GPU no ranges; recorded by Graphics.Draw (draw committer) 1.0, Graphics.Draw.draw_and_resource_release (draw committer) 0.3
  • batch 11842: 0.6 ms at 8716 ms, present 11622: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.4
  • batch 13211: 0.6 ms at 9717 ms, present 11711: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.8, Graphics.Draw.draw_and_resource_release (draw committer) 0.4, Recorder.Submit (draw committer) 0.0
  • batch 6893: 0.6 ms at 5013 ms, present 11301: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.3, Graphics.Draw.draw_and_resource_release (draw committer) 0.2
this PR + #6300, `APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1`

seconds 120:10 from present 12138: 1014 presents, frame p50 9.7 / p90 10.7 / p99 12.1 / max 17.6 ms, GPU busy 2.1 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.2.10-1-cachyos, 1920x1080, commit 568369d27a2e, dropped: no

{"commit":"568369d27a2e","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_GPU_HEAP":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31743,"title_id":"PPSA36082","title":"Hades II","content_version":"01.006.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":12138,"ms":10004.892},"presents":1014,"frame_ms":{"p50":9.743,"p90":10.718,"p99":12.061,"max":17.616},"gpu_busy_ms_per_present":2.08,"worker_busy_pct":{"queue worker 0x0":95.834},"top_phases_ms_per_frame":{"Driver.Packet":9.445,"Driver.Packet.draw":6.921,"Driver.Draw":6.847,"Graphics.Draw":6.376,"Driver.DrawFinish":6.362,"Graphics.Draw.draw_and_resource_release":5.216,"Driver.Draw.prepare":3.983,"Driver.DrawFinish.shader_compile_and_link":3.903},"trace_dropped":false,"trace":"aps5-trace-568369d27a2e-625697.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 12364: 17.6 ms at 2219 ms: Driver.Packet (queue worker 0x0) 7.0, Driver.DrawFinish (draw finisher) 5.9, Driver.Packet.draw (queue worker 0x0) 4.9, Driver.Draw (queue worker 0x0) 4.8
  • present 12365: 14.1 ms at 2236 ms: Driver.Packet (queue worker 0x0) 3.5, Driver.Packet.draw (queue worker 0x0) 3.1, Driver.Draw (queue worker 0x0) 3.1, Graphics.Draw (draw committer) 2.6
  • present 12366: 12.8 ms at 2250 ms: Driver.Packet (queue worker 0x0) 3.6, Driver.Packet.draw (queue worker 0x0) 3.1, Driver.Draw (queue worker 0x0) 3.1, Driver.DrawFinish (draw finisher) 2.9
  • present 12396: 12.7 ms at 2557 ms: Driver.Packet (queue worker 0x0) 3.6, Driver.DrawFinish (draw finisher) 2.9, Driver.Packet.draw (queue worker 0x0) 2.8, Driver.Draw (queue worker 0x0) 2.8
  • present 12390: 12.6 ms at 2491 ms: Driver.Packet (queue worker 0x0) 5.2, Driver.Packet.draw (queue worker 0x0) 3.8, Driver.Draw (queue worker 0x0) 3.8, Driver.DrawFinish (draw finisher) 3.5

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 2.0 (21 %) 0.0 (0 %) 7.8 25.5 Driver.Packet 2.0, Driver.EndSubmission 0.0
draw committer 1.2 (12 %) 0.3 (3 %) 8.4 10.6 Graphics.Draw 1.2, Recorder.Submit 0.0
title 0.0 (0 %) 0.0 (0 %) 9.9 0.1 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
draw finisher 1.4 (15 %) 0.0 (0 %) 8.4 15.5 Driver.DrawFinish 1.4
presenter 0.3 (3 %) 0.0 (0 %) 9.5 0.1 VideoOut.Flip 0.4, Driver.Present 0.0
gpu 2.1 (21 %) 0.0 (0 %) 7.8 0.0 batch 2.1

Largest slices (ms per frame, inclusive, all threads): batch 2.1, Driver.Packet 2.0, Driver.Packet.draw 1.6, Driver.Draw 1.5, Driver.DrawFinish 1.4, Graphics.Draw 1.2, Graphics.Draw.draw_and_resource_release 1.0, Driver.DrawFinish.draw_enqueued 0.8, Driver.Draw.prepare 0.7, Driver.Draw.draw_handed_off 0.6

Longest waits

  • GpuMutex.wait.draw (draw committer) 0.7 ms at 2963 ms, present 12436
  • Driver.Present.gpu_mutex_wait (presenter) 0.7 ms at 5204 ms, present 12664
  • GpuMutex.wait.draw (draw committer) 0.6 ms at 8697 ms, present 13020
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 767 ms, present 12216
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 2324 ms, present 12373
  • GpuMutex.wait.fill (draw committer) 0.5 ms at 806 ms, present 12220
  • GpuMutex.wait.fill (draw committer) 0.5 ms at 8757 ms, present 13026
  • GpuMutex.wait.fill (draw committer) 0.5 ms at 7518 ms, present 12901
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 8797 ms, present 13030
  • GpuMutex.wait.draw (draw committer) 0.5 ms at 7732 ms, present 12922

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

  • batch 5868: 0.6 ms at 3966 ms, present 12538: GPU no ranges; recorded by Recorder.Sync (draw committer) 0.7, Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 2770: 0.6 ms at 1858 ms, present 12327: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 2372: 0.6 ms at 1593 ms, present 12300: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1
  • batch 2814: 0.6 ms at 1886 ms, present 12330: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1, Graphics.Draw.validate (draw committer) 0.0
  • batch 8289: 0.6 ms at 5594 ms, present 12704: GPU no ranges; recorded by Graphics.Draw (draw committer) 0.1, Graphics.Draw.draw_and_resource_release (draw committer) 0.1

Where this can take more frame rate

The heap moves descriptor work off the CPU, but Hades II is still CPU-bound: the queue worker is 96–98% busy in all three captures and the GPU is busy about 2.1 ms of a 9.7 ms frame. Follow-ups that build on the heap:

  • Per-draw heap stage writes. Every draw rebuilds its slot key from its bindings and checks slot generations before the reuse checks can skip it. A key cached per resource set would skip most of that.
  • A lighter commit for heap draws. A heap draw binds no descriptor sets, only push data, so back-to-back heap draws with the same pipeline could skip most of the per-draw state and barrier work on the committer.
  • Skipping the CPU walk of repeated draws. The SRT walk of a heap stage still runs on the CPU, memoized. A GPU-side walk over words snapshotted at capture would remove it for repeated draws. An earlier attempt that read live guest memory at GPU time was dropped: it flickered and cost frame rate.
  • Run-time image table lookups (feat(agc): look up table images at run time through a device image table on the GPU heap (APS5_GPU_PATH) #7642) would let table stages skip the CPU table resolve.

Contributions

  • milescoviello: the memory recovery that evicts heap-held sampled textures (d600dfa, 9188f74), and the Ghost of Tsushima bisect.
  • EagleBearerYS (Yunus Shaikh): the three address-space reuse fixes with their tests (1817bbe, 270d43a, 758d23c).
  • Astronaut10: the RX 9070 XT measurement that pointed at the CPU slot-write cost.

Tested

Linux 7.3.0-3-cachyos (CachyOS), x86-64, GCC, Ryzen 7 7800X3D / RTX 4090, NVIDIA 615.78.08.

  • Validation layer, main 90c9759 (this PR's last merge of main) vs this PR's head 229b988 (2026-10-31, same machine and GPU, each tree built Release with submodules at their pins):
T='heap|bindless|image_table|image_atomics|dispatch|presentation|buffer|image_store|depth_storage|storage|view_past|mesh|tessellation|address_draw|indirect|thread_dimensions|draw_cache|pixel|srt'
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "$T" -E keycode -j8 --timeout 300 -V
APS5_GPU_HEAP=1 ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "$T" -E keycode -j8 --timeout 300 -V
main 90c9759 this PR 229b988
tests matching $T 227 333 (the 227, plus this PR's heap tests and *_gpu_heap variants)
passed, default 227 / 227 333 / 333
passed, APS5_GPU_HEAP=1 227 / 227 333 / 333
was not found but was requested by env var VK_INSTANCE_LAYERS 0 0
VUID- lines 0 0

The new tests were checked against the code before their fix: agc_driver_image_converted_unorm_gpu_heap failed with the sampler slot word error before 039b020, and EagleBearerYS's agc_driver_address_draw_space_reuse_heap and _heap_transitions failed on the code before his three commits (the recipe replayed after a changed snapshot; a later free waited out APS5_PIN_WAIT_MS).

  • MCD2 ran 90 s heap runs (APS5_GPU_HEAP=1 APS5_DRAW_PIPELINE=1 APS5_PIPELINE_DISPATCH=1) on the head's build with and without APS5_NO_HEAP_DATA_UNIFORM APS5_NO_HEAP_DEVICE_DESCRIPTORS: no driver failures, no VUID- lines. (APS5_NO_HEAP_DATA_UNIFORM has since been removed.)
  • Earlier, on main c9b2660, the whole ctest (2128 tests) on the PR as it was then: all pass except agc_driver_sample_order, agc_driver_sample_order_grid_reference and agc_driver_sample_order_recipe_depth_locations, which fail the same way without this PR. agc_host_import_sparse and agc_driver_sparse_dma_buf_import skip on this machine (its udmabuf size limit is above 1024 MiB).
  • The *_gpu_heap tests run the draw pipeline PR's switched tests and the sampling, table, atomics, compute, mesh relocation and thread-dimension dispatch tests with APS5_GPU_HEAP=1 APS5_VERIFY_GPU_HEAP=1.
  • Hades II as above (with fix(agc): import native multisample D32S8 targets with a separate stencil plane and a depth-only HTILE #9533 merged locally). Astro's Playroom (PPSA01325) runs into the game with both switches, with no flicker.

Known limits

  • A stage whose module keeps a set 0 binding the heap does not map (registration-module storage images) takes the per-draw path, and so does every other stage of its draw, because a pipeline binds either from the heap or from descriptor sets. So does a stage that needs more image slots than the shared pool holds. The technical debt file lists them.
  • The heap needs the released revision of VK_EXT_descriptor_heap, and heaps that hold the shared image slot pool and 2048 samplers. Other devices run the existing path.
  • Ghost of Tsushima (PPSA02225) whited out with the heap on when compute stages wrote storage images through it (milescoviello's bisect). eb60688 and 95e1f33 fixed the two heap paths that made such stores write zeros (multisampled targets, and uint stores through image tables), each with a _gpu_heap test. milescoviello confirmed the white-out is gone, and the full heap runs in-game to his 1,200 s timeout.

Testing other titles

Please post:

  • the title ID, GPU, driver and OS;
  • the summary line (APS5_TRACE_SECONDS=70:10, captured as the Performance report form describes: warm caches, no other trace or profile switch, log not redirected) with APS5_DRAW_PIPELINE=1 and with APS5_GPU_HEAP=1 APS5_DRAW_PIPELINE=1, both with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 and nothing else changed;
  • whether anything renders differently (wrong or missing textures, flicker);
  • with APS5_VERIFY_GPU_HEAP=1, the last [heap-slots] and [gpu-heap] lines (a slot holding another texture or a differing stage is a bug).

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 (Vulkan-Headers bumped to 1.4.340)
  • Generic behaviour, not specific to one title
  • Depends on: none (perf(agc): draw finisher pipeline (APS5_DRAW_PIPELINE) #6946 is merged)
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 4090, 615.78.08, Linux 7.3.0-3-cachyos (CachyOS)
  • AI-assisted: yes

@github-actions github-actions Bot added perf Performance change perf numbers missing perf pull request without a before and after summary line labels Oct 21, 2026
@github-actions

Copy link
Copy Markdown

This pull request is labeled perf, so it needs the summary line of a capture on main and one with the change, from the same title, scene and machine, as the Performance report form asks. Please paste both aps5-summary.jsonl lines, attach the two traces and add the output of tools/trace_digest.py.

@EagleBearerYS

Copy link
Copy Markdown
Contributor

@Raghav314 thanks for the clear notes on what was dropped and what #9508 keeps. We'll measure #9508 on Resident Evil Village (PPSA01556) on our RTX 3070 Laptop GPU, whose driver (617.42) exposes VK_EXT_descriptor_heap. We'll rebase #7642's table part onto #9508, and once we've read the ring's image-table map, we'd like to take you up on looking at the ABI together.

@MarcZX10

Copy link
Copy Markdown
Contributor

One checklist detail appears inconsistent with the repository rule for Unblocks: it currently names PR #7642, while the checklist requires a title ID and its Game bring-up discussion (or none). Since this PR documents a Hades II performance result and does not identify a title stop it fixes, please use Unblocks: none unless there is a specific title issue this change unblocks; in that case, please name the title ID and discussion. This keeps the title-priority tracking accurate.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 6340 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L3763-3764, L5394-5412
PR 6905 core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp L94
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp L8, L178-180, L191
PR 7622 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp L1
PR 8212 docs/dev/ARCHITECTURE.md L139
PR 8963 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L57-58, L590, L625
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp L6-8, L13-120
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L5870, L6017, L6031-6033
core/libs/prx/libSceAgcDriver/tests/BdaContracts.cpp L16-118, L144-158
PR 9248 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L1180-1181, L1184
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp L355-361
PR 9289 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp L3857-3858
PR 9503 core/libs/prx/libSceAgcDriver/Graphics/src/SampleOrder.cpp L248
PR 9563 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp L1461-1462, L1468-1475
PR 9674 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp L3063, L3551
PR 10000 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L667-669
PR 10043 core/libs/prx/libSceAgcDriver/Execution/include/PresentationPass.hpp L5, L74
PR 10351 core/shader/recompiler/Recompiler.cpp L629-630
PR 10472 core/libs/prx/libSceAgcDriver/tests/execution/StorageCacheBudget.cpp L137
PR 10489 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L352-353, L667-669
PR 10556 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L3567-3568
PR 10652 core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp L52-53, L58-63, L192
PR 10678 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L3777
docs/dev/ENVIRONMENT.md L499
PR 11265 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp L361, L708-709
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp L53, L58-63, L192
PR 11454 docs/dev/ARCHITECTURE.md L138-139
PR 11551 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L2244-2245, L2252, L2292
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2216-2217
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L7379, L7500, L7619, L7621, L7648, L7812-7814, L8047-8048
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L901, L953
core/shader/recompiler/Optimization/include/Optimization/BindingAllocator.hpp L27
core/shader/recompiler/Optimization/src/BindingAllocator.cpp L71, L117-118
core/shader/recompiler/Recompiler.cpp L630, L706, L718, L821, L1191, L1256, L2113, L2115
core/shader/recompiler/ShaderDiskCache.cpp L88-89, L91, L731-732, L746-747
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp L471
core/shader/recompiler/tests/RequestSerializerTests.cpp L562-568, L586, L644, L657, L791, L876-877, L895-896, L934-935
PR 11920 core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp L107-108, L117-119
PR 12070 core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_flush_ordering_tests.cmake core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_storage_flush_ordering_tests.cmake
PR 12568 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L2262-2263
PR 12662 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp L708-709
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L7379, L7500, L7619, L7621, L7648, L7814, L7976, L7979, L7993, L8047-8048
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_sample_lod_clamp_tests.cmake
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L901, L944, L953, L1014
core/shader/recompiler/Recompiler.cpp L1013-1017
core/shader/recompiler/tests/RequestSerializerTests.cpp L330-331, L376-377, L407-408, L546-547, L562-563, L586, L626-627, L644, L646, L657, L727, L779, L791, L820, L835-836, L895-897, L914-915, L934-935, L940-941
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_sample_lod_clamp_tests.cmake
PR 12696 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L2262-2263
PR 12745 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L1803, L3278-3279, L3365-3366
PR 12764 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L4237-4238, L5515, L5517-5522
core/shader/recompiler/Recompiler.hpp L433
PR 12840 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L338, L5408-5411, L5514-5515
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L245-246
core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp L229
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_pipeline_journal_tests.cmake L2
core/shader/recompiler/SpirvBackend/src/SpirvBdaLookup.cpp L3
PR 12980 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L517-518
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2521-2522
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp L708-709
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp L7379, L7500, L7619, L7621, L7648, L7814, L7976, L7979, L7993, L8047-8048
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_sample_lod_clamp_tests.cmake
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp L901, L944, L953, L1014
core/shader/recompiler/Recompiler.cpp L1013-1017
core/shader/recompiler/tests/RequestSerializerTests.cpp L330-331, L376-377, L407-408, L546-547, L562-563, L586, L626-627, L644, L646, L657, L727, L779, L791, L820, L835-836, L895-897, L914-915, L934-935, L940-941
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_image_sample_lod_clamp_tests.cmake
PR 13021 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L190-191
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp L1426-1427
PR 13023 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L190-191
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp L1426-1427
PR 13159 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L2262
PR 13263 docs/dev/ENVIRONMENT.md L189
PR 13858 core/libs/prx/libSceAgcDriver/Graphics/include/BdaResources.hpp L5-6, L17-19, L61-62
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp L398, L545
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L57-58, L245-247, L590, L625
core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp L6-7, L133, L144, L229
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L1885, L1889, L1894, L2178, L2575-2576, L3230, L3376, L3514-3516, L3777-3778
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp L6, L142, L5222
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp L6-8, L13-120
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2739-2740, L2742, L2744, L2780, L2783, L5748, L5870, L5979-5982, L6031-6033
core/libs/prx/libSceAgcDriver/tests/BdaContracts.cpp L16-118, L144-158
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_address_draw_space_reuse_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/AddressDrawSpaceReuse.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_address_draw_space_reuse_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/AddressDrawSpaceReuse.cpp
PR 14051 core/libs/prx/libSceAgcDriver/CMakeLists.txt L615
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L1722-1729, L1885
PR 14265 core/libs/prx/libSceAgcDriver/tests/execution/PreparedGraphics.cpp L157-162
PR 14794 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp L127-131
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_draw_cache_reuse_tests.cmake L28
PR 14815 core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp L52
PR 14857 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L1721-1722
PR 14871 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L4158
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L3750-3751
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L529
core/shader/recompiler/ShaderDiskCache.cpp L97-98
PR 14880 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp L2262
core/shader/recompiler/Recompiler.cpp L1022-1024, L1768-1787
core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp L232-233, L242
PR 15056 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp L1688

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 907 core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1835 CMakeLists.txt
PR 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/VariantValidation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
docs/dev/ENVIRONMENT.md
PR 2434 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4040 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 4472 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/BufferPool.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
docs/dev/ENVIRONMENT.md
PR 5021 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvMemoryInstructions.cpp
docs/user/USAGE.md
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageSrgbLoad.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/RuntimeAbi.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 5581 core/libs/prx/libSceAgcDriver/Graphics/src/GpuColorTransfer.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Shaders.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/Optimization/include/Optimization/BindingAllocator.hpp
core/shader/recompiler/Optimization/include/Optimization/ResourceProgram.hpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/PipelineLibrary.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineLibrary.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/UnitShadow.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/VariantValidation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/UnitShadow.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/Recompiler.hpp
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6194 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6223 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6235 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/RuntimeAbi.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/execution/BindlessImages.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageSint8.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6488 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 6548 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6553 core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
PR 6751 core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvBdaFault.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Sampler.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Sampler.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6858 core/shader/recompiler/Optimization/include/Optimization/ResourceProgram.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6918 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
PR 6924 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 6970 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6987 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/DepthStorageDispatch.cpp
core/libs/prx/libSceAgcDriver/tests/execution/MultisampleRetirement.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6989 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/DepthStorageDispatch.cpp
core/libs/prx/libSceAgcDriver/tests/execution/MultisampleRetirement.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6995 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/DepthStorageDispatch.cpp
core/libs/prx/libSceAgcDriver/tests/execution/MultisampleRetirement.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7002 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_sample_multisample_target_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/DepthStorageDispatch.cpp
core/libs/prx/libSceAgcDriver/tests/execution/MultisampleRetirement.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7085 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/RuntimeAbi.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7223 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
PR 7392 core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvBdaFault.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
PR 7410 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Deserialize.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 7464 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_same_queue_label_wait_tests.cmake
PR 7508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 7668 core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7682 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 7684 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ARCHITECTURE.md
PR 7689 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp
PR 8004 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvMemoryInstructions.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/ENVIRONMENT.md
PR 8246 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
PR 8484 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureRepack.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9012 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp
docs/dev/ENVIRONMENT.md
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9183 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 9318 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9335 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9345 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 9356 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Shaders.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Mesh.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9387 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Shaders.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Mesh.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9539 CMakeLists.txt
PR 9592 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9672 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9673 docs/dev/debt/libSceAgcDriver.md
PR 9675 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9700 core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9712 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 9748 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PipelineJournal.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9852 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ENVIRONMENT.md
PR 9884 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp
PR 9889 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 9895 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9897 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake
core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 9898 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9915 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9950 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10025 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 10049 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampleMultisampleTarget.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10249 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10256 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10359 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Dispatch/DispatchCache.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10442 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 10479 docs/user/USAGE.md
PR 10757 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/ENVIRONMENT.md
PR 10861 docs/user/USAGE.md
PR 10867 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageCacheBits.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageConvertedUnorm.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageTexelStatus.cpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
PR 10894 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
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/PresentationPass.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp
PR 11351 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
PR 11435 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 11436 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 11442 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 11444 core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.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/Graphics/src/Texture.cpp
PR 11452 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 11483 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvModuleSetup.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
PR 11485 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 11825 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/WrittenBuffers.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 11901 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 11998 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 12120 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 12125 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Mesh.cpp
PR 12157 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 12323 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineLibrary.cpp
docs/dev/ENVIRONMENT.md
PR 12324 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrProgram.hpp
core/shader/recompiler/IntermediateRepresentation/src/IrProgram.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/ENVIRONMENT.md
PR 12544 docs/dev/ENVIRONMENT.md
PR 12548 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
PR 12565 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
docs/dev/debt/libSceAgcDriver.md
PR 12567 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 12575 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/execution/SampledCacheBudget.cpp
PR 12619 core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PixelBarycentricEmulation.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
PR 12678 docs/user/USAGE.md
PR 12746 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 12790 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 12828 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
PR 12863 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 12921 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
docs/dev/ENVIRONMENT.md
PR 12930 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 12944 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvMemoryInstructions.cpp
PR 12970 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 13148 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/BufferPool.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ResidentMirror.cpp
PR 13262 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 13578 CMakeLists.txt
PR 13599 docs/dev/debt/libSceAgcDriver.md
PR 13646 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 13707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 13863 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ResidentMirror.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/UnitShadow.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/StorageFlushOrdering.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 13920 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/Dispatch.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Resources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ResidentMirror.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/UnitShadow.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
core/libs/prx/libSceAgcDriver/tests/execution/StorageFlushOrdering.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 13963 core/libs/prx/libSceAgcDriver/Graphics/include/MultisampleTarget.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 13994 docs/dev/debt/libSceAgcDriver.md
PR 14005 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/debt/libSceAgcDriver.md
PR 14032 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake
core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 14212 CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 14217 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp
PR 14218 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/tools/ShaderReplay.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitter.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvMemoryInstructions.cpp
PR 14261 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
PR 14262 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
docs/dev/ENVIRONMENT.md
PR 14264 CMakeLists.txt
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 14299 docs/dev/ENVIRONMENT.md
PR 14302 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_recorder_tests.cmake
docs/dev/debt/libSceAgcDriver.md
PR 14311 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 14344 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 14561 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/ControlFlow/src/RequestSerializer.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
core/shader/recompiler/tests/RequestSerializerTests.cpp
docs/dev/debt/libSceAgcDriver.md
PR 14621 core/libs/prx/libSceAgcDriver/Graphics/include/Sampler.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Sampler.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 14702 core/libs/prx/libSceAgcDriver/tests/execution/ImageConvertedUnorm.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 14853 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 14943 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 14944 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/WrittenBuffers.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_graphics_tests.cmake
core/libs/prx/libSceAgcDriver/tests/cmake/agc_shader_memory_tests.cmake
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 14976 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 15059 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/WrittenBuffers.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md

@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 updated body now satisfies the performance-report format with same-scene summary lines, trace attachments and digests; I withdraw that earlier concern. I am requesting changes for a separate correctness gap in the non-heap fallback. In core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp, shader.heap is nullable and heapStage is set when any stage is in GPU mode. In Complete()/build(), the if (heapStage) RefreshHeapStage(shaders); call applies to the entire shader span. RefreshHeapStage (Execution/src/Driver/Draw/HeapStages.cpp) requires every shader stage to be GPU mode and to have a heap-backed descriptor plan. But this PR’s stated fallback explicitly allows a stage whose module cannot map onto the heap, or a mixed draw, to use the existing per-draw path. A graphics pipeline with one heap-eligible stage and one ineligible stage therefore appears to take the documented mixed/per-draw fallback and then hit a Require while refreshing all stages. Please either make refresh handle the mixed set by skipping non-heap stages (and keep their per-draw resources valid), or route the entire draw through the per-draw path before heapStage is marked. Add a regression with mixed eligible/ineligible stages on an extension-capable device, or a test of the selection/refresh helper. Hosted relinker matrix and ASan, eligibility/conventions/intake/report checks pass; product Linux/Windows jobs are skipped. The Windows runtime and title measurements in the body are author-reported. I did not run local GPU tests.

@Raghav314

Copy link
Copy Markdown
Contributor Author

@MarcZX10 thanks for looking. RefreshHeapStage is in ShaderResources.cpp and only writes GPU-mode stages; non-GPU stages are skipped. Mixed draws don't reach the build: Draw.cpp (the mixedHeap retry) reruns a draw whose guest stages come out mixed on the per-draw path before any resources are built, and refuses the heap for that stage pair on a second mix, so heapStage is never set for a mixed guest set. What was missing was a test of that path: agc_driver_heap_draw_sample_heap now draws a heap vertex stage with a fragment stage that fails the heap mapping (through a test-only switch, SetHeapStageUnmapped), and checks the image, that the draw retries on the per-draw path once, and that a repeat draw of the pair stays per-draw. With the retry removed, that draw throws "a pipeline with GPU-mode stages does not map onto VK_EXT_descriptor_heap".

LLM assistance used.

@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 author has added the missing mixed-stage regression and clarified the path it exercises. I reviewed that update and withdraw my earlier mixed-stage correctness concern: the test now covers the heap-eligible vertex plus an unmappable fragment, verifies image output, checks one retry to per-draw, and checks the repeated pair remains per-draw.

I am keeping the review at changes requested for the new hosted Windows relinker result. That run completed 232/233 tests and failed only conventions_function_bodies_shard_11 by timeout. Since the other 232 passed and the failure is a timeout, it may be a runner-load issue, but the check is currently red; please rerun it or provide a green Windows matrix result before merge. The other hosted relinker jobs (Ubuntu, macOS arm64/x86_64 and ASAN), conventions, eligibility, labels and report checks pass. Linux/Windows product jobs are skipped. The Hades II trace evidence and Vulkan validation comparison are author-reported; I did not run local GPU tests.

@MarcZX10

Copy link
Copy Markdown
Contributor

I reviewed the new mixed-stage fallback regression and withdraw my earlier correctness concern; it now covers the eligible/unmappable stage pair and per-draw retry. The latest Windows relinker run is still red: 232/233 tests passed, with conventions_function_bodies_shard_11 timing out. Please rerun the Windows matrix or provide a green result. Ubuntu, both macOS architectures, ASAN, conventions and policy checks pass; product builds are skipped.

EagleBearerYS added a commit to EagleBearerYS/AnyPS5 that referenced this pull request Oct 22, 2026
Rebuilds boykopovar#7642's device columns inside boykopovar#9508's GPU-mode stages.

The recompiler takes SpirvTarget::deviceImageTables (part of the
recompile cache key). ResourceTracker plans a V# table column on the
device table only in a GPU-mode stage that reads its table map by
address (gpuResolvedImages and descriptorMemory, vertex, pixel or
compute, Int64 and buffer device addresses), the reverse of boykopovar#7642's
gate: plain column, sampled reads, gathers, queries and loads only, a
direct S# that is not forced unnormalized, no depth compare, packed or
by-element access. ImageResource::deviceTable marks such an image, and
the result's deviceImageTables tells the driver.

A device column needs no table snapshot, capture memory or map
records: the snapshot and ResolveImageTables skip it, so its map part
stays empty, and a stage whose only tables are device tables still
gets its table map, which carries the trailer. Each device-table
image's interface is registered when a result is materialized, and a
direct S# paired with one gets its sampler class as specialization
constant DeviceSamplerClassBase plus the sampler index.

The access calls device_image_lookup with the T# words, the interface
id, the sampler class and the pc. It takes the bucket and miss ring
chunk addresses from the four trailer words before HeaderElementBase
and reads both through buffer device addresses; a map without a table
(zero addresses) misses and records nothing. A hit samples the heap
table array of the mode's kind at the bucket's slot, which aliases the
GPU heap's first sampled binding, so the device table now takes its
slots in that kind. A miss or a faulted bucket reads zeros and appends
one record per key and batch to the ring; the driver resolves it for
the next batch, and a program the table cannot serve is recompiled on
boykopovar#9508's CPU map.

writeHeapTableMap prepares the device table for the open batch and
writes its trailer for a stage that reads it. The shader disk cache
encodes the new fields; its format moves to 48.

agc_shader_device_image_tables compiles a compute and a pixel program
reading a 2,000-entry V# table at a user-data index with a direct S#:
in a GPU-mode stage the column reads the device table, the capture
reads no record, the map has no record for it, the module calls the
lookup keyed by the registered interface and the S#'s class, reads all
four trailer words, declares no set 2 or 3, aliases the first sampled
heap binding and passes spirv-val; with the option off, or on the
per-draw path, the column stays on the CPU map, as do a storage write,
a depth compare, a sampler table and an unnormalized S#.

Based on fable-void's d35b01a and 81119ee (wip/new-gpu-path).
@Raghav314
Raghav314 force-pushed the perf/agc-vk-descriptor-heap branch from fb07b25 to d52c109 Compare October 22, 2026 01:57
@MarcZX10

Copy link
Copy Markdown
Contributor

The new performance evidence in the PR still does not meet the repository report rule for a perf change: the report describes Hades II with instrumented APS5_PROFILE_DRAW/trace switches and non-matching capture windows, but does not include two compliant warm-cache summary lines from the same scene/settings/machine, the attached base/change traces, or tools/trace_digest.py output. The title instructions also use extra profile/event switches, which are useful diagnostics but do not substitute for the prescribed performance capture. Please add the compliant comparison artifacts or remove the speed claim/perf labeling. AGC changes also require same-focused-test validation on main and change with the Khronos layer, ANYPS5_NO_SHADER_CACHE=1 and ANYPS5_REQUIRE_VULKAN=1, including layer-found and VUID comparison; the current report says the GPU-heap tests had no VUID errors but does not document the required main/change comparison. Hosted product builds were skipped; I did not run local tests.

@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 new mixed-stage fallback test resolves my previous code-path concern, and the Linux test report is useful. I am requesting changes for the repository-required evidence only: this perf PR needs compliant same-scene/same-machine warm-cache summary lines, attached base/change traces and tools/trace_digest.py output, and the AGC main/change focused validation-layer comparison. Please add those artifacts or remove the performance claim/perf labeling. I did not run local tests; hosted Linux/Windows product jobs were skipped.

@Raghav314
Raghav314 force-pushed the perf/agc-vk-descriptor-heap branch from d52c109 to 23b2a3f Compare October 22, 2026 02:44
EagleBearerYS added a commit to EagleBearerYS/AnyPS5 that referenced this pull request Oct 22, 2026
Rebuilds boykopovar#7642's device columns inside boykopovar#9508's GPU-mode stages.

The recompiler takes SpirvTarget::deviceImageTables (part of the
recompile cache key). ResourceTracker plans a V# table column on the
device table only in a GPU-mode stage that reads its table map by
address (gpuResolvedImages and descriptorMemory, vertex, pixel or
compute, Int64 and buffer device addresses), the reverse of boykopovar#7642's
gate: plain column, sampled reads, gathers, queries and loads only, a
direct S# that is not forced unnormalized, no depth compare, packed or
by-element access. ImageResource::deviceTable marks such an image, and
the result's deviceImageTables tells the driver.

A device column needs no table snapshot, capture memory or map
records: the snapshot and ResolveImageTables skip it, so its map part
stays empty, and a stage whose only tables are device tables still
gets its table map, which carries the trailer. Each device-table
image's interface is registered when a result is materialized, and a
direct S# paired with one gets its sampler class as specialization
constant DeviceSamplerClassBase plus the sampler index.

The access calls device_image_lookup with the T# words, the interface
id, the sampler class and the pc. It takes the bucket and miss ring
chunk addresses from the four trailer words before HeaderElementBase
and reads both through buffer device addresses; a map without a table
(zero addresses) misses and records nothing. A hit samples the heap
table array of the mode's kind at the bucket's slot, which aliases the
GPU heap's first sampled binding, so the device table now takes its
slots in that kind. A miss or a faulted bucket reads zeros and appends
one record per key and batch to the ring; the driver resolves it for
the next batch, and a program the table cannot serve is recompiled on
boykopovar#9508's CPU map.

writeHeapTableMap prepares the device table for the open batch and
writes its trailer for a stage that reads it. The shader disk cache
encodes the new fields; its format moves to 48.

agc_shader_device_image_tables compiles a compute and a pixel program
reading a 2,000-entry V# table at a user-data index with a direct S#:
in a GPU-mode stage the column reads the device table, the capture
reads no record, the map has no record for it, the module calls the
lookup keyed by the registered interface and the S#'s class, reads all
four trailer words, declares no set 2 or 3, aliases the first sampled
heap binding and passes spirv-val; with the option off, or on the
per-draw path, the column stays on the CPU map, as do a storage write,
a depth compare, a sampler table and an unnormalized S#.

Based on fable-void's d35b01a and 81119ee (wip/new-gpu-path).
@Raghav314

Copy link
Copy Markdown
Contributor Author

@MarcZX10 thanks, updated the description.

Your points on warm caches, APS5_TRACE_EVENTS, the redirected log and the missing main/change validation comparison were right, and are addressed below. Three things in the review didn't match the earlier description, though:

  • It set no APS5_PROFILE_* switch and did not mention APS5_PROFILE_DRAW.
  • The capture windows matched: all three were APS5_TRACE_SECONDS=120:10 in the same scene.
  • The traces were attached and the trace_digest.py output was included for all three captures.

What changed:

  • Perf: new captures per the Performance report form. Hades II hub, standing still, APS5_TRACE_SECONDS=120:10, warm caches (each setting run once into the hub and the title restarted), no other APS5_TRACE_* / APS5_PROFILE_* switch, log not redirected, same machine. Summary lines, traces and trace_digest.py output for main + feat(agc): import cleared native multisample D32S8 targets and whole HTILE fills #6300, APS5_DRAW_PIPELINE=1, and APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 are in the description (706 → 886 → 1014 presents / 10 s). "Testing other titles" no longer asks for extra switches.
  • Validation layer: the same 54 focused tests on main and on this PR, plus the 80 heap tests on this PR, with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1: the layer was found in both logs, and there are 0 VUID- errors on both.
  • The comparison found two real bugs, both fixed:
    • VUID-vkCmdDispatch-None-11308 in the heap compute tests: push constants put the command buffer back in classic descriptor mode without the heaps being bound again (fixed in this PR, last commit).
    • Test processes aborting at exit under the layer: the draw pipeline kept the device alive past shutdown (fixed on perf(agc): draw finisher pipeline (APS5_DRAW_PIPELINE) #6946).

LLM assistance used.

@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.

Correction to my 02:04 review: I rechecked the current body against the performance form and the author's 02:54 response. I withdraw my claim that the required summary lines, warm-cache capture details, trace digests, or AGC validation-layer comparison are missing. The body now reports the same-machine comparison and 54 matching base tests / 134 change tests; the layer is found in both logs with zero VUID errors. Hosted relinker jobs also now pass, resolving the earlier Windows timeout.

Two items still need correction before merge:

  1. The Performance report links appear swapped: the main bullet names aps5-trace-de49f41349a9-624652.json.gz but links to the 568369d27a2e-625697 heap capture; the heap bullet names 568369d27a2e-625697 but links to the de49f41349a9-624652 main capture. Please correct the attachments/links so each scenario points to its own trace. The baseline trace also reports trace_dropped: true; please keep that limitation explicit when describing its trace detail.
  2. The source and all new validation evidence are still based on main a6dcea9279 (plus the declared #6946/#6300 overlays), while current upstream main is c61d20f54801efc3798555829f6fedcff71ad7ff. Please update the branch and rerun conventions/overlap and the focused validation comparison on the updated tree. For the performance comparison, retain the #6300 integration needed to reach the same Hades II scene and identify the exact current-main integration base in the report.

The mixed-stage fallback regression and the latest hosted relinker matrix resolve my earlier code-path and timeout concerns. I did not run local GPU tests.

@JJenkx

JJenkx commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

@Raghav314, an overlap note from #9503 (mine), which the reviewer asked me to coordinate with you.

Both PRs change the same vkCmdBindDescriptorSets line in SampleOrder.cpp, in the sampled depth pass:

The two changes don't contradict each other. Whichever lands second keeps both: your wrapped call, placed inside the lambda after vkCmdBindPipeline. The storage-pass hunk at line 175 is yours alone.

#9503 is a one-line fix that has already been validated on two AMD drivers, so I'd suggest it goes first. Your rebase would then be just moving the wrapped call into the lambda. If you'd rather land first, I'll rebase #9503 onto yours instead. Either order works for me; tell me which.

@EagleBearerYS

Copy link
Copy Markdown
Contributor

@Raghav314 a merge-order note for two small drafts next to this PR:

  • fix(agc): prepare the push-less pixel variant only without fixed push slots #9563 replaces the variant block in PrepareRegistered (ShaderRegistry.cpp) with RegistrationRequests, so the push-less pixel variant is prepared only for a stage without fixed push slots. This PR reworks the library prebuild in the same function and keeps the old variant block after it. Composed, this PR's prebuild stays and RegistrationRequests takes the variant block's place.
  • fix(agc): find a template's data bindings by binding number #9564 makes DataWordsDiffer and refreshData (ShaderResources.cpp) find a template's data bindings by binding number instead of pairing them by index. This PR changes the same lines to read the words through DrawGuestWords(shader, binding). Composed, each binding is looked up by number and its words are read through DrawGuestWords.

Neither side needs to wait, and the rebase is ours either way: if this PR merges first, #9563 and #9564 rebase onto it, and if they merge first, I'll put the resolved merge on a branch of my fork for you to take. Does that work for you?

The heap branch encodes new artifact (gpuResolvedImages, sampler slot and buffer address dwords, pushed data, push items, data-address push, BDA stores), invocation (heap slot words) and binding-layout fields (data address, slot and address dword counts, pushed data, heap storage images, GPU-resolved images), so its entries need their own format number above main's.
@Amoenus

Amoenus commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

@Raghav314 New overlap coordination: #16086 restores nonuniform first-draw initialization as a small follow-up to #15986, without the reverted constructor guest read or sampled-layout rewrite.

I compared your 8be80b264c349706e380b265c9527d5c4b492825: the concrete conflict is the neighboring MultisampleTarget class/constructor context and CMake insertion. A combination should retain your HeapSlotOwner inheritance and DispatchMultisampleImage(..., this) heap-owner argument alongside the new optional prepared-upload constructor argument and existing recorder retention. Our change reuses that uploader; it does not implement a heap path.

Proposed order: #15985 → #15986 → #16086 before #9508 for this shared section. If the heap work lands first, I can adapt the initializer to it. This is a coordination proposal, not an agreed dependency. Main/parent comparisons, failing controls and two-vendor evidence cover the normal uploader only, not a combined heap run. AI-assisted: yes (Codex).

Snapshot readback coordination: #6987 is now adapted at fecae291e1de on the same initialization chain. Its temporary unsigned sampled-array readback view is destroyed after the synchronous batch completes. Please preserve the appropriate descriptor/heap-slot ownership and cleanup for that temporary view when composing the heap path; the persistent target owner alone is not a validation of that lifetime. Normal-path source-pinned evidence; no combined heap run is claimed.

@Raghav314

Copy link
Copy Markdown
Contributor Author

@Amoenus Thanks for the heads-up. No coordination needed: whichever PR lands first, the other rebases onto it. If #16086 lands before #9508, I'll keep the HeapSlotOwner inheritance and the DispatchMultisampleImage(..., this) owner argument alongside your prepared-upload constructor argument when I refresh.

… device

A nearly full GPU heap used to send every draw down the per-draw path until
owners released slots. Like vkd3d-proton, which leaves descriptor lifetime to
the heap's owner, the heap now frees the image slots no draw has used for two
submissions. An evicted slot moves its generation, so templates holding it
take fresh slots on their next draw, and it is handed out again only after the
submission that followed the eviction completes. Draws that keep using a slot
refresh it on every heap stage write. APS5_NO_HEAP_EVICTION turns it off.

The image heap length is now the HeapImageSlots specialization constant
instead of a constant in the module, the way vkd3d-proton sizes its heap
arrays at pipeline creation. Pipelines set it to the device heap's slot count,
which grows past the ABI's 233472 into resource heap space the shader data
ring leaves unused, up to 524288 slots. Shader disk cache format 58.

The 10 s [gpu-heap] line adds the slot count, evictions and their waits, and
ring waits, the largest bytes one batch wrote into the ring and the largest
span.
…ers them

Review of the eviction found that the margin counted evicted slots before any
submission had a serial for them, so a busy batch could drain the free list
without refusing the heap and fail a draw with "the global image heap is
full". The margin now counts only evicted slots a submission covers, eviction
starts at twice the margin, scans at most once per submission, needs the
recorder timeline, and reclaims once per submit instead of per taken slot.
A blocking reclaim waits only on submitted serials, heap stages refresh their
slots once per submission, and the validator checks the image table alias is
an array before reading its length.

The [gpu-heap] line adds ring MiB written per 10 s and image slots held.
A draw that reuses a ring span it wrote earlier reopens the span's chunk, so
the chunk takes the serial of the newest batch, and when the ring came round
to it later it waited for a batch the GPU had only just started: every ring
wait in a MCD2 run was of that kind. Like vkd3d-proton, which takes another
scratch buffer instead of waiting for one the GPU still reads, the ring now
skips such a chunk. Only when every chunk is taken or busy does it wait, and
then on the chunk whose batch is oldest.

APS5_HEAP_RING_MIB sets the ring size between 4 and 64 MiB (default 64, less
when it sits in a smaller resource heap). MCD2 writes up to ~10 MiB in one
batch and stops with "one batch's shader data exceeds its ring" at 8 MiB, so
the default stays as large as the heap allows.
Shader data, flattened SRT data and table maps lived in the descriptor
ring inside the resource heap. A batch writing more than the ring held
aborted the run, and the ring took heap room from images.

They now go into a pool of 2 MiB blocks, the way vkd3d-proton's
uniform upload pool works. A batch takes new blocks instead of waiting,
a span larger than a block gets a block of its own, a block is reused
once the GPU has finished the batches that read it, and idle blocks
over 32 MiB are freed. Shaders read the data through 64-bit addresses
pushed per draw (shader data, table map, addressed flattened SRT), so
the shared ring address push item is gone; the push-data size stays
about the same. The ring inside the heap now holds only per-draw buffer
descriptors and defaults to 16 MiB.

The shader cache format moves to 59.
…ptor ring

A batch writing more per-draw buffer descriptors than the ring holds
aborted the run. Before each draw and dispatch the recorder now submits once the
open batch holds half the ring's chunks, and one draw may take at most a
quarter of the ring, so a batch always fits.
@Raghav314

Copy link
Copy Markdown
Contributor Author

Pushed five commits on top of 8be80b2.

Heap image slots: sized per pipeline, plus eviction (36caa8b0fe, 097833507b)

  • The image heap length is no longer a constant compiled into every shader. It is now the HeapImageSlots specialization constant, set at pipeline creation to the device heap's slot count, the way vkd3d-proton sizes its heap arrays. On an RTX 4090 that goes past the ABI's 233472, up to 524288 slots. Shader disk cache format 58.
  • When the heap is nearly full, it now evicts image slots that no draw has used for two submissions, instead of sending every draw down the per-draw path. An evicted slot moves its generation, so templates holding it take a fresh slot on their next draw. The slot is handed out again only after the submission that followed the eviction completes. APS5_NO_HEAP_EVICTION=1 turns eviction off.
  • After review, evicted slots count as free only once a submission covers them. Before that, a busy batch could drain the free list and fail a draw with "the global image heap is full".

Ring: skip busy chunks (3e7446f81a)

  • A draw that reuses a ring span reopens that span's chunk, so the chunk took the newest batch's serial. When the ring came round to it, it then waited on a batch the GPU had only just started. Every ring wait in an MCD2 run was of this kind. Like vkd3d-proton, which takes another scratch buffer rather than waiting on one the GPU still reads, the ring now skips such a chunk. It waits only when every chunk is taken or busy, and then on the oldest batch.

Shader data in an upload pool (fcb483e308)

  • Shader data, flattened SRT words and table maps moved out of the ring inside the resource heap into a pool of 2 MiB blocks, like vkd3d-proton's uniform upload pool:
    • A batch takes new blocks instead of waiting.
    • A span larger than a block gets its own block.
    • A block is reused once the GPU finishes the batches that read it.
    • Idle blocks beyond 32 MiB are freed.
  • Shaders read the data through 64-bit addresses pushed per draw, read as uniform buffers through PUSH_ADDRESS, as vkd3d reads root CBVs. The shared ring-address push item is gone, so push-data use stays about the same. Shader disk cache format 59.
  • The ring now holds only the 16-byte per-draw buffer descriptors and defaults to 16 MiB. That leaves more heap room for images: 259k slots before, 521k now on an RTX 4090.

Early submit when the descriptor ring fills (de1bbf1af3)

  • On MCD2 a batch writes up to about 6-8 MiB of buffer descriptors but only about 36 KiB of shader data, so the descriptors were what overflowed the ring. Before each draw and dispatch, the recorder now submits once the open batch holds half the ring's chunks, and one draw may use at most a quarter of the ring. A batch no longer aborts with "exceeds its ring". Large shader-data spans have no cap now, since they get their own pool block.

Tested (RTX 4090, same machine and scene)

  • Focused tests with ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation: 623/623 pass with the heap off and on, the layer loaded, no VUID- errors.
  • MCD2, 90 s, heap on: frame times at parity. With APS5_HEAP_RING_MIB=6 the run used to abort and now completes.
  • AMD codegen (RADV navi21 replay of the captured MCD2 shaders): at parity.

A sampler whose four descriptor words are constants in the shader code
still took a sampler heap slot, its index was patched into the shader
data on every draw, and the shader loaded it before fetching the
sampler from the heap. vkd3d-proton maps a root signature's static
samplers as samplers embedded in the pipeline's descriptor mapping
instead (HEAP_WITH_CONSTANT_OFFSET with pEmbeddedSampler).

GPU heap stages now do the same. The recompiler marks a sampler whose
words are all immediates, gives each of its elements its own sampler
variable in set 6, and records the words (with the point-filter form
for point-sampled elements) in the sampler binding. Pipeline creation
maps those variables to embedded samplers built from the words and the
binding's compare, unnormalized and border flags, deduplicated across
pipelines. Draws no longer take or patch a slot for them. Past the
device's maxDescriptorHeapEmbeddedSamplers a constant sampler reads a
sampler heap slot at a fixed offset instead.

APS5_NO_EMBEDDED_SAMPLERS turns it off; APS5_EMBEDDED_SAMPLER_CAP
lowers the embedded limit for testing. Shader disk cache format 60.
@EagleBearerYS

Copy link
Copy Markdown
Contributor

@Raghav314 I have a question on 73c5187 (embedded constant samplers), from reading it against the compute pipeline cache. Two compute stages that differ only in a constant sampler's words look like they share one pipeline, so the second one would sample with the first stage's embedded sampler.

What I'm reading at 73c5187:

  • The cache key. ComputePipelineKey::Of (Execution/src/VulkanDevice.cpp:443) keys compute pipelines on shader.Identity(), and the embedded samplers go into the pipeline's descriptor heap mappings when it's created.
  • What the identity mixes. RecompileResult::Identity() (core/shader/recompiler/Recompiler.hpp:868-885) mixes the SPIR-V hash, the specialization, the subgroup and LDS flags, and each binding's set, binding, kind and count. It doesn't mix samplerEmbedded or samplerEmbeddedWords (:586-587), or the sampler flags.
  • The SPIR-V. The words don't reach it either. SpirvDescriptors.cpp:277-285 emits a constant sampler as an embedded_sampler variable decorated only with DescriptorSet EmbeddedSamplerSet and Binding arrayIndex, and no specialization constant carries the words.
  • The result. The border and wrap forms of one constant sampler give byte-identical SPIR-V, the same specialization and the same identity, so computePipeline returns the first stage's pipeline for the second.
  • The journal. The pipeline journal names stages by the same identity (PipelineJournal.cpp:824), so a replay would build one stage's pipeline under the other's identity.

A check. I compiled HeapEmbeddedSampler.cpp's ConstantSamplerCode twice under a gpuResolvedImages compute target: once as is (word 1 BorderClamp, 0x1b6), and once with word 1 set to 0.

border: identity=effde3e61722eb00d3de5c45393cbf95 spirvWords=1363 specs=4 bindings=3
  sampler binding set=1 binding=122 count=1 embedded: 0 words: 000001b6 00000000 00000000 80000000
wrap:   identity=effde3e61722eb00d3de5c45393cbf95 spirvWords=1363 specs=4 bindings=3
  sampler binding set=1 binding=122 count=1 embedded: 0 words: 00000000 00000000 00000000 00000000
same spirv=1 same specialization=1 same identity=1
  • What it shows. It was compile-only, on lavapipe, which has no VK_EXT_descriptor_heap. It shows the identity match and the cache-hit path, not the wrong sample itself.
  • Why the PR's test doesn't hit it. Its two stages, ConstantSamplerCode and UserSamplerCode, already differ in SPIR-V and bindings.
  • Graphics pipelines key on per-result variant ids, so they don't look affected.

A possible fix, in case it helps:

  • The change. In Identity()'s bindings loop, for each element whose samplerEmbedded isn't NoEmbeddedSampler, mix in three things: its binding number, its four samplerEmbeddedWords, and the bits embeddedSamplerMapping keys on (Graphics/src/BindlessHeap.cpp:1110-1118). Those bits are depth compare, unnormalized and integer border, plus the coordinates-ignored bit it clears in word 0. That's the same key the heap mapping builds.
  • Why Identity(). Fixing it there rather than in ComputePipelineKey covers the journal too, and stages without embedded samplers keep their identities.
  • A test. A recompiler-only test could require different Identity() values for the border and wrap variants of ConstantSamplerCode, without a heap device.

Could you take a look?

oneandonlydean and others added 5 commits November 6, 2026 21:54
…tity

RecompileResult::Identity() mixed the SPIR-V hash, specialization constants,
subgroup flags and each binding's set, binding, kind and count, but not the
embedded sampler state. ComputePipelineKey::Of and the pipeline journal key on
that identity, so under APS5_GPU_HEAP two stages with the same code and
different constant-sampler words or flags shared one pipeline and sampled with
the first stage's embedded sampler.

Mix samplerEmbedded, samplerEmbeddedWords and the depth-compare, unnormalized,
integer-border and coordinates-ignored flags the embedded sampler is built
from, and test that the words, the element index and each flag change the
identity. Raised by EagleBearerYS. Fix-up on Raghav314's change.
When fewer than a margin of image or sampler slots were free, the GPU
heap refused every draw and dispatch until owners released slots, and
they took the per-draw descriptor path meanwhile. vkd3d-proton never
leaves heap mode, and our heap can always make room: slots are only a
cache of descriptors whose owners are still alive.

Now the nearly full state asks the next draw or dispatch entry to
submit the open batch. At that point no draw is being prepared, so the
heap evicts the least recently used slots outright; they retire with
that submission's serial, and a slot request that finds no free slot
waits for it to complete. Other submissions, including ones made while
a draw is being prepared, keep the two-idle-submission rule, so a slot
a draw already took is never freed under it.

Sampler slots get the same eviction as image slots (use epochs, touch
on lookup and on template reuse, retiring entries), except samplers
whose slot index a pipeline bakes in (the embedded-sampler fallback),
which are pinned. Eviction runs only under the GPU mutex.

A heap whose recorder has no timeline cannot evict and still refuses,
as does every heap under APS5_NO_HEAP_EVICTION. The [gpu-heap] line
counts evicted samplers and pressure submits.
APS5_NO_EMBEDDED_SAMPLERS, APS5_NO_HEAP_PUSHED_DATA,
APS5_NO_HEAP_DEVICE_DESCRIPTORS and APS5_NO_HEAP_EVICTION only switched
back to older behaviour that the heap no longer needs. Constant samplers
are always embedded, heap stages always push their hottest shader data,
the heap and data pool are always tried in device-local host-visible
memory first, and a nearly full heap always evicts. Only a heap whose
recorder has no timeline still refuses draws when full.

The capped-heap test variants now run the eviction path (draws at five
image slots, image tables at eight) instead of the refusal path.
A fragment stage that merges into its own color target (a partial write
of a packed target, or blending unclamped normalized color) reads and
writes the target as a storage image whose descriptor comes from the
draw's color target state, not from guest memory. The heap template path
built its key and per-draw binding words from the captured snapshot
alone, which lacks that image, so every such draw on the heap threw an
out-of-range error and failed.

MaterializeHeap now appends the merge target descriptors the same way
the per-draw path does, and keys the template on them only through the
address-free binding plan words, so draws merging into different
targets of one form share a template and carry their own target in the
per-draw words. The heap walk memo keys and compares the merge
descriptors too: it is keyed on the variant, which no longer names the
target, and otherwise served the first target's words to a draw into
another one, which then stored into the wrong image.

The heap draw test gains an unclamped blend draw into two targets, which
checks the blended texels, that the heap took the stage and that the
second target reused the first one's template.
Identity() keyed compute pipelines, graphics pipelines and pipeline
libraries alike, so stages differing only in a constant sampler shared
one pipeline on both paths. The compute heap test now dispatches the
border clamp and wrap forms of the constant-sampler kernel and checks
each one's sample, and requires the clamp, wrap and mirror forms to have
distinct identities (wrap and mirror differ only in the first sampler
word, since the recompiler clears the border color word of samplers that
never clamp to the border). The heap draw test draws a border clamp and
a wrap form of one fragment shader through PM4 and checks the pixels.
Both fail in heap mode without the identity fix.
@Raghav314

Copy link
Copy Markdown
Contributor Author

@EagleBearerYS You're right, thanks for tracing it. Dean's 31d84cf fixes it in Identity(). I had reproduced it on a descriptor-heap device first: a compute stage whose constant sampler wraps, dispatched after the same kernel with a border-clamp sampler, reused the first pipeline and sampled the opaque white border instead of the texel.

Graphics was affected as well. Graphics pipelines and pipeline libraries are keyed on Identity() too (Pipeline.cpp libraryKeys and pipelineKey). Two draws whose fragment stages differed only in a constant sampler shared one pipeline, and the same fix covers them.

57108a0 adds end-to-end tests on top of Dean's unit test:

  • HeapEmbeddedSampler.cpp dispatches the clamp and wrap forms of the constant-sampler kernel and checks each one's sample. It also requires the clamp, wrap and mirror forms to have distinct identities. Wrap and mirror differ only in the first sampler word, since the recompiler clears the border color word when a sampler never clamps to the border.
  • HeapDrawSample.cpp draws a border-clamp and a wrap form of one fragment shader through PM4 and checks the pixels.
  • Without the identity fix, both tests fail in heap mode.

Before the rebase onto Dean's commit, the focused set passed 639/639 in default and heap mode with 0 VUID-. The same run on 57108a0 is in progress.

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 needs rebase Conflicts with main, rebase needed perf Performance change shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.