Skip to content

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

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

Raghav314 wants to merge 39 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 (4096 image slots per binding kind, APS5_HEAP_SLOT_CAP) and one sampler heap (2048 slots, D3D12's limit). Per-draw shader data, the flattened SRT and the image table map go into a ring in device memory, and the shaders reach them through pushed addresses. 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. 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.
    • 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.
  • Vulkan-Headers goes to 1.4.340, the first release with VK_EXT_descriptor_heap. Disk cache format 48 (main took 46 and 47 meanwhile).

APS5_VERIFY_GPU_HEAP=1 checks heap slots against the bound textures, 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]).

PPSA36082 (Hades II)

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.

Tested

Linux (CachyOS), x86-64, GCC, 7800X3D / RTX 4090, NVIDIA 615.78.08, on main c9b2660.

  • The whole ctest (2128 tests) on the head: 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.
  • Validation layer, main vs this PR. Same machine and GPU, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1 ctest -V -j4:
main c9b2660 this PR
tests 57 focused tests that exist on main (the base tests of the *_gpu_heap set) the same 57, the 2 base tests only this PR has, and 87 heap tests (*_gpu_heap, *heap*)
passed 57 / 57 146 / 146
was not found but was requested by env var VK_INSTANCE_LAYERS 0 0
VUID- errors 0 0

The first run of this comparison found VUID-vkCmdDispatch-None-11308 in the heap compute tests: a vkCmdPushConstants call puts the command buffer back in classic descriptor mode, which unbinds the heaps, and the heap's per-command-buffer bind record was not reset. Every push constant call now goes through CmdPushConstants, which resets it (last commit). It also found test processes aborting at exit under the layer on #6946; that is fixed on #6946.

  • Hades II as above. Astro's Playroom (PPSA01325) runs into the game with both switches, with no flicker.

Known limits

  • Mesh and tessellation pipelines, and stages whose module keeps a set 0 binding (registration-module storage images, GDS, the fault buffer), take the per-draw path, and so does every other stage of their draw. They are listed in the technical debt file.
  • The heap needs VK_EXT_descriptor_heap and heaps that hold 4096 image slots per kind and 2048 samplers; other devices run the existing path.

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.2.10 (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 5431 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp L194
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L760-761, L791-795, L797-810, L885
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp L1, L17, L30-31, L102-107
PR 6340 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L3526-3527, L5139-5157
PR 6498 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2157, L5609-5610, L5767-5770
PR 6612 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp L21-22
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp L1806-1808
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp L361, L566, L641-642
PR 6905 core/libs/prx/libSceAgcDriver/Graphics/include/TextureDetiler.hpp L92
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp L8, L167-169, L180
PR 6970 core/shader/recompiler/ShaderDiskCache.cpp L88-91
PR 7002 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2157, L5609-5610, L5767-5770
PR 7085 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L412-413
PR 7261 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2596
PR 7395 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 7514 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp L12
PR 8615 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2078
PR 8939 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 8963 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp L55-56, L562
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp L6-8, L13-120
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L5610, L5767-5770
core/libs/prx/libSceAgcDriver/tests/BdaContracts.cpp L16-118, L144-158
PR 9007 core/libs/prx/libSceAgcDriver/Graphics/src/PipelineLibrary.cpp L198
PR 9193 core/libs/prx/libSceAgcDriver/tests/execution/PixelBarycentricEmulation.cpp L88
core/shader/recompiler/Recompiler.hpp L329
PR 9248 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L1006
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp L262-268
PR 9289 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp L3616-3617
PR 9457 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 9503 core/libs/prx/libSceAgcDriver/Graphics/src/SampleOrder.cpp L247
PR 9563 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp L1351-1352, L1358-1365
PR 9564 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L4499-4501, L4524-4526, L4531-4532
PR 9633 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 9749 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 9790 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 9969 core/shader/recompiler/ShaderDiskCache.hpp L16
PR 9989 core/shader/recompiler/Recompiler.cpp L390
PR 10000 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L618-619
core/shader/recompiler/ShaderDiskCache.hpp L16
PR 10043 core/libs/prx/libSceAgcDriver/Execution/include/PresentationPass.hpp L58
PR 10062 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp L10
PR 10150 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L5019
PR 10194 core/libs/prx/libSceAgcDriver/Execution/src/PresentationPass.cpp L1
core/libs/prx/libSceAgcDriver/Graphics/src/Resources.cpp L1
core/libs/prx/libSceAgcDriver/Graphics/src/SampleOrder.cpp L1
PR 10333 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp L11117
PR 10351 core/shader/recompiler/Recompiler.cpp L590-591
PR 10359 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp L194
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp L760-761, L797-810
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp L17, L30-31, L177
PR 10423 core/libs/prx/libSceAgcDriver/CMakeLists.txt L2446
core/shader/recompiler/Recompiler.cpp L389-390, L1011, L1396, L1414-1418
PR 10435 core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp L66
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp L209, L260-261, L405, L450-451
PR 10440 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L618
PR 10473 core/shader/recompiler/Recompiler.cpp L1140-1141
PR 10489 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp L310-311, L618-619
core/shader/recompiler/ShaderDiskCache.hpp L16
PR 10492 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2157, L5609-5610, L5767-5770
PR 10497 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L2157, L5609-5610, L5767-5770
PR 10547 core/shader/recompiler/CacheKey.hpp L332
core/shader/recompiler/Recompiler.hpp L329
PR 10556 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp L3339-3340
PR 10678 docs/dev/ENVIRONMENT.md L453

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 1191 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 1368 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/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/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 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
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/CMakeLists.txt
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 4072 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/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
PR 4448 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
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
docs/dev/debt/libSceAgcDriver.md
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
PR 5021 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/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 5058 docs/dev/debt/libSceAgcDriver.md
PR 5115 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/RuntimeAbi.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 5372 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 5441 core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.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
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 6171 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
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/Draw/DrawPipeline.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 6202 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.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/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.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/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/ShaderDiskCache.hpp
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
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/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvEmitter.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 6539 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 6548 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6628 core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
PR 6642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/tests/Graphics.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
core/shader/recompiler/ShaderDiskCache.hpp
PR 6867 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
docs/dev/debt/libSceAgcDriver.md
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
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 6959 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/tests/Graphics.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6960 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6971 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7048 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
PR 7201 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/BdaResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/CacheKey.hpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterState.hpp
core/shader/recompiler/SpirvBackend/src/SpirvMemory/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 7223 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 7256 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
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 7369 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/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawRelocate.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.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/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
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/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
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/BdaResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7484 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
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/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
docs/dev/ENVIRONMENT.md
PR 7505 docs/dev/debt/libSceAgcDriver.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 7622 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/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineLibrary.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
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 7677 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/SpirvBackend/include/SpirvBackend/SpirvEmitterHelpers.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
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
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/ARCHITECTURE.md
PR 7689 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/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvBdaFault.cpp
core/shader/recompiler/SpirvBackend/src/SpirvRuntimeBuffer.cpp
PR 7910 docs/dev/debt/libSceAgcDriver.md
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/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
docs/dev/ENVIRONMENT.md
PR 8014 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8077 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvFlowEmitter.cpp
docs/dev/ENVIRONMENT.md
PR 8140 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 8212 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ARCHITECTURE.md
PR 8223 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.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 8319 docs/dev/debt/libSceAgcDriver.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 8998 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/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 9049 core/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.cpp
PR 9098 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 9133 docs/dev/ENVIRONMENT.md
PR 9186 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/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.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/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.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/Recompiler.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.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/SpirvEmitterHelpers.cpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9393 docs/dev/debt/libSceAgcDriver.md
PR 9400 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/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
PR 9401 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Pipeline.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 9431 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9432 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9489 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/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9551 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/BdaResources.cpp
PR 9592 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9669 docs/dev/ENVIRONMENT.md
PR 9672 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9673 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9674 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9675 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
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/debt/libSceAgcDriver.md
PR 9676 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9700 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9842 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.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
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/ENVIRONMENT.md
PR 9875 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Recorder.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 9889 core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 9891 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.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
docs/dev/debt/libSceAgcDriver.md
PR 9892 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9893 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9895 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/shaders/TextureDetile.comp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9897 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/shader/recompiler/Optimization/src/DescriptorBindingBuilder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 9898 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.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/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
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9904 docs/dev/debt/libSceAgcDriver.md
PR 9905 docs/dev/debt/libSceAgcDriver.md
PR 9906 docs/dev/debt/libSceAgcDriver.md
PR 9941 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/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 10026 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 10046 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/Pipeline.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 10049 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
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/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/libSceAgcDriver.md
PR 10064 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
docs/dev/debt/libSceAgcDriver.md
PR 10231 docs/dev/ENVIRONMENT.md
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10244 docs/dev/ENVIRONMENT.md
PR 10249 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.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 10254 docs/dev/ENVIRONMENT.md
PR 10264 docs/dev/ENVIRONMENT.md
PR 10272 docs/dev/ENVIRONMENT.md
PR 10348 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/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
PR 10420 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/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawLookup.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
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
core/libs/prx/libSceAgcDriver/Graphics/src/PipelineJournal.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderValidation.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/ENVIRONMENT.md
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 10515 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10581 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/Recompiler.hpp
core/shader/recompiler/SpirvBackend/src/SpirvModuleEmitter.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10706 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp

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

Raghav314 and others added 22 commits October 24, 2026 21:15
buildRingWords cleared the stored ShaderData words, so a ring hit fell
back to the template's words past the user-data prefix; it now copies the
current user words over the stored ones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rotating the two-generation memo destroyed the whole previous generation
(up to 16384 keys of captures and words) on the draw thread, a 16-20 ms
heap_direct stall every few seconds in MC D2. Each insert now frees two
old entries, so the old generation is empty before the next rotation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…PIPELINE_STATS

Per-call time of the draw stage's preparation, heap stage call, walk memo, walk, materialize and finish on
the queue worker, and of the resource template find and build, slot mapping, stage data and buffer
address writes on the committer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cost line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…its key

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An indirect dispatch with USE_THREAD_DIMENSIONS stores its thread limit in
the ShaderData words at record time, which heap stages keep in a ring span,
so these dispatches were kept off the heap. The limit now goes into the
dispatch's ring span: the stage takes a fresh span before its data is
written and drops it afterwards, so a kept span that other dispatches read
never changes. The ring takes transfer writes for the copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ces too small for its slots

The sampler heap held 256 samplers, an eighth of what D3D12 allows, so
scenes with many samplers swept it early. It now holds 2048, which fits
NVIDIA's sampler heap beside its embedded sampler range. A device whose
resource or sampler heap cannot hold the slots no longer enables the heap
and takes the per-draw path, instead of failing at the first heap use.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es the per-draw path

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and buffer back in classic descriptor mode

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tor heap

agc_driver_heap_draw_sample_heap, _nogpl_heap, _full_heap and
_full_heap_pipelined, and agc_driver_pipeline_journal_gpu_heap set
APS5_GPU_HEAP and then require the heap to take the draw's stages, to
refuse a capped heap or to put a compute stage in GPU mode. On a device
where DescriptorHeapEnabled() stays false (no VK_EXT_descriptor_heap, or
one without maintenance5, room for the heap's slots or enough push data)
none of that can happen, and they failed instead of skipping. They now
exit 77 with a "skipped, the device lacks VK_EXT_descriptor_heap, ..."
line there, and run as before on a device with the heap.

(cherry picked from commit 0a01340)
A run with APS5_GPU_HEAP recorded its pipelines in the same journal as a
run without it, so each mode replayed the other's records: those failed
at the pipeline layout check, and they took places in the replay limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the descriptor heap on, buffers are reached through buffer
addresses, which have no Coherent buffer array and no 64-bit view. GLC
loads and stores became plain 32-bit accesses, so a compute shader that
polls a queue slot another workgroup writes never saw the write and the
GPU hung (RoboCop: Rogue City at the splash, Xid 109).

GLC dword accesses through a buffer address are now device-scope atomic
loads and stores, and GLC two-dword accesses use one 64-bit atomic as the
storage-buffer path does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r cache invalidation

A program with GLC or DLC accesses that invalidates the vector caches
reads the whole guest buffer array as Coherent on the storage-buffer
path, so its loads without GLC see other work-groups' writes after the
invalidation. Through buffer addresses those loads and stores stayed
plain. They are now device-scope atomic loads and stores in such
programs, as GLC accesses already are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… on Windows

MinGW declares no setenv, so the heap draw sample did not build on Windows; it now sets its environment with _putenv_s there, as the other tests that set a variable before opening the device do. Those tests and agc_storage_refresh_proofs also exited with 0xc0000135 on Windows without libc's directory on PATH, which they now get like the rest of the driver's tests.
…bgroups

The atomics kernel built its table key with v_readfirstlane_b32 of 5 plus the lane index, which is 5 for the whole wave64 only when the host runs the wave as one subgroup. lavapipe runs it as 8-lane subgroups and each takes its own first lane, so lanes 8 to 63 read records 13 and up ("dispatch 0 texel 8 returned 13059, expected 5059"). The key now adds the lane index shifted right by 6, which is 0 in every lane of the wave and still a value the planner can't evaluate.
DeviceBuffer returns its allocation to the pool without a device address. With
the GPU heap's forced addresses, a texture's DeviceBuffer and a device-local
Buffer with SHADER_DEVICE_ADDRESS share one pool key, so a Buffer of the same
size took that allocation and kept the address 0. Its first DeviceAddress()
threw "buffer has no device address" from a compute dispatch's BDA table.

Query the address when a reused allocation has none.
A pixel stage whose LDS lives in the pixel function LDS buffer used its own
descriptor set, which heap pipelines cannot bind, so the stage was refused
and the whole draw fell back to per-draw descriptor sets.

The resource heap now keeps one storage buffer descriptor after the image
slots. The pool buffer gets a device address when the device has the heap,
and its descriptor is written into that slot the first time a heap draw
prepares it. The pixel LDS set maps onto the slot with a constant offset, so
heap pipelines no longer bind the set.

Tested: agc_driver_heap_draw_sample* draws a texture through LDS at dword
4352 (past the 4096-dword private storage, so it uses the pool) with and
without the heap. With the mapping disabled the heap run refuses "the heap
did not take the fragment stage". Full ctest -j4 -E agc_driver_bda_device:
only the three sample_order tests fail, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No behaviour change. Only code this branch adds is touched; functions that
exist on main keep their shape.

- BindlessHeap: the texture, storage and view slot requests share one
  take-or-sweep, claim and free path; image and sampler descriptors are
  written directly instead of through a VkWriteDescriptorSet that was
  unpacked again; heapBindings returns one result struct instead of five
  out parameters, and the heap mappings are built by two helpers.
- MaterializeHeapStage: the memo lookup, the walk's reads, the settle
  check (written twice before), the guards and the memo insert are
  separate functions.
- ShaderResources::writeHeapStage: slot key, slot currency, slot taking,
  generations, verification and slot word patching are separate members;
  the table map and slot code share one placeholder view helper.
- Statistics lines, the compute heap pipeline call and the heap draw
  sample's shader and message selection no longer sit in one line each.
- The files this branch adds, and its heap functions in ShaderResources,
  are wrapped at 140 columns with clang-format (4-space indent, attached
  braces, short ifs and loops kept on one line, includes not sorted,
  string literals not split).

Tested: full ctest -j4 -E agc_driver_bda_device passes as before (only the
three sample_order tests fail); agc_driver_heap_draw_sample with and
without APS5_GPU_HEAP under VK_LAYER_KHRONOS_validation reports no VUID.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…wn program

A draw-resource-cache hit reuses a build whose stages may belong to
another program with the same bindings. writeHeapTableMap found its
table by the build's program pointer: a different program skipped the
map refresh, and a new program at a freed one's address matched and read
the freed program's image table binding (Resident Evil Village PPSA01556
crashed on its atomic flags).

The table is now found by its stage, and the image table binding comes
from this draw's program, the last ImageTable or ImageStorageTable
binding as the build picks it. The build's program and binding pointers
are cleared once the build finishes, so no table keeps a pointer into a
program it does not own.

The test builds a heap set, destroys its program and refreshes the set
for an equal-content program, once at another address and once at the
destroyed program's address with its freed binding memory overwritten.
Without the fix the first leaves the table map unset and the second
crashes.

Co-authored-by: Yunus Shaikh <75296019+EagleBearerYS@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
agc_driver_heap_compute_sample_heap and its pipelined variant could not
load libc on Windows (0xc0000135); the draw heap variants already
prepend libc's directory to PATH.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t run

The sample took its expected mode from DescriptorHeapEnabled(), so with
APS5_GPU_HEAP set on a device without the heap it passed by testing the
plain path. It now takes the request from APS5_GPU_HEAP and exits 77
with a reason when the heap is requested but unavailable, as the draw
sample does; on a capable device the heap assertions stay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On Windows a module thread_local's destructor runs after emulated TLS has
already freed the object (prx_thread_local_destructors).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Raghav314
Raghav314 force-pushed the perf/agc-vk-descriptor-heap branch from ba0cfa6 to b175572 Compare October 24, 2026 15:53
@Raghav314

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Moved the heap's swept-storage thread_local into HostThreadLocal (b175572). All five registrations came from that one object; the PR's other new thread_locals are trivially destructible. I also rebased onto main 3fcb5e4. Main's 2181bfc removed DispatchDepthSample, so the heap's edits to it were dropped. The format version stays at 48 (main is at 47). The full Linux ctest passes locally (2154/2154). Thanks for re-running both lanes.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@Raghav314 Thanks for the quick thread_local fix in b175572; our delta review passes it on the source side, and the Windows run comes next.

One request on size before we go further: at +7,215/-779 across 122 files, this is a lot to review, gate and land as one change, and every fix round means re-reviewing the whole thing. Could you split it into smaller PRs that land in order? Roughly:

  1. The groundwork that doesn't change behaviour (helpers, refactors, tests that pass on main).
  2. The descriptor heap itself behind APS5_GPU_HEAP, off by default.
  3. Turning it on, or wider use, as its own follow-up.

Exactly where the lines fall is your call; what matters is that each piece builds, passes CI and can be reviewed on its own. Smaller pieces will merge a lot faster than one large PR, and the review work already done carries over.

@Raghav314

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Thanks. I'd prefer to keep this as one PR. The heap is opt-in behind APS5_GPU_HEAP and off by default, so it changes nothing unless the switch is set. The pieces you describe aren't independent, though. The recompiler's GPU mode and the driver's heap stages are one contract:

  • The recompiler emits stages that read images through the heap and guest buffers through address words in the stage data.
  • The driver writes those words and heap slots per draw. ShaderResources requires the stage's address word count to match its buffer bindings.
  • A heap pipeline maps only the bindings the recompiler leaves, and it refuses any classic buffer binding.

Neither side can be checked without the other. A recompiler-only PR would be codegen with no consumer, and a driver-only PR would be heap plumbing with no stage that uses it.

The tests that matter are end to end for the same reason: the heap draw and compute samples, address passes, table stage reuse, and RoboCop's hang case. Those tests are what found the real bugs:

  • the GLC coherence hang (1e558e0)
  • the table lifetime fix (bb1e415)
  • the swept-storage thread_local on Windows (b175572)

Split into a stack, the early PRs would land without the tests that exercise them, and each later piece would reopen the earlier ones whenever a fix crossed the boundary, as these fixes did. The source review is already done on this head, so another full round over a reshuffled stack would cost more than landing it as is. If you still want it split after the Windows run, I'll do it.

This branch has not been deployed

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

Labels

agc libSceAgc* build docs perf Performance change shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants