Skip to content

perf(agc): draw finisher pipeline (APS5_DRAW_PIPELINE) - #6946

Draft
Raghav314 wants to merge 10 commits into
boykopovar:mainfrom
Raghav314:perf/agc-draw-pipeline
Draft

Raghav314 wants to merge 10 commits into
boykopovar:mainfrom
Raghav314:perf/agc-draw-pipeline

Conversation

@Raghav314

@Raghav314 Raghav314 commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

What

An opt-in draw path, APS5_DRAW_PIPELINE=1, that takes per-draw work off the queue worker. Stacked on #5656; only the last six commits are this PR.

  • Draw finisher. With pipelined draws, the second half of a draw (stage materialization, the draw cache insert, the hand-off to the committer) runs on its own thread while the worker reads the next draw's packets. The worker waits for it before the next cache lookup, before packets that are not register writes or draws, and before guest reads. A draw whose stages may write memory (ProgramWritesMemory, from the decoded program) is finished in place.
  • Commit trims. The committer skips work whose inputs are the same as the last commit's: the fragment-output validation and the storage-image layer scans.
  • Epoch proofs. A resource or storage image proved current is not proved again in the same collect epoch until a CPU write, a write-back or a recorded write breaks the proof.
  • Ordered metadata passes. Color metadata passes (resolve, fast-clear eliminate, DCC decompress) go through the pipeline with their write ranges instead of draining it.
  • Shape refresh. A shape entry left at an old draw by main's second-sight admission is replaced in place when the same read user words are seen twice.
  • Labels behind the finisher. A WRITE_DATA or RELEASE_MEM label the worker queues while the finisher holds draws goes through the finisher's queue instead of draining it, so it reaches the committer after those draws; until then its range and value are a pending write of the finisher, and a WAIT_REG_MEM that the pending value satisfies stays beside the finisher, as it did beside the committer.
  • Capture memory. On Linux the main image's pages get a page table entry as on Windows, and capture pages are pooled across threads.

Always on, with the same results: the draw resource key is appended in place with a per-result memo and hashed four lanes at a time, a vertex stage's attribute and buffer table words are read in one read, and the pending storage-image check skips ranges the pending set cannot overlap.

The switch is meant with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 (both on main). APS5_VERIFY_DRAW_PIPELINE=1 runs the full checks next to the reused proofs and counts differences.

Measuring: APS5_PROFILE_DRAW=1 finishes every draw on the worker, so it does not measure this switch. APS5_PIPELINE_STATS (any value; 1 also turns on Vulkan pipeline statistics) prints [finisher] lines with the draws handed off and kept, and [finisher-held] lines with why draws were held back.

PPSA36082

On current main the switch takes work off the worker, and with the labels behind the finisher it rarely drains, but the frame time does not change. Level UI standing still, APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 APS5_PIPELINE_STATS=2, default import budget, no APS5_PROFILE_* switch, APS5_TRACE_EVENTS=1048576 so the traces are whole, this PR with #8120 on main a700809 (the run without the switch is from the build before the WAIT_REG_MEM part of the label commit, which only acts with the switch on):

  • without the switch:

    {"commit":"081c1657f83f","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_PIPELINE_STATS":"2","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","resolution":"1920x1080","window":{"spec":"seconds 70:10","first_present":5066,"ms":10000.336},"presents":691,"frame_ms":{"p50":14.296,"p90":15.825,"p99":18.114,"max":35.734},"gpu_busy_ms_per_present":2.519,"worker_busy_pct":{"queue worker 0x0":91.330},"top_phases_ms_per_frame":{"Driver.Packet":13.209,"Driver.Packet.draw":11.265,"Driver.Draw":11.132,"Graphics.Draw":9.211,"Graphics.Draw.draw_and_resource_release":7.351,"Driver.Draw.shader_compile_and_link":6.765,"Shader.DrawStage":4.657,"Shader.DrawStage.capture_resources":2.330},"trace_dropped":false,"trace":"aps5-trace-081c1657f83f-857785.json.gz"}
    
  • with APS5_DRAW_PIPELINE=1:

    {"commit":"f9c3c41fbdd8","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_PIPELINE_STATS":"2","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","resolution":"1920x1080","window":{"spec":"seconds 70:10","first_present":5271,"ms":10011.445},"presents":697,"frame_ms":{"p50":14.307,"p90":15.654,"p99":18.585,"max":21.947},"gpu_busy_ms_per_present":2.774,"worker_busy_pct":{"queue worker 0x0":88.678},"top_phases_ms_per_frame":{"Driver.Packet":12.724,"Driver.Packet.draw":10.895,"Driver.Draw":10.781,"Graphics.Draw":9.142,"Driver.DrawFinish":8.876,"Graphics.Draw.draw_and_resource_release":7.224,"Driver.Draw.prepare":6.255,"Driver.DrawFinish.shader_compile_and_link":5.110},"trace_dropped":false,"trace":"aps5-trace-f9c3c41fbdd8-860785.json.gz"}
    
  • plain main 0d8c51a, same spot and environment, without perf(agc): data-only draw hits compare only the user words a stage reads #5656, fix(agc): write-watch the AGC driver memory on Linux #8120 or this PR:

    {"commit":"0d8c51a54e04","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_PIPELINE_STATS":"2","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.2.10-1-cachyos","resolution":"1920x1080","window":{"spec":"seconds 70:10","first_present":3548,"ms":10004.538},"presents":452,"frame_ms":{"p50":21.974,"p90":24.444,"p99":27.492,"max":30.388},"gpu_busy_ms_per_present":3.348,"worker_busy_pct":{"queue worker 0x0":91.941},"top_phases_ms_per_frame":{"Driver.Packet":20.343,"Driver.Packet.draw":17.988,"Driver.Draw":17.809,"Driver.Draw.shader_compile_and_link":13.155,"Graphics.Draw":11.066,"Graphics.Draw.draw_and_resource_release":9.103,"Shader.DrawStage":8.681,"Shader.DrawStage.capture_resources":5.627},"trace_dropped":false,"trace":"aps5-trace-0d8c51a54e04-1061252.json.gz"}
    
  • Presents in 10 s: 452 on plain main, 691 with this PR without the switch, 697 with it (single runs here vary by about 2-3%). Shader compile and link per frame is 13.2 ms on plain main and 6.8 ms on this stack without the switch. I have not split how much of that comes from perf(agc): data-only draw hits compare only the user words a stage reads #5656 and how much from this PR's commits outside the switch, and the plain main run is on a newer main than the other two. Neither run refused the import fix(agc): write-watch the AGC driver memory on Linux #8120 is about.

  • Queue worker busy: 91% without, 89% with. The two switch-on runs before the WAIT_REG_MEM part of the label commit had the worker 82.4% and 83.1% busy (708 presents each). The rise to 89% is in draw preparation (Driver.Draw.prepare 5.5 to 6.3 ms per frame), not in the packets around the waits (1.71 to 1.83 ms per frame, with the 81,054 WAIT_REG_MEM drains gone). The finisher's draw time (8.2 to 8.9 ms) and the GPU (2.5 to 2.8 ms per present) rose by about as much, and neither runs that code, so I read it as run-to-run variance, from one run each.

  • Drains of the finisher per 10 s: 82,467 before the label commit (81,762 of them WRITE_DATA), 9,394 after it (all DISPATCH_DIRECT beside commits). It hands off 775,606 draws per 10 s and finishes none on the worker.

  • The committer is about 75% busy either way (commits times the time per commit on the [draw] pipelined line) and the GPU about 2.8 ms per present, so no thread is saturated in this scene. I have not found what sets the frame time here.

The earlier pair on this PR (469 to 807 presents) was on a main where the worker alone limited the frame. This stack now gets most of that without the switch (691 presents above, against 452 on plain main).

Tested

Linux (CachyOS), x86-64, GCC, 7800X3D / RTX 4090, NVIDIA 615.78.08, on main 0d8c51a with #5656.

  • The linux job of current build.yml run locally: configure with SPIRV tools on, test registration check, build, libs, the whole ctest and conventions. 1693/1693 pass, 16 expected skips, conventions OK.
  • The agc_driver_* tests again with APS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1: 623/623 pass.
  • Twenty existing tests (now also agc_driver_same_queue_label_wait and agc_driver_unimported_label_order) that check results after CPU writes, BDA reads, pipelined DMA and fills, draw cache reuse and a rejected draw also run with the switch (*_draw_pipeline).
  • New tests: agc_driver_pipelined_metadata_pass (fast-clear eliminates sent through the pipeline stay ordered with the queued commits and stores, write the expected texels and leave the CMASK expanded), agc_driver_program_writes_memory (buffer and image stores, GDS writes and indirect jumps count as writes; loads and export-only programs do not; the answer is cached per program), agc_driver_draw_data_hit_user_words_refresh (the shape entry is replaced, not added, at the second sight of the same read words), agc_driver_draw_finisher_trace (Scramblrrrr's: the finisher's CPU work is in the trace), agc_driver_finisher_label_order (eight draws each followed by a WRITE_DATA label and a WAIT_REG_MEM on it: the labels hold their values, the draws write the expected color, and with the switch neither packet drains the finisher; without the label commit it fails with 0x37 x8, without its wait part with 0x3c x8).

Since the last review

  • Rebased onto main 0d8c51a with perf(agc): data-only draw hits compare only the user words a stage reads #5656.
  • DrawFinisher::Drain, Settle and the full-queue wait in Enqueue throw when they run under the GPU lock, as DrawPipeline already did.
  • A draw that fails on the finisher names its own submission and packet offset in the error and in the capture trace (draw-error ... finisher=1), instead of being reported as the packet that next drained the finisher. agc_driver_draw_unsupported_buffer_type_draw_pipeline checks it.
  • The finisher thread binds itself to the trace (Scramblrrrr's commit, taken as is).
  • [finisher-held] lines also print under APS5_PIPELINE_STATS, and USAGE.md says that APS5_PROFILE_DRAW turns the hand-off off.
  • The _refresh user-word test gets libc's directory on PATH on Windows.
  • Labels the worker queues go through the finisher instead of draining it (teepean's first lead), with the waits on them.

Known limits

  • Retired pipeline items and finished finisher jobs are freed at the next enqueue, so when the queue goes quiet up to the pipeline depth of closures (and what they hold) stay alive until the next draw.
  • Register loads behind held draws whose writes are not known still drain the finisher (teepean's second lead, from Stray). In Hades II there are none; it is a follow-up.

Why this is one PR

Several parts on their own made the frame rate worse in Hades II; only the combination gave the gain (measured on the earlier main of the first pair above).

  • The finisher alone halved the worker's busy time (96% to 46%), but the committer became the limit and the frame rate went down (hub 105 fps on, 111 off). The commit trims and epoch proofs are what make the committer keep up with the faster worker.
  • main's second-sight admission leaves a shape entry at an old draw, so with the faster worker data-only reuse of vertex stages fell from about 80% to 17%; with the shape refresh it is back to 83% (hub 108 to 117 fps).
  • The metadata passes go through the pipeline because otherwise every resolve or fast-clear eliminate drains it. The capture memory changes are the smallest part and sit under the same switch so there is one path to test.

Testing other titles

Please post:

  • the title ID, GPU, driver and OS;
  • the summary line (APS5_TRACE_SECONDS=70:10 APS5_TRACE_EVENTS=1048576) with and without APS5_DRAW_PIPELINE=1, both with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 and nothing else changed (not APS5_PROFILE_DRAW, see above);
  • whether anything renders differently;
  • with APS5_VERIFY_DRAW_PIPELINE=1, the last [epoch-proofs] line in the log (any nonzero "differed" or "failed" count is a bug).

Checklist

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

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

Pull request Shared files not compared
PR 674 CMakeLists.txt
PR 862 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1191 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.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/src/Driver/Draw/DrawPrecheck.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/Recorder.cpp
PR 1835 CMakeLists.txt
PR 1896 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 3786 CMakeLists.txt
docs/user/USAGE.md
PR 4072 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 4448 core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4449 docs/dev/debt/libSceAgcDriver.md
PR 4847 docs/user/USAGE.md
PR 5021 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.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/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5372 docs/dev/debt/libSceAgcDriver.md
PR 5404 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/DrawCache.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCacheStatistics.cpp
PR 5426 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5431 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 5441 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 5481 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/DispatchAhead.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
PR 5499 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 5609 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/DrawCache.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 5883 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/DispatchAhead.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 6044 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
PR 6108 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6146 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6169 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6171 docs/user/USAGE.md
PR 6182 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6185 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.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
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
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/GuestMemory.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/DrawCache.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCacheStatistics.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Execution/src/ShaderMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
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/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
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
docs/dev/debt/libSceAgcDriver.md
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6202 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/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6218 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
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/shader/recompiler/Recompiler.hpp
PR 6249 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6273 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6292 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6340 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
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/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6481 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 6488 core/shader/recompiler/ShaderDiskCache.cpp
PR 6498 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6501 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
PR 6539 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/DrawCache.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawCapture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6548 docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6586 docs/user/USAGE.md
PR 6588 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6612 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/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 6615 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6617 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
PR 6636 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 6639 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 6642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6682 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/UnitShadow.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6718 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.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
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6727 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6741 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6743 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6747 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6788 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/user/USAGE.md
PR 6801 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 6804 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6820 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.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
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6848 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6858 core/shader/recompiler/ShaderDiskCache.cpp
PR 6867 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6868 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6879 CMakeLists.txt
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ENVIRONMENT.md
PR 6887 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6905 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6921 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6924 core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 6926 core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6948 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 6951 docs/dev/ENVIRONMENT.md
PR 6959 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6960 core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6965 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6970 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.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 6973 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 6977 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6987 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 6989 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 6995 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 7002 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
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 7085 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7201 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
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/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
PR 7223 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
PR 7233 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 7246 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.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
docs/dev/debt/libSceAgcDriver.md
PR 7261 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 7264 CMakeLists.txt
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 7307 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 7310 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7369 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/DrawCache.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 7371 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 7395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
PR 7410 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderInputState.cpp
core/shader/recompiler/Recompiler.hpp
PR 7446 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7449 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
docs/dev/debt/libSceAgcDriver.md
PR 7450 docs/dev/ARCHITECTURE.md
docs/user/USAGE.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 7464 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 7465 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7466 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7484 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/Recompiler.hpp
docs/dev/ENVIRONMENT.md
PR 7505 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7535 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7550 core/shader/recompiler/ShaderDiskCache.cpp
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
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 7618 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7622 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
tools/tests/test_shader_cache_runtime_sources.py
PR 7629 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7643 docs/dev/ENVIRONMENT.md
PR 7644 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/ARCHITECTURE.md
PR 7645 CMakeLists.txt
PR 7647 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7659 docs/dev/debt/libSceAgcDriver.md
PR 7668 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7677 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7682 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 7684 core/shader/recompiler/ShaderDiskCache.cpp
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/libs/prx/libSceAgcDriver/tests/execution/DrawUnsupportedBufferType.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 7691 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawCache.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
PR 7705 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 7717 docs/dev/debt/libSceAgcDriver.md
PR 7729 docs/dev/debt/libSceAgcDriver.md
PR 7799 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7800 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
docs/dev/debt/libSceAgcDriver.md
docs/user/USAGE.md
PR 7803 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7814 docs/dev/ENVIRONMENT.md
PR 7817 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7831 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 7833 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 7844 docs/dev/debt/libSceAgcDriver.md
PR 7849 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
PR 7883 docs/dev/debt/libSceAgcDriver.md
PR 7888 core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 7893 docs/dev/debt/libSceAgcDriver.md
PR 7910 docs/dev/debt/libSceAgcDriver.md
PR 7911 docs/dev/debt/libSceAgcDriver.md
PR 7918 docs/user/USAGE.md
PR 7919 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7920 docs/dev/ENVIRONMENT.md
PR 7922 core/shader/recompiler/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 7927 docs/dev/debt/libSceAgcDriver.md
PR 7930 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/ENVIRONMENT.md
PR 7942 docs/user/USAGE.md
PR 7948 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7963 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
PR 7965 docs/dev/debt/libSceAgcDriver.md
PR 7978 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7981 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 7984 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 8004 core/shader/recompiler/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
docs/dev/ENVIRONMENT.md
PR 8008 tools/tests/test_shader_cache_runtime_sources.py
PR 8014 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 8016 docs/user/USAGE.md
PR 8026 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8034 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
PR 8043 CMakeLists.txt
PR 8070 docs/dev/debt/libSceAgcDriver.md
PR 8077 core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/ENVIRONMENT.md
PR 8083 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8089 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8099 docs/dev/debt/libSceAgcDriver.md
PR 8104 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8115 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8117 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8121 docs/dev/debt/libSceAgcDriver.md
PR 8123 docs/dev/debt/libSceAgcDriver.md
PR 8126 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 8139 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 8140 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 8145 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8160 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8161 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketExecution.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8162 docs/user/USAGE.md
PR 8180 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8212 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ARCHITECTURE.md
PR 8213 docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 8223 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/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 8261 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8267 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8281 docs/dev/debt/libSceAgcDriver.md
PR 8283 docs/dev/debt/libSceAgcDriver.md
PR 8317 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8319 docs/dev/debt/libSceAgcDriver.md
PR 8336 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8339 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
PR 8340 core/shader/recompiler/Recompiler.hpp
PR 8365 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 8372 core/libs/prx/libSceAgcDriver/CMakeLists.txt
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
PR 8374 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 8395 docs/dev/debt/libSceAgcDriver.md
PR 8401 docs/dev/debt/libSceAgcDriver.md
PR 8412 docs/dev/debt/libSceAgcDriver.md
PR 8419 docs/dev/debt/libSceAgcDriver.md
PR 8420 docs/dev/debt/libSceAgcDriver.md
PR 8423 docs/dev/debt/libSceAgcDriver.md
PR 8424 docs/dev/debt/libSceAgcDriver.md
PR 8426 docs/dev/debt/libSceAgcDriver.md
PR 8429 core/shader/recompiler/CMakeLists.txt
PR 8445 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8484 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
PR 8489 core/shader/recompiler/Recompiler.hpp
PR 8495 core/shader/recompiler/Recompiler.hpp
PR 8519 docs/dev/debt/libSceAgcDriver.md
PR 8527 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 8538 core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8542 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8552 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8563 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.hpp
docs/dev/debt/libSceAgcDriver.md
PR 8564 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8566 docs/dev/ARCHITECTURE.md
PR 8588 CMakeLists.txt
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8608 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8612 core/shader/recompiler/Recompiler.hpp
PR 8615 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8629 core/shader/recompiler/CMakeLists.txt
PR 8639 docs/dev/debt/libSceAgcDriver.md
PR 8657 docs/dev/ENVIRONMENT.md
PR 8658 CMakeLists.txt
core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/Recompiler.hpp
PR 8667 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8672 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 8678 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 8707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8713 core/shader/recompiler/CMakeLists.txt
PR 8735 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Dispatch/DispatchAhead.cpp
PR 8739 CMakeLists.txt
PR 8740 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/GuestMemory.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8751 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
PR 8756 core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 8792 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8856 docs/dev/debt/libSceAgcDriver.md
PR 8858 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8871 docs/dev/debt/libSceAgcDriver.md
PR 8874 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8881 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 8887 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ENVIRONMENT.md
PR 8895 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8896 docs/dev/ENVIRONMENT.md
PR 8898 core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
PR 8900 docs/user/USAGE.md
PR 8908 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 8909 docs/user/USAGE.md
PR 8911 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 8928 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 8930 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 8932 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8939 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
PR 8963 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderAddressResources.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 8971 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 8973 docs/user/USAGE.md
PR 8975 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
core/libs/prx/libSceAgcDriver/Graphics/include/Draw.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8992 core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
PR 8995 docs/dev/ENVIRONMENT.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
PR 8999 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPrecheck.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9007 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 9012 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
docs/dev/ENVIRONMENT.md
PR 9013 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
core/shader/recompiler/CMakeLists.txt
PR 9017 docs/dev/debt/libSceAgcDriver.md
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/shader/recompiler/Recompiler.hpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9022 docs/dev/debt/libSceAgcDriver.md
PR 9026 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
docs/dev/ENVIRONMENT.md
docs/dev/debt/libSceAgcDriver.md
PR 9036 docs/dev/ENVIRONMENT.md
PR 9050 core/libs/prx/libSceAgcDriver/Graphics/include/ShaderResources.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Draw.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp

@oneandonlydean oneandonlydean self-assigned this Oct 16, 2026
@github-actions github-actions Bot added build shader core/shader docs agc libSceAgc* labels Oct 16, 2026
@TideOPL

TideOPL commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Tested on Minecraft Dungeons II (PPSA16064, UE).

Setup

config p50 / p90 / p99 ms presents in 10 s GPU busy ms per present
base (no new switches) 97.0 / 102.4 / 110.9 · 93.0 / 98.1 / 117.3 103 · 107 41.5 · 44.1
APS5_DRAW_PIPELINE=1 98.1 / 103.9 / 114.3 · 99.7 / 106.3 / 123.1 102 · 100 44.8 · 45.7
APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 110.1 / 115.7 / 131.5 · 122.9 / 133.7 / 146.5 91 · 81 44.6 · 60.5

Draw pipeline. It doesn't speed up this title.

  • Queue worker 0 drops from 99.1% to about 96% busy.
  • The frame stays at about 98 ms. Here, queue 0 also waits about 53 ms per frame in memory_wait for the compute queue (worker 0x20, 99.5% busy), and that isn't on the path this PR moves.

Rendering. Nothing renders wrong in either mode. We took screenshots every 3 s over 90 s of gameplay in each run: no missing textures, no flicker, and no red artefacts. Frames match the base build.

First boot with an empty shader cache. With APS5_DRAW_PIPELINE=1 APS5_GPU_HEAP=1 and ANYPS5_SHADER_CACHE_DIR set to a new, empty directory, the first boot reached gameplay on the first try: title at 23 s, gameplay at 90 s, 919 misses in the first 10 s.

Unrelated failure in the base mode. The base mode (APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 without the new switches) aborted twice during gameplay with compute shader 0x16000c4400: AGC graphics: storing storage image results pending over mem…, then completed on the third boot. Neither new mode hit it in these runs.

Heap verify lines are in #6947.

Summary lines (second run of each)
{"commit":"14697483367c","dirty":false,"env":{"APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_STAGING_POOL_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 610.88","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 70:10","first_present":2469,"ms":10039.361},"presents":107,"frame_ms":{"p50":93.045,"p90":98.051,"p99":117.339,"max":118.137},"gpu_busy_ms_per_present":44.053,"worker_busy_pct":{"queue worker 0x0":99.116,"queue worker 0x20":99.551},"top_phases_ms_per_frame":{"Driver.Packet":186.280,"Driver.Packet.memory_wait":53.009,"Driver.Packet.dispatch":48.448,"Driver.Dispatch":48.189,"Driver.Packet.draw":38.371,"Driver.Draw":38.263,"Driver.Packet.device_lock":27.892,"Vulkan.Dispatch":23.804},"trace_dropped":false}
{"commit":"14697483367c","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_STAGING_POOL_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 610.88","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 70:10","first_present":2387,"ms":10090.606},"presents":100,"frame_ms":{"p50":99.654,"p90":106.292,"p99":123.087,"max":123.087},"gpu_busy_ms_per_present":45.665,"worker_busy_pct":{"queue worker 0x0":95.920,"queue worker 0x20":99.521},"top_phases_ms_per_frame":{"Driver.Packet":197.090,"Driver.Packet.memory_wait":53.561,"Driver.Packet.dispatch":53.051,"Driver.Dispatch":52.768,"Driver.Packet.draw":41.396,"Driver.Draw":41.277,"Driver.Packet.device_lock":27.177,"Vulkan.Dispatch":23.692},"trace_dropped":false}
{"commit":"14697483367c","dirty":false,"env":{"APS5_DRAW_PIPELINE":"1","APS5_GPU_HEAP":"1","APS5_PIPELINED_DRAWS":"32","APS5_PIPELINE_DISPATCH":"1","APS5_STAGING_POOL_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"70:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 610.88","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 70:10","first_present":1156,"ms":10113.969},"presents":81,"frame_ms":{"p50":122.860,"p90":133.686,"p99":146.471,"max":146.471},"gpu_busy_ms_per_present":60.490,"worker_busy_pct":{"queue worker 0x0":96.705,"queue worker 0x20":99.552},"top_phases_ms_per_frame":{"Driver.Packet":244.925,"Driver.Packet.dispatch":66.312,"Driver.Dispatch":66.010,"Driver.Packet.memory_wait":62.871,"Driver.Packet.draw":53.253,"Driver.Draw":53.128,"Driver.Packet.device_lock":37.632,"Vulkan.Dispatch":34.611},"trace_dropped":false}

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

Measurements are there and the numbers are good (469 to 807 presents in 10 s, p50 21.1 to 12.2 ms, p99 also lower). Three things before this can be judged.

  • One run each, standing still in a menu, on a 4090 at 1080p. The A/A spread of this setup is not shown (compare #5353, where two identical captures differed by 6.4%), and a menu is the best case for draw-cache reuse. Please add a second pair in gameplay, and repeat the pair once to show the spread.
  • This is one switch over seven unrelated changes (finisher thread, commit trims, epoch proofs, ordered metadata passes, shape refresh, straight-line walk, capture memory). The description says the finisher alone made the frame rate worse (105 fps on, 111 off) and that "only the combination" helps. That is a reason to measure each part against its predecessor and land them in order, not to bundle them: nobody can tell which part carries the gain or the risk. At minimum, split off the parts the finisher does not need (metadata passes, straight-line walk, capture memory).
  • Known limit: agc_driver_draw_cache_relocation fails with the switch on. A path that breaks an existing test should not become a default. Make the walk fall back to the relocatable capture when the cache has relocation enabled, or document which titles need relocation.

It is also stacked on #5656 and #6632, so the diff shown here includes their commits. Rebase after they land so only this PR's two commits remain.

@Raghav314

Copy link
Copy Markdown
Contributor Author

@CnRJay thanks for the review.

"Menu". That was a poor word on my side. The scene is not the main menu: it is the item pickup UI in a level, which is the heaviest scene I found in Hades II. The hub holds a steady 120 fps and normal gameplay runs at 100 to 120 fps, so the pickup screen is where the worker is the limit and where the difference shows.

A gameplay trace with both switches (combat in a room, 15 s window, same machine, display at 120 Hz):

presents 1799 in 15 s, frame p50 8.342 / p90 8.344 / p99 8.348 / max 8.397 ms, gpu_busy_ms_per_present 2.216, queue worker 0x0 92.9%, VideoOut.Flip.vblank_wait 8.124 ms per frame

So in combat it sits at the vblank; there is no headroom left to show a difference there on this machine. I have not yet repeated the pair to show the spread.

Splitting. The parts depend on each other in Hades II:

  • The finisher alone halved the worker's busy time (96% to 46%), but the committer then became the limit and the frame rate went down (hub 105 fps on, 111 off). The commit trims and the epoch proofs are what let the committer keep up, and they only matter once the worker feeds it faster.
  • With the faster worker, main's second-sight admission left shape entries at old draws, and data-only reuse of vertex stages fell from about 80% to 17%. The shape refresh brings it back to 83% (hub 108 to 117 fps).
  • The metadata passes go through the pipeline because otherwise every resolve or fast-clear eliminate drains it, so the finisher would wait at each one.
  • The straight-line walk and the capture memory changes are on the capture path. They are the smallest parts; I kept them under the same switch so testers have one path, and APS5_VERIFY_DRAW_PIPELINE=1 checks the walk against the IR evaluator.

So each part could be measured against its predecessor, but the first ones would land as regressions. That is why it is one switch.

I will rebase so only the two commits remain once #5656 and #6632 land.

LLM assistance used.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@TideOPL's run is the first outside Hades II: on Minecraft Dungeons II at 4K the draw pipeline doesn't help (queue 0 waits about 53 ms per frame on the compute queue) and nothing renders wrong. @CnRJay's asks stand: a gameplay pair with its spread, each part measured against its predecessor so they can land in order, and agc_driver_draw_cache_relocation failing with the switch on. To those we'd add an OFF-vs-main summary pair and a full ctest on the current head, a throw when DrawFinisher::Drain, Settle or the full-queue wait in Enqueue run under the GPU lock, and a failed finisher job reported against its own submission. Keep it a draft; it can't land before #5656.

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

Linux, RTX 5080 (driver 615.78.08), Ryzen 7 7800X3D. Base is main 2fab88d with 5656 and 6632 as in the body, then 6946 at f8192a6, all with APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1, warm cache, two 10 s traces each.

frames in 10 s base APS5_DRAW_PIPELINE=1
Astro's Playroom (PPSA01325), first level gameplay 109, 119 138, 135
Hades II (PPSA36082), first area of a new game 640, 646 1122, 1054

Captures match the base in both, and a burst of consecutive Playroom frames shows no glitch. On a Radeon 680M (RADV) Playroom is GPU-bound and the same: 42 base, 43 and 39 with the switch.

One test fails with the switch. In the full ctest (1364 tests) agc_driver_draw_cache_relocation fails 5 of 5 runs with APS5_DRAW_PIPELINE=1 on 6946 and passes 5 of 5 on the base:

with graphics pipeline libraries: the draws that teach the moved pointer and its contents made 0 hits and 1 inserts, expected 0 and 2

Without the switch the suite fails only where the base fails too: agc_driver_store_over_untracked fails 5 of 5 on the base itself, not from this PR. It passes 5 of 5 on current main 0906c64 with 5656 or 6632 merged alone, so it only shows on the older base.

@SleglJan

Copy link
Copy Markdown
Contributor

007 First Light (PPSA11386 v01.018.000), 4K output, as asked on Discord. The heap runs are on #6947.

Setup:

run presents frame p50 / p90 ms GPU busy ms per present
base 35 1750.7 / 1817.0 175.4
APS5_DRAW_PIPELINE=1, run 1 32 1877.5 / 1973.1 192.3
APS5_DRAW_PIPELINE=1, run 2 34 1792.2 / 1882.6 181.0
  • Both draw-pipeline runs are slower than the one base run (p50 +41 and +127 ms). They also differ from each other by 85 ms, so with one base sample I can't separate an effect from run-to-run spread.
  • One base sample only: a second base run was killed about a minute in by an unrelated local job. The menu background is animated.
  • The GPU is not the limit in the menu: it is busy ~10% of a frame (175-192 ms per present at 1.75-1.88 s per frame).
    • Queue worker 0 is busy 96-100% of the window. It spends ~1.3 s per frame in draws, most of it capture/prepare: Shader.DrawStage.capture_resources 1,062 ms in the base, Driver.Draw.prepare 1,065-1,089 ms with the draw pipeline. Another 0.34-0.39 s goes to dispatches.
    • The other four workers spend 51-59 s of each ~61-s window in Driver.Packet.memory_wait.
  • Rendering: 13 menu shots per run, 5 s apart, show the same animated menu in both modes, with no missing or wrong textures. The background cycles through scenes, so the shots catch it at different points; it's not a frame-by-frame match, and flicker can't be judged at that spacing.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 17, 2026
EagleBearerYS added a commit to EagleBearerYS/AnyPS5 that referenced this pull request Oct 17, 2026
…its render pass

recordDraw passed every address-based draw to the pass hazard tracker as
both an unknown reader and an unknown writer of guest memory. An unknown
writer conflicts with any earlier access in the pass, so no address-based
draw ever continued the previous draw's pass: each one ended the pass and
began a new one, which loads and stores the attachments again. At Resident
Evil Village's menu about half of all draws are address-based, and about
590 render passes begin for about 850 draws per frame.

A build whose programs only read through the BDA table now reports unknown
reads only. The tracker already orders unknown reads behind any recorded
range write in the pass and keeps later range writes behind them, so such
a draw continues a pass whose earlier draws wrote no guest ranges. Builds
with stores through the table, copied writes, or an address lease without
a table keep both flags. APS5_NO_ADDRESS_READ_PASSES=1 restores the old
behaviour.

Render targets reach guest memory only by explicit write-backs, so a read
through the table sees the same bytes whether or not the pass breaks.

Raghav314's boykopovar#6947 makes the same change inside its GPU descriptor heap,
with the read-only fact from boykopovar#6946's recompiler field; this one keeps it in
the driver, without a shader cache format change. The idea also comes from
fable-void's 5d57298 (wip/new-gpu-path), which orders address-based
builds by their known access ranges; this takes the read-only half without
his run-time pre-pass bounds.
@Raghav314

Copy link
Copy Markdown
Contributor Author

A repeat on the current head (d63a804, with the Windows fix), next to #6949 which prepares draws on a thread pool. Hades II (PPSA36082), the level's item pickup UI, Linux, RTX 4090, 7800X3D, NVIDIA 615.78.08. All three builds are main 2fab88d + #5656 + #6632; #6949 is a local cherry-pick of e2d9ac8 onto it. APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1 APS5_HOST_IMPORT_MIB=6784, warm shader cache, trace 70:10, one run each:

build presents in 10 s frame p50 / p99 ms queue worker 0 busy
base 499 19.9 / 25.3 93%
this PR, APS5_DRAW_PIPELINE=1 824 12.0 / 14.9 84%
#6949, APS5_DRAW_PREP_THREADS=4 501 19.8 / 23.3 93%

The earlier run on the pre-rebase head gave 807 against a base of 469, so the gain repeats (+72% then, +65% now). In this scene #6949's pool keeps no draw in flight (avg 0.0 in flight, the worker waits for it to empty about 13,000 times a second), so it does not add to this path yet; details are on #6949. The two PRs change the same part of Driver::draw, so they conflict.

LLM assistance used.

@JAB-dev

JAB-dev commented Oct 17, 2026

Copy link
Copy Markdown
Contributor

Besiege (PPSA20313), Windows, RTX 4070 SUPER, Ancient Grounds sandbox (about 1000 draws per frame), head f8192a6 with APS5_DRAW_PIPELINE=1 on top of current main: 17.0 -> 20.0 FPS (three alternating runs each: 17.3/17.2/16.6 before, 20.3/19.8/20.0 after). A 10 minute run in the level on top of other open perf PRs had no errors and the frame looks the same.

@blawesom

Copy link
Copy Markdown
Contributor

Rebase handoff — rebased onto current main (all nine commits, authorship unchanged; this PR is the lower half of the #6947 stack, so its commits re-anchor that series too). The conflict in docs/user/USAGE.md keeps your Draw-pipeline section alongside main's newer Texture-cache-budget section.

Verified on Linux (CachyOS, kernel 7.2.9, GCC 16.2.1, Ninja, Release, BUILD_TESTING=ON, AMD RX 9070 XT / RADV):

To pick it up:

git fetch https://github.com/blawesom/AnyPS5 rebase/6946
git checkout <your branch>
git merge --ff-only FETCH_HEAD

Head is c17fe7fa2.

@Raghav314
Raghav314 force-pushed the perf/agc-draw-pipeline branch from d63a804 to d0779ad Compare October 17, 2026 12:21
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 17, 2026
@Raghav314
Raghav314 force-pushed the perf/agc-draw-pipeline branch from d0779ad to 5e45089 Compare October 17, 2026 13:40
@oneandonlydean

Copy link
Copy Markdown
Collaborator

We checked 5e45089: only 805774e changed, and it resolves correctly against the committer Stop from #6641.

One low-priority follow-up, affecting APS5_DRAW_PIPELINE=1 at exit only: DrawFinisher isn't drained before Queue0().Stop(), and a ProcessShutdown during a submission skips its drain. A finishDraw job can then run after device.Reset(). Draining the finisher before the queue stops would close it.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 17, 2026
@EagleBearerYS

Copy link
Copy Markdown
Contributor

A macOS build fix for this PR, as a ready commit in case it's useful.

What fails. Apple clang's libc++ has no std::atomic<std::shared_ptr<T>>. The recompiler headers stop at std::atomic's static assertion, "std::atomic requires that 'T' be a trivially copyable type", on this line in ResultKeyMemo:

core/shader/recompiler/Recompiler.hpp:647: mutable std::atomic<std::shared_ptr<const std::vector<std::uint32_t>>> words;

  • Where it shows: the macOS relinker build, which compiles request_serializer_tests.
  • Where it comes from: "perf(recompiler): straight-line SRT walk for resource capture" (f6cfc22 on the current head, 3f10f02 before the rebase).
  • Why it hasn't shown here: this PR's checks skip the full builds.

The commit: 8a97b049c4 on exp/pr6946-atomic-memo-5e45089. It is one commit on this PR's current head, 5e45089.

  • The memo: ResultKeyMemo::words becomes AtomicSharedPtr<const std::vector<std::uint32_t>>, from prx/libc/include/general/AtomicSharedPtr.hpp.
    • Where the library has std::atomic<std::shared_ptr>, AtomicSharedPtr is that type.
    • Elsewhere it is a locked shared_ptr with the same load and store, so the uses in Draw.cpp don't change.
  • The build files:
    • the header joins shaderCacheKeySources, which the cache key's include check requires;
    • request_serializer_tests gets core/libs on its include path.

Runs on our fork. These use the full Build workflow on Windows and macOS. The fork has no Linux job; libstdc++ takes the std::atomic branch, as Windows' MinGW build does.

  • Red, on this PR's previous head d0779ad, which has the same line: run 39036016193.
    • relinker (macos-latest, clang++) fails at the assertion above (job).
    • Every other job passes.
  • Green, the commit on the current head 5e45089: run 39038100593.
    • Every job passes.
    • The macOS relinker job runs 178 tests, all passing, request_serializer included (job).
    • Windows runs 1421, all passing.
    • The same change on d0779ad was green too: run 39036312034.

The commit also cherry-picks cleanly onto #6947's head cae12b7, so #6947 gets it through the stack. Take it as is, or fix it your own way. If either head moves again, we can redo it there.

@Raghav314
Raghav314 force-pushed the perf/agc-draw-pipeline branch from 5e45089 to b31be5a Compare October 17, 2026 14:39
@Raghav314

Copy link
Copy Markdown
Contributor Author

@oneandonlydean thanks, you're right. The finisher is only drained at the end of a queue 0 submission, so a ProcessShutdown in the middle skipped it. Driver::stop() now drains the finisher after the workers are joined and before Queue0().Stop(), so the committer is still there for any finishDraw that commits, and nothing runs after device.Reset() (19ae932).

LLM assistance used.

Raghav314 and others added 10 commits October 20, 2026 03:57
A data-only hit (boykopovar#494) reused a cached stage only when every user data word
of the stage was unchanged. A stage records the user words it depends on when
it is captured: the words its SRT walk reads as values or bases
(SrtUserDataUse), the words its binding layout forwards into shader data
(userDataRegisterReads), and the vertex fetch table words of its vertex stage
info. A cached stage is now a candidate when only words outside that set
changed; its captured memory is validated as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… SGPR follows a change of that word

The word reaches the data-only mask through userDataRegisterReads (the stage
layout's user-data registers). Dropping those bits from the mask makes the
draw reuse the old stage (it writes 127, expected 191) and verify mode abort.

LLM assistance used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The second half of a pipelined draw (stage materialization, cache insert,
enqueue) runs on a finisher thread, overlapping the next draw's packet
work; draws whose stages could write memory are held back. Commits skip
work whose inputs did not change since the last commit, color metadata
passes are ordered through the pipeline, resource and storage-image proofs
are reused within one collect epoch until a write breaks them, and a shape
entry is refreshed in place at the second sight of the same read user words.
APS5_VERIFY_DRAW_PIPELINE checks reused proofs against a full check.

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

On Windows a thread_local destructor in a module runs after emulated TLS
has freed the object, and prx_thread_local_destructors refuses
libSceAgcDriver.prx for it. The draw pipeline of upstream PR 6946
(Raghav314, f8192a6) added such scratch objects:
DrawFinisher::Enqueue's and DrawPipeline::Enqueue's reclaim lists,
CachedFragmentOutputs' last key and outputs, DecodeVertexStageInfo's
attribute and buffer tables, and PrepareDrawBindings' pool size counts.
They now live in HostThreadLocal, as the driver's other per-thread
scratch does; on other hosts that is the same thread_local.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…+ builds

ResultKeyMemo declared std::atomic<std::shared_ptr<...>>. libc++ has no
atomic<shared_ptr> specialization, so with Apple clang the recompiler
headers stop at std::atomic's trivially-copyable static assertion
(request_serializer_tests in the macOS relinker build). The memo now uses
AtomicSharedPtr from libc, which is that specialization where the library
provides it and a locked shared_ptr with the same load and store otherwise.
The header joins the shader disk cache key's sources, and
request_serializer_tests gets core/libs on its include path.
… finisher

A WRITE_DATA or RELEASE_MEM label the worker queues for the committer
drained the draw finisher first, so that it could not reach the committer
before the draws the finisher still held. In Hades II nearly every drain
of the finisher was one (81,762 of 82,467 per 10 s were WRITE_DATA).
While the finisher holds draws, the label's enqueue now runs as a
finisher job, so it reaches the committer after them, and its write
range and value are a pending write of the finisher until then. A
WAIT_REG_MEM that a pending label satisfies, in the finisher or behind
it, stays beside the finisher as it did beside the committer.

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

mrfelek commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

ASTRO BOT (PPSA21564), Sky Garden, Linux RTX 3080 Ti: a data point for the head before today's rebase, d63a8044f, measured on its base 2fab88d10 (at that point it conflicted with main). Progress save, default settings, hands off from the level start, APS5_TEXTURE_CACHE_MIB=2816 on all three runs (otherwise the sampled texture cache thrashes there, #357). One run each.

Build Presents per 10 s queue 0 per draw capture / recompile / committer wait
2fab88d10 23.8 64 µs 21 / 16 / 14 µs
d63a8044f + APS5_DRAW_PIPELINE=1 28.6 50 µs 18 / 13 / 9.5 µs
d63a8044f without it 28.4 51 µs 18 / 13 / 11 µs
  • About +20% from that stack, but not from the finisher: with APS5_DRAW_PIPELINE=1 set, [finisher] reported 0 draws handed to it, and all ~167k draws per 10 s finished on the worker. Is there a condition in Sky Garden that keeps draws off it?
  • The data-only path (perf(agc): data-only draw hits compare only the user words a stage reads #5656) doesn't add hits here: ~99.5% of draw-cache lookups are "no entry" on all three. The user words that change per draw in this title are read by the stages, as buffer base addresses, so they stay part of the match.
  • The current head (fbe1f8b1e, on 0d8c51a54) no longer carries some of what was under the finisher at d63a8044f: the hand-off spin is in main via perf(agc): spin before blocking on the GPU mutex and the draw committer hand-offs #6632, and c5da616a4 (straight-line SRT walk) is in neither. So the gain above may not carry over to the current head. I haven't measured it yet.

AI-assisted; the runs are from my machine(s).

@mrfelek

mrfelek commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Follow-up on the current head fbe1f8b1e, measured on its base 0d8c51a54. Same machine and settings as above, but started straight into the level with -lvl underwater_aerial_garden (no input, so every run starts the same way), APS5_TEXTURE_CACHE_MIB=2816, 17 intervals of 10 s from the level start, run alternately.

Build Runs Presents per 10 s queue 0 per draw
0d8c51a54 2 28.9, 29.9 49–50 µs
fbe1f8b1e without APS5_DRAW_PIPELINE 1 33.2 42.5 µs
fbe1f8b1e + APS5_DRAW_PIPELINE=1 2 33.3, 33.3 44 µs
  • About +13% on this head, again with or without the switch. [finisher] reported 0 draws handed to it on both pipeline runs, so the gain comes from what is active without it: capture 15.7 → 14.4 µs, recompile ~15 → 12.7 µs and the committer wait 8.2 → 6.5 µs per draw. The draw-cache hit rate is unchanged (~0.6%).
  • The open question stays: in Sky Garden no draw reaches the finisher.

AI-assisted; the runs are from my machine(s).

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@mrfelek On the 0 handed to the finisher: APS5_PROFILE_DRAW turns the hand-off off (it is only taken when profiling is off), and the [finisher] line prints only under APS5_PROFILE_DRAW or APS5_PIPELINE_STATS. If APS5_PROFILE_DRAW was set in those runs, 0 is what it does, and the per-draw capture / recompile / committer-wait breakdown suggests it was. Please rerun with APS5_DRAW_PIPELINE=1 APS5_PIPELINE_STATS=1 and APS5_PROFILE_DRAW unset, and paste the [finisher] line. Indirect draws are never handed off either, so if that level is mostly indirect, 0 can still be right after that change; the line should tell which.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 20, 2026
poonasor added a commit to poonasor/AnyPS5 that referenced this pull request Oct 20, 2026
…povar#6946 onto 4b462ef (programs table, AppendContentKey order, test name clash with the Windows near macro)

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

mrfelek commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

@oneandonlydean you were right, thanks: APS5_PROFILE_DRAW was set in those runs. Rerun on fbe1f8b1e (base 0d8c51a54), Sky Garden via -lvl underwater_aerial_garden, no input, APS5_TEXTURE_CACHE_MIB=2816, APS5_PROFILE_DRAW unset, presents from APS5_TRACE_SUMMARY_EVERY=10 (17 intervals from the level start), run alternately:

Build Presents per 10 s
0d8c51a54 29.5, 30.4
fbe1f8b1e, APS5_PIPELINE_STATS=1 only 35.5
fbe1f8b1e + APS5_DRAW_PIPELINE=1 APS5_PIPELINE_STATS=1 35.8, 36.6
[finisher] draws (10 s): 206791 handed to the draw finisher, 117 finished on the worker; worker drains of the finisher (drained/skipped): lookup 0/870 reads 0/682 packet 2538/132869 kept draw 0/0
[finisher] draws (10 s): 211507 handed to the draw finisher, 105 finished on the worker; worker drains of the finisher (drained/skipped): lookup 0/780 reads 0/649 packet 2389/125908 kept draw 0/0

So the hand-off works in this level, almost every draw goes to the finisher, and the switch adds about 1 present per 10 s on top of the rest of the stack here. The +20% over the base is mostly what's active without it. One run without the switch, so that last step is close to noise.

AI-assisted; the runs are from my machine(s).

This branch has not been deployed

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

Labels

agc libSceAgc* build docs needs rebase Conflicts with main, rebase needed perf Performance change shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.