Skip to content

perf(agc): skip the queued-draw read check when a storage flush stores nothing - #8911

Merged
oneandonlydean merged 1 commit into
boykopovar:mainfrom
Celegans12:perf/agc-held-read-skip-empty-flush
Oct 25, 2026
Merged

oneandonlydean merged 1 commit into
boykopovar:mainfrom
Celegans12:perf/agc-held-read-skip-empty-flush

Conversation

@Celegans12

@Celegans12 Celegans12 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

What

Since #6914, StorageTexture::FlushPending asks DrawPipeline::HeldReads first on every call. That takes the draw pipeline's mutex and walks the read ranges of every queued draw. Most flushes come from sampled-texture lookups and storage refreshes over memory with no pending results, and those return false without storing or publishing anything, held or not. In a Yōtei profile on our tree the check cost the draw commit thread about 3.3 s per 120 s, 2.1 s of it in the winpthreads mutex.

  • FlushPending now returns false before the check when nothing would be stored: no pending image with a unit in the range, none being flushed, and no unit shadow over it when the scope publishes. That's the same answer the old path gives in that case.
  • A flush with something to store still asks HeldReads first, so fix(agc): order deferred write-backs after queued draws' index reads #6914's ordering is unchanged.
  • DrawPipeline::HeldReadQueries returns the existing query counter, for the test.
  • The [storage] line's "held for a queued draw read" and "pretest skipped" counts no longer include flushes that had nothing to store.

Overlaps: #6615 renames refreshing to Refreshing::Get(), which the new check reads too, so whichever lands second needs that one-word change. #6682 changes FlushPending's signature right next to these lines (textual only).

Tested

  • Windows 11 Pro, MinGW-w64 GCC 15.2.0, -DBUILD_TESTING=ON, RTX 3080 Laptop, based on main 7ab4b2e: ctest 1824/1828. The 4 failures (log_macros, log_macros_timestamps, guest_kqueue, and agc_driver_image_array_window_past_layer_limit, which doesn't compile with MinGW here) fail on main too.
  • agc_driver_queued_index_read_order now also flushes a range with no pending results while an image is pending elsewhere, and checks that HeldReads wasn't asked. With main's Texture.cpp it fails: "a flush with nothing to store asked the draw pipeline for held reads".
  • Linux (WSL, GCC 13.3, lavapipe), CI's job on the merge with main: 1760/1780; the same 20 fail on main (WSL has no userfaultfd write watching).
  • Speed, not isolated for this PR: the only number I have comes from our own Ghost of Yōtei (PPSA26344) tree, not main, with perf(agc): skip the queued-draw read check when a storage flush stores nothing #8911, perf(agc): give small device-local buffers a pool tier of their own #8912 and perf(agc): prefer a pooled buffer of the requested exact size #8913 switched on and off together in one in-run open-world A/B (9+9 phases): 6.17 vs 5.16 presents per 10 s (paired -0.95 +- 0.20 SE) for the combined set. This PR's own counter in that run: 948k flushes skipped the check in the on phases (a counter in our tree, not in this diff).
  • main vs this change, measured by @Dextroid17 (thanks), in this comment: Ghost of Yōtei title menu and loading, RTX 3080 Ti, Linux, APS5_TRACE_SECONDS=20:30, cleared shader cache, main/change interleaved three times each. Frame p50 160.1 vs 158.9 ms (mean of 3), GPU busy 75.4 vs 73.9 ms per present: within the run-to-run spread, so no speedup on that scene. The traces and trace_digest.py output are attached there. The two summary lines below are his median main run and the closest change run. I only fixed the title field, which the summary writer had double-encoded.
aps5-summary.jsonl, main 2b3baac and #8911 bfd4634c88da
{"commit":"2b3baacdba51","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Yōtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":156,"ms":141414.646},"presents":56,"frame_ms":{"p50":159.802,"p90":225.49,"p99":132069.728,"max":132069.728},"gpu_busy_ms_per_present":74.76,"worker_busy_pct":{"queue worker 0x0":6.574,"queue worker 0x52":1.44,"queue worker 0x20":1.539,"queue worker 0x53":1.496,"queue worker 0x48":0.574,"queue worker 0x30":4.501,"queue worker 0x38":5.184},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18054.9,"Driver.Packet":533.912,"Driver.Packet.dispatch":245.568,"Driver.Packet.memory_wait":217.322,"Driver.Dispatch":156.637,"Resources.Complete":60.799,"Vulkan.Dispatch":58.066,"Vulkan.Dispatch.shader_resources":56.567},"trace_dropped":false,"trace":"aps5-trace-2b3baacdba51-155960.json.gz"}
{"commit":"bfd4634c88da","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Yōtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":155,"ms":141141.748},"presents":55,"frame_ms":{"p50":159.861,"p90":221.298,"p99":131927.011,"max":131927.011},"gpu_busy_ms_per_present":72.394,"worker_busy_pct":{"queue worker 0x0":6.425,"queue worker 0x20":1.489,"queue worker 0x52":1.359,"queue worker 0x53":1.527,"queue worker 0x30":4.41,"queue worker 0x38":5.088,"queue worker 0x48":0.454},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18371.997,"Driver.Packet":530.589,"Driver.Packet.dispatch":245.406,"Driver.Packet.memory_wait":211.582,"Driver.Dispatch":158.985,"Resources.Complete":62.124,"Vulkan.Dispatch":57.12,"Vulkan.Dispatch.shader_resources":55.56},"trace_dropped":false,"trace":"aps5-trace-bfd4634c88da-139442.json.gz"}
- Not tested: AMD, Intel, console behaviour.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 3080 Laptop GPU, driver 610.62, Windows 11 Pro; lavapipe (Mesa 25.2.8, WSL Ubuntu 24.04)
  • AI-assisted: yes

…s nothing

StorageTexture::FlushPending asks DrawPipeline::HeldReads first on every
call: it takes the draw pipeline's mutex and walks the read ranges of
every queued draw. Most flushes come from sampled-texture lookups and
storage refreshes over memory without pending results. Those return
false without storing or publishing anything whether a queued draw holds
the range or not, so FlushPending now returns before the check when
nothing would be stored: no pending image with a unit in the range, none
being flushed, and no unit shadow over it when the scope publishes. A
flush that has something to store still asks HeldReads first.
DrawPipeline exposes its held-read query count for the test.

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.

@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 empty-flush fast path looks consistent with the existing pending-list and shadow-publication paths on inspection. One merge-readiness gap: the description reports a measured speedup, but CONTRIBUTING.md requires the aps5-summary.jsonl lines from main and this commit for the same title/scene/machine, plus both traces and tools/trace_digest.py output. The perf label bot has also requested those artifacts. Could you attach them (or remove the quantified speed claim if it cannot be reproduced)?

@github-actions

github-actions Bot commented Oct 21, 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 1368 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 1395 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 1896 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
PR 4448 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6187 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6188 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 6192 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6202 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6209 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6280 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6481 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6539 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6960 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6971 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6973 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6987 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6989 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6995 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7002 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7048 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7514 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7604 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7642 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 8246 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 8484 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 8998 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9400 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9431 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9432 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9672 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9673 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9674 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9675 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9676 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9842 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9891 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9892 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9893 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9895 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9898 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Draw/DrawPipeline.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Draw/DrawPipeline.cpp
PR 10064 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10159 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10249 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10435 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp

@Celegans12

Copy link
Copy Markdown
Contributor Author

@MarcZX10 thanks for checking the fast path against the pending-list and shadow-publication paths, that's the part I was most worried about.

You're right about the number. The only measurement I have is from our own Yōtei tree, not main, and in it I switched this PR and #8912/#8913 on and off together, so it says nothing about this change alone. I've rewritten the speed line to say exactly that. The one figure that is specific to this PR is the count of flushes that skipped the check. I can't make a matched main/change capture right now, so the summary lines, traces and trace_digest.py output are still owed. I'll add them here when I have them, but I can't give a date.

@github-actions github-actions Bot added the agc libSceAgc* label Oct 21, 2026
@EdouardSence

Copy link
Copy Markdown
Contributor

AMD / Linux data point for #8911, #8912 and #8913 together, on a different title. The result is neutral: no measurable change and no regression.

Setup: ASTRO BOT (PPSA21567) 01.019.000, level underwater_aerial_garden (-lvl argument), Linux 7.2.10 (CachyOS), RX 9070 XT, Mesa 26.2.4 RADV, Ryzen 7 7800X3D, 32 GB, GCC Release. The game renders at 3840x2160. Headless gamescope, APS5_TRACE_SECONDS=90:50, 180 s per run, one untimed warm-up run per build.

Runs were interleaved: base, change, change, base.

run presents p50 p90 p99 GPU busy/present
base-1 189 266.8 280.1 297.7 135.1
change-1 188 262.2 279.5 344.8 134.2
change-2 187 267.1 281.2 378.7 134.9
base-2 180 276.5 297.5 327.8 132.9

The p50 difference (~2-3 %) is smaller than the spread between the two base runs. The change-1 p99 includes the first present of the window (753.8 ms), which is a load spike.

From trace_digest.py, the draw committer is not the bottleneck on this title. It is busy 30.5 ms per frame on base and 33.9 on change. queue worker 0x0 is at 99 % in both, dominated by Driver.Draw.shader_compile_and_link (140.6 vs 143.2 ms per frame). That explains why the set has no effect here. #8913's rebind path is described as coming from #6763's NVIDIA draw-input copies, so it is probably not reached on RADV at all.

Both builds ran 3 × 180 s with no device lost, no amdgpu kernel messages and no new exceptions.

Not tested: the PRs one at a time, NVIDIA/Intel, CTest.


Tested and written by Claude (AI assistant) on a contributor's machine.
AI-assisted: yes

@JJenkx

JJenkx commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Windows measurement of this change, for reference. Setup: AMD Radeon RX 6700 XT, AMD driver 26.10.1, Windows 11. Spirit of the Island (PPSA13934) title screen, APS5_TRACE_SUMMARY_EVERY=10, mean p50 of the nine 10 s intervals after loading. The builds are main 0c6a5bd and this PR merged onto it, alternated:

arm round 1 round 2
main 108.5 ms 108.9 ms
this PR 106.4 ms 107.1 ms

On that screen, most of the remaining HeldReads time on Windows was getenv itself. #9490 reads that variable once, and it composes with this PR. Built together, they measured 107.2 and 107.0 ms on the same base. I did not run the test suite on this PR here; these are frame-time runs only.

@Celegans12

Copy link
Copy Markdown
Contributor Author

I measured this one on its own now, as asked on #8912. Plain main can't take Ghost of Yōtei to the open world: its loading screen stops presenting after about 160 s and the game later aborts on a blend into a 10_11_11 unorm target that main doesn't support. So this is our tree (our local merge with main of 2026-10-21) with only this PR's switch flipped every 60 s in one run (APS5_NO_HELD_READ_SKIP), which keeps the scene and session the same for both halves.

With the skip on I got 6.16 presents per 10 s against 5.61 with it off. Paired against the neighbouring phases that's -0.35 +- 0.30 presents with the change off, so about 1 SE: a lean in its favour, not a result I'd call measured. Committer time per commit didn't move (316 vs 310 us). What it clearly does is the thing it says: per phase, about 858k storage flushes skipped the queued-draw check with it on against 44k off, and the flushes that held for a queued read dropped from about 104k to 5k.

I also tried a boot-scene pair on plain main, but those captures turned out to be pipeline-cold on this machine, so I'm not quoting them. If you'd rather see a longer A/B to tighten the error bar, I can run one.

Details

Run pb-8911, our local merge with main 557682c, warm caches (NVIDIA pipeline cache readable, dictionary checked before the run), web-teshio-b save, 1,300 s cap, APS5_AB=60:APS5_NO_HELD_READ_SKIP from present 760, RTX 3080 Laptop (610.62), Windows 11. B = the switch set, i.e. this PR's change off.

phases (presents: begin / settled / end; clean reports present/gputime/draw/syncwait):
  A  0     760 /    769 /    822  3/0/5/4     8.89 presents/10 s
  B  1     822 /    823 /    851  5/0/5/5     4.78 presents/10 s
  A  2     851 /    853 /    880  4/0/5/5     4.70 presents/10 s
  B  3     880 /    881 /    908  5/0/5/5     4.60 presents/10 s
  A  4     908 /    910 /    943  4/0/5/5     5.80 presents/10 s
  B  5     943 /    945 /    977  4/0/5/4     5.56 presents/10 s
  A  6     977 /    979 /   1011  4/0/5/4     5.65 presents/10 s
  B  7    1011 /   1013 /   1046  4/0/5/4     5.70 presents/10 s
  A  8    1046 /   1048 /   1084  4/0/4/4     6.19 presents/10 s
  B  9    1084 /   1086 /   1120  4/0/4/4     6.01 presents/10 s
  A 10    1120 /   1122 /   1153  4/0/4/4     5.46 presents/10 s
  B 11    1153 /   1155 /   1191  4/0/5/5     6.30 presents/10 s
  A 12    1191 /   1193 /   1229  4/0/5/5     6.31 presents/10 s
  B 13    1229 /   1231 /   1267  4/0/4/5     6.28 presents/10 s
  A 14    1267 /   1269 /   1305  4/0/4/5     6.30 presents/10 s
  B 15    1305 /   1307 /      -  0/0/0/0     unfinished

per phase mean                          A          B        B-A    B/A-1   noise: B vs neighbouring A, mean diff +- SE (SD, n)
presents/10s                         6.16       5.61      -0.56    -9.0%   -0.35 +- 0.30 (SD 0.81, n 7)
frame ms                          1670.81    1808.52    +137.71    +8.2%   +92.75 +- 76.03 (SD 201.17, n 7)
GPU busy ms/frame                  736.69     726.56     -10.13    -1.4%   -8.29 +- 15.52 (SD 41.07, n 7)
GPU idle gaps ms/frame            1288.78    1083.46    -205.31   -15.9%   -110.86 +- 132.75 (SD 351.22, n 7)
committer us/commit                316.35     310.18      -6.16    -1.9%   -4.16 +- 15.49 (SD 40.99, n 7)
committer % busy                    62.13      66.69      +4.56    +7.3%   +2.87 +- 2.04 (SD 5.41, n 7)
room wait us/draw                  111.63     111.59      -0.04    -0.0%   -2.27 +- 8.16 (SD 21.58, n 7)
drain ms/10s                      1787.84    1708.80     -79.05    -4.4%   -156.22 +- 181.07 (SD 479.06, n 7)
syncwait GPU ms/10s                868.56     900.03     +31.47    +3.6%   +1.09 +- 33.05 (SD 87.45, n 7)
A total (8 phases): alloc 3.6 us/upload, lookup 14.9 us/upload; per phase: small misses 0, small-device hits/misses 88651/209, device misses 198, exact-size hits 393980, rebound 357960, held-read checks skipped 858403, held 5019
B total (7 phases): alloc 3.5 us/upload, lookup 15.2 us/upload; per phase: small misses 0, small-device hits/misses 97582/20, device misses 15, exact-size hits 441810, rebound 404208, held-read checks skipped 44009, held 104488

@SoRadGaming

Copy link
Copy Markdown
Contributor

A measurement that bears on how this change and #9490 split the held-read cost, from ASTRO BOT (PPSA21564) in the Crash Site hub. Setup: Windows 11, Ryzen 7 5800X3D, RX 9070 XT, main 4777cac plus local experiments.

With main's HeldReads, a steady-state APS5_SAMPLE_COMMITTER window put 16.3 % of the draw committer's samples in HeldReads. Of that:

So in this game nearly all of the cost is the getenv. With #9490's change alone (same build, only libSceAgcDriver.prx swapped, 3 interleaved rounds), hub hold went from 10.50 to 11.68 FPS, and the committer from 25.5 to 21.9 µs per commit (details on #9490).

I haven't measured this PR's skip on top of that. From the split above, its saving here would be at most the remaining ~1.5 % of committer samples. That still adds up across the ~370k commits per 10 s, but it is smaller than in your Yōtei profile, where the mutex dominated.

@Celegans12

Copy link
Copy Markdown
Contributor Author

Thanks for splitting the HeldReads cost on ASTRO BOT. That's useful. It's good to see how differently it divides there: nearly all of it is the per-call getenv that #9490 removes, while in our Yōtei profile the pipeline mutex was the bigger part. The two changes compose, since #9490 takes the getenv out of every call and this PR skips the check entirely when a storage flush stores nothing. So the right next number is #8911 measured on top of #9490, and I'll aim for that pairing when I get to the per-PR runs.

@oneandonlydean oneandonlydean self-assigned this Oct 22, 2026
@Dextroid17

Copy link
Copy Markdown
Contributor

Linux data point, since the body's only Linux run is WSL and the thread so far has no native lavapipe result (EdouardSence's Linux run is RADV frame times, no ctest): llvmpipe (LLVM 23.1.1, 256 bits) via lavapipe, Mesa 26.2.4, GALLIUM_OVERRIDE_CPU_CAPS=avx, i9-11900K, CachyOS, GCC 16.2.1, CMake 4.4.3, Release, ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1; 68f51b5a0 merged with main f57ceaad6 (your base is 1408 commits behind it; local merge 91b0e46b8, clean).

Head. agc_driver_queued_index_read_order passes 3 of 3 runs; the test opens a real lavapipe device (OpenVulkanTestDevice with ANYPS5_REQUIRE_VULKAN=1, so a skip would have failed instead).

Negative control. The same merge with core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp taken back from f57ceaad6 (your DrawPipeline.hpp/DrawPipeline.cpp accessor and the test kept, so it compiles), rebuilt: fails 3 of 3 with queued index read: a flush with nothing to store asked the draw pipeline for held reads, the line your body names. The three Requires before it (AnyPending, IndicesIntact, FlushPending over the pending-free range returning false) pass on both arms, so the first check the control trips is the HeldReadQueries count; the IndicesIntact check after it never ran on that arm.

On the two overlaps the body names: git merge-tree --write-tree of 68f51b5a0 with #6615 (refreshing → Refreshing::Get()) and with #6682 is clean on both, textually, so the one-word change only shows up as a compile error for whichever lands second; I did not build that pair on current main because #6615 itself conflicts with it (GuestMemory.cpp, Draw.cpp).

AI-assisted: yes

@Dextroid17

Copy link
Copy Markdown
Contributor

Comment for #8911 (perf(agc): skip the queued-draw read check when a storage flush stores nothing)

Following up on the artifact request. Here are captures for the main-vs-#8911 comparison, with their limits.

What was measured

Results (median frame time p50, ms; GPU busy per present, ms)

What this does and does not show

  • At n=3 per side, these runs do not separate the two builds on this menu scene.
  • No speedup or regression is claimed.
  • Nothing here speaks to open-world or gameplay behaviour, or to the pool code paths in general.

Observed on both sides (not attributed to #8911)

  • Every run on both sides had a stall frame of about 130 s (max frame 131.9 to 133.8 s). We have not counted how many frames stalled.
  • Shader.PrepareArtifact is the largest phase in top_phases on all six runs (18.1 to 20.9 s per frame, accumulated across threads). We have not tied the stall to any specific phase.

Attached / available

  • The six aps5-summary.jsonl lines, pasted below. Note: the title field is mis-encoded by the summary writer (double-encoded UTF-8, "Ghost of Y\u00c5\u008dtei"). The content is otherwise unchanged.
  • Trace files (.json.gz, about 0.8 to 0.9 MB each): available on request.
  • trace_digest.py and performance_compare.py output: available on request.

Run notes: head-3 was killed by a 22 GB memory cap after its trace was written. The trace is complete (trace_dropped is false). Happy to rerun it if you need a clean set.

Dextroid17

Summary lines (one per run, as written by the tracer):

[base run 1] {"commit":"2b3baacdba51","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":160,"ms":142332.210},"presents":49,"frame_ms":{"p50":161.064,"p90":251.346,"p99":133830.799,"max":133830.799},"gpu_busy_ms_per_present":75.774,"worker_busy_pct":{"queue worker 0x0":5.965,"queue worker 0x20":1.431,"queue worker 0x52":1.322,"queue worker 0x53":1.432,"queue worker 0x38":4.637,"queue worker 0x48":0.432,"queue worker 0x30":4.029},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":20897.939,"Driver.Packet":555.093,"Driver.Packet.dispatch":256.509,"Driver.Packet.memory_wait":222.810,"Driver.Dispatch":161.938,"Resources.Complete":62.730,"Vulkan.Dispatch":58.393,"Vulkan.Dispatch.shader_resources":56.947},"trace_dropped":false,"trace":"aps5-trace-2b3baacdba51-133811.json.gz"}
[base run 2] {"commit":"2b3baacdba51","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":156,"ms":141147.505},"presents":55,"frame_ms":{"p50":159.433,"p90":211.235,"p99":132053.831,"max":132053.831},"gpu_busy_ms_per_present":75.609,"worker_busy_pct":{"queue worker 0x0":6.361,"queue worker 0x52":1.353,"queue worker 0x20":1.460,"queue worker 0x53":1.509,"queue worker 0x30":4.378,"queue worker 0x38":5.074,"queue worker 0x48":0.428},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18399.434,"Driver.Packet":521.997,"Driver.Packet.dispatch":238.975,"Driver.Packet.memory_wait":212.122,"Driver.Dispatch":150.784,"Resources.Complete":59.816,"Vulkan.Dispatch":55.838,"Vulkan.Dispatch.shader_resources":54.455},"trace_dropped":false,"trace":"aps5-trace-2b3baacdba51-144986.json.gz"}
[base run 3] {"commit":"2b3baacdba51","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":156,"ms":141414.646},"presents":56,"frame_ms":{"p50":159.802,"p90":225.490,"p99":132069.728,"max":132069.728},"gpu_busy_ms_per_present":74.760,"worker_busy_pct":{"queue worker 0x0":6.574,"queue worker 0x52":1.440,"queue worker 0x20":1.539,"queue worker 0x53":1.496,"queue worker 0x48":0.574,"queue worker 0x30":4.501,"queue worker 0x38":5.184},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18054.900,"Driver.Packet":533.912,"Driver.Packet.dispatch":245.568,"Driver.Packet.memory_wait":217.322,"Driver.Dispatch":156.637,"Resources.Complete":60.799,"Vulkan.Dispatch":58.066,"Vulkan.Dispatch.shader_resources":56.567},"trace_dropped":false,"trace":"aps5-trace-2b3baacdba51-155960.json.gz"}
[head run 1] {"commit":"bfd4634c88da","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":155,"ms":141141.748},"presents":55,"frame_ms":{"p50":159.861,"p90":221.298,"p99":131927.011,"max":131927.011},"gpu_busy_ms_per_present":72.394,"worker_busy_pct":{"queue worker 0x0":6.425,"queue worker 0x20":1.489,"queue worker 0x52":1.359,"queue worker 0x53":1.527,"queue worker 0x30":4.410,"queue worker 0x38":5.088,"queue worker 0x48":0.454},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18371.997,"Driver.Packet":530.589,"Driver.Packet.dispatch":245.406,"Driver.Packet.memory_wait":211.582,"Driver.Dispatch":158.985,"Resources.Complete":62.124,"Vulkan.Dispatch":57.120,"Vulkan.Dispatch.shader_resources":55.560},"trace_dropped":false,"trace":"aps5-trace-bfd4634c88da-139442.json.gz"}
[head run 2] {"commit":"bfd4634c88da","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":158,"ms":141290.369},"presents":55,"frame_ms":{"p50":157.445,"p90":211.621,"p99":132192.398,"max":132192.398},"gpu_busy_ms_per_present":74.810,"worker_busy_pct":{"queue worker 0x0":6.466,"queue worker 0x20":1.458,"queue worker 0x53":1.543,"queue worker 0x52":1.335,"queue worker 0x30":4.270,"queue worker 0x38":5.055,"queue worker 0x48":0.536},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18396.679,"Driver.Packet":527.011,"Driver.Packet.dispatch":246.252,"Driver.Packet.memory_wait":209.927,"Driver.Dispatch":154.243,"Resources.Complete":60.307,"Vulkan.Dispatch":57.341,"Vulkan.Dispatch.shader_resources":56.047},"trace_dropped":false,"trace":"aps5-trace-bfd4634c88da-150596.json.gz"}
[head run 3] {"commit":"bfd4634c88da","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":155,"ms":142894.166},"presents":56,"frame_ms":{"p50":159.469,"p90":230.778,"p99":133582.463,"max":133582.463},"gpu_busy_ms_per_present":74.423,"worker_busy_pct":{"queue worker 0x0":6.384,"queue worker 0x52":1.332,"queue worker 0x20":1.477,"queue worker 0x53":1.493,"queue worker 0x38":5.056,"queue worker 0x48":0.543,"queue worker 0x30":4.326},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18268.392,"Driver.Packet":523.636,"Driver.Packet.dispatch":237.818,"Driver.Packet.memory_wait":212.285,"Driver.Dispatch":151.808,"Resources.Complete":60.485,"Vulkan.Dispatch":56.132,"Vulkan.Dispatch.shader_resources":54.785},"trace_dropped":false,"trace":"aps5-trace-bfd4634c88da-161378.json.gz"}

@Celegans12

Copy link
Copy Markdown
Contributor Author

@Dextroid17 thanks for running this, and for interleaving the runs and clearing the shader cache each time. That's exactly the main-vs-change comparison I couldn't make here. I read it the same way you do: on the title menu the two builds don't separate (p50 -1.2 ms against a 1.6-2.4 ms spread, GPU per present -1.5 ms, mostly from one run), so no claim either way.

That's about what I'd expect from that scene. The check this PR skips only costs something when a storage flush stores nothing while queued draws are pending, and that mostly happens in the open world, where we saw it on our own tree. The ~130 s stall on both sides lines up with the cold shader cache: Shader.PrepareArtifact is the top phase in all six runs, so I don't think it's related to either build.

If it's not too much trouble, could you attach two of the traces (one per side) and the trace_digest.py output? The perf rule wants them on the PR, and I'd like to link your set from the Tested section as the main comparison next to the world numbers from our tree.

@Dextroid17

Copy link
Copy Markdown
Contributor

@Celegans12 Here they are: one trace per side from the six interleaved runs above, with the tools/trace_digest.py output for each.

I picked the median main run and the #8911 run closest to it on p50. That #8911 run also has the lowest GPU busy of all six (72.4 ms per present against 74.4–75.8 for the rest), so it is the run behind most of the 1.5 ms GPU gap in my earlier comment; please don't read that gap in these two traces as an effect of the PR. The #8911 median on both p50 and GPU busy is run 3 (159.5 ms, 74.4 ms per present). Its trace is complete, but the 22 GB memory cap killed that run after the trace was written. I can attach it as well if you want it. Same scene and limits as before: title menu and loading, APS5_TRACE_SECONDS=20:30, shader cache cleared before each run, so the ~132 s cold-cache stall closes both windows, and p99 and max are that one frame (details on #6867). Fine to link them from the Tested section as the main comparison; note that main here is 2b3baac, 394 commits behind current main. The other four traces are available if you want the full set.

Side by side (main / #8911): p50 159.8 / 159.9 ms, p90 225.5 / 221.3 ms, GPU busy 74.8 / 72.4 ms per present, 56 / 55 presents.

trace_digest.py, main (2b3baac, run 3)

seconds 20:30 from present 156: 56 presents, frame p50 159.8 / p90 225.5 / p99 132069.7 / max 132069.7 ms, GPU busy 74.8 ms per present
NVIDIA GeForce RTX 3080 Ti, NVIDIA 615.78.08, Linux 7.3.0-2-cachyos, 3840x2160, commit 2b3baac, dropped: no

{"commit":"2b3baacdba51","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":156,"ms":141414.646},"presents":56,"frame_ms":{"p50":159.802,"p90":225.49,"p99":132069.728,"max":132069.728},"gpu_busy_ms_per_present":74.76,"worker_busy_pct":{"queue worker 0x0":6.574,"queue worker 0x52":1.44,"queue worker 0x20":1.539,"queue worker 0x53":1.496,"queue worker 0x48":0.574,"queue worker 0x30":4.501,"queue worker 0x38":5.184},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18054.9,"Driver.Packet":533.912,"Driver.Packet.dispatch":245.568,"Driver.Packet.memory_wait":217.322,"Driver.Dispatch":156.637,"Resources.Complete":60.799,"Vulkan.Dispatch":58.066,"Vulkan.Dispatch.shader_resources":56.567},"trace_dropped":false,"trace":"aps5-trace-2b3baacdba51-155960.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 211: 132069.7 ms at 9345 ms: Shader.PrepareArtifact (shader prepare) 1009212.6, Driver.WorkerWait (queue worker 0x38) 131599.7, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x38) 131599.7, Driver.WorkerWait (queue worker 0x30) 131599.6
  • present 206: 423.9 ms at 8109 ms: Driver.WorkerWait (queue worker 0x20) 413.3, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x20) 413.3, Driver.Packet (queue worker 0x0) 411.7, Driver.WorkerWait (queue worker 0x48) 378.5
  • present 161: 302.7 ms at 612 ms: Driver.WorkerWait (queue worker 0x48) 301.3, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 301.3, Driver.Packet (queue worker 0x0) 291.8, Driver.Packet.dispatch (queue worker 0x0) 262.1
  • present 210: 248.3 ms at 9097 ms: Shader.PrepareArtifact (shader prepare) 1859.6, Driver.WorkerWait (queue worker 0x20) 248.3, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x20) 248.3, Driver.Packet (queue worker 0x0) 238.3
  • present 207: 237.4 ms at 8533 ms: Driver.WorkerWait (queue worker 0x48) 228.6, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 228.6, Driver.Packet (queue worker 0x0) 228.0, Driver.Packet (queue worker 0x38) 190.0

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
title 19.9 (1 %) 18.8 (1 %) 2486.6 0.2 Shader.Register 19.6, Recorder.Sync 0.2
shader prepare 2258.5 (89 %) 0.0 (0 %) 266.8 0.0 Shader.PrepareArtifact 2258.5
shader prepare 2253.5 (89 %) 0.0 (0 %) 271.8 0.0 Shader.PrepareArtifact 2253.5
shader prepare 2253.6 (89 %) 0.0 (0 %) 271.7 0.0 Shader.PrepareArtifact 2253.6
shader prepare 2258.5 (89 %) 0.0 (0 %) 266.8 0.0 Shader.PrepareArtifact 2258.5
shader prepare 2259.0 (89 %) 0.0 (0 %) 266.3 0.0 Shader.PrepareArtifact 2259.0
shader prepare 2258.1 (89 %) 0.0 (0 %) 267.1 0.0 Shader.PrepareArtifact 2258.1
shader prepare 2259.4 (89 %) 0.0 (0 %) 265.9 0.0 Shader.PrepareArtifact 2259.4
shader prepare 2254.2 (89 %) 0.0 (0 %) 271.0 0.0 Shader.PrepareArtifact 2254.2
queue worker 0x0 138.2 (5 %) 2385.3 (94 %) 1.7 5.1 Driver.Packet 164.6, Driver.Completion 0.1
shader prepare 1.2 (0 %) 0.0 (0 %) 2524.1 0.0 Vulkan.GraphicsPipelinePrebuild 1.2
queue worker 0x52 4.0 (0 %) 130.3 (5 %) 2391.0 0.8 Driver.Packet 35.0, Driver.EndSubmission 1.2
queue worker 0x20 1.3 (0 %) 2515.2 (100 %) 8.7 0.1 Driver.Packet 37.9, Driver.EndSubmission 0.9
queue worker 0x53 0.6 (0 %) 133.9 (5 %) 2390.8 0.2 Driver.Packet 37.7, Driver.EndSubmission 0.1
title 0.0 (0 %) 0.0 (0 %) 2525.3 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.3 0.0 Shader.ResolveAbi 0.0, Shader.ResolveGraphicsStagesAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.3 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
queue worker 0x48 4.0 (0 %) 2512.8 (100 %) 8.5 0.3 Driver.Packet 13.8, Driver.EndSubmission 0.7
queue worker 0x30 24.5 (1 %) 2497.4 (99 %) 3.4 0.7 Driver.Packet 112.7, Driver.EndSubmission 0.8
queue worker 0x38 19.1 (1 %) 2503.6 (99 %) 2.6 0.8 Driver.Packet 130.5, Driver.EndSubmission 0.3
draw committer 43.9 (2 %) 15.9 (1 %) 2465.5 0.3 Vulkan.DrawFromRecipe 20.7, Graphics.Draw 15.6
presenter 9.6 (0 %) 0.0 (0 %) 2515.6 0.1 VideoOut.Flip 9.4, Driver.Present 0.2
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveGraphicsAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveAbi 0.0, Shader.ResolveGraphicsStagesAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.1 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.1, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2525.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
gpu 81.2 (3 %) 0.0 (0 %) 2444.1 0.0 batch 81.2

Largest slices (ms per frame, inclusive, all threads): Shader.PrepareArtifact 18054.9, Driver.WorkerWait 12333.9, Driver.WorkerWait.idle_and_completion_poll 12333.8, Driver.Packet 532.1, Driver.Packet.dispatch 245.1, Driver.Packet.memory_wait 217.3, Driver.Dispatch 155.9, batch 81.2, Resources.Complete 60.7, Vulkan.Dispatch 58.0

Longest waits

  • Driver.WorkerWait (queue worker 0x20) 131899.5 ms at 9038 ms, present 209
  • Driver.WorkerWait (queue worker 0x48) 131804.4 ms at 9140 ms, present 210
  • Driver.WorkerWait (queue worker 0x30) 131649.0 ms at 9296 ms, present 210
  • Driver.WorkerWait (queue worker 0x38) 131645.0 ms at 9300 ms, present 210
  • Driver.WorkerWait (queue worker 0x0) 131599.4 ms at 9345 ms, present 211
  • Driver.WorkerWait (queue worker 0x20) 494.5 ms at 8027 ms, present 205
  • Driver.WorkerWait (queue worker 0x48) 376.2 ms at 8164 ms, present 206
  • Driver.WorkerWait (queue worker 0x48) 300.6 ms at 623 ms, present 161
  • Driver.Packet.memory_wait (queue worker 0x30) 265.0 ms at 140969 ms, present 211
  • Driver.WorkerWait (queue worker 0x20) 249.8 ms at 675 ms, present 161

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

  • batch 1862: 157.9 ms at 9465 ms, present 211: GPU no ranges; recorded by Driver.WorkerWait (queue worker 0x0) 131599.6, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x0) 131599.5, Recorder.Sync (queue worker 0x0) 158.2, Driver.Packet (queue worker 0x0) 15.3
  • batch 359: 71.7 ms at 1837 ms, present 166: GPU no ranges; recorded by no CPU slices
  • batch 395: 71.3 ms at 2026 ms, present 167: GPU no ranges; recorded by no CPU slices
  • batch 237: 70.2 ms at 1262 ms, present 163: GPU no ranges; recorded by no CPU slices
  • batch 319: 69.4 ms at 1644 ms, present 165: GPU no ranges; recorded by no CPU slices
trace_digest.py, #8911 (bfd4634c88da, run 1)

seconds 20:30 from present 155: 55 presents, frame p50 159.9 / p90 221.3 / p99 131927.0 / max 131927.0 ms, GPU busy 72.4 ms per present
NVIDIA GeForce RTX 3080 Ti, NVIDIA 615.78.08, Linux 7.3.0-2-cachyos, 3840x2160, commit bfd4634c88da, dropped: no

{"commit":"bfd4634c88da","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"20:30"},"gpu":"NVIDIA GeForce RTX 3080 Ti","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-2-cachyos","cpu":"11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz","cpu_threads":16,"memory_mib":31912,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"seconds 20:30","first_present":155,"ms":141141.748},"presents":55,"frame_ms":{"p50":159.861,"p90":221.298,"p99":131927.011,"max":131927.011},"gpu_busy_ms_per_present":72.394,"worker_busy_pct":{"queue worker 0x0":6.425,"queue worker 0x20":1.489,"queue worker 0x52":1.359,"queue worker 0x53":1.527,"queue worker 0x30":4.41,"queue worker 0x38":5.088,"queue worker 0x48":0.454},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":18371.997,"Driver.Packet":530.589,"Driver.Packet.dispatch":245.406,"Driver.Packet.memory_wait":211.582,"Driver.Dispatch":158.985,"Resources.Complete":62.124,"Vulkan.Dispatch":57.12,"Vulkan.Dispatch.shader_resources":55.56},"trace_dropped":false,"trace":"aps5-trace-bfd4634c88da-139442.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 209: 131927.0 ms at 9215 ms: Shader.PrepareArtifact (shader prepare) 1008441.2, Driver.WorkerWait (queue worker 0x48) 131564.6, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 131564.6, Driver.WorkerWait (queue worker 0x38) 131564.6
  • present 204: 418.0 ms at 7973 ms: Driver.WorkerWait (queue worker 0x20) 418.0, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x20) 418.0, Driver.WorkerWait (queue worker 0x48) 414.5, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 414.5
  • present 160: 315.9 ms at 607 ms: Driver.WorkerWait (queue worker 0x48) 313.7, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 313.7, Driver.Packet (queue worker 0x0) 304.0, Driver.Packet.dispatch (queue worker 0x0) 289.0
  • present 208: 271.2 ms at 8944 ms: Shader.PrepareArtifact (shader prepare) 2012.0, Driver.WorkerWait (queue worker 0x20) 271.2, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x20) 271.2, Driver.Packet (queue worker 0x0) 259.5
  • present 205: 224.0 ms at 8391 ms: Driver.WorkerWait (queue worker 0x48) 218.1, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x48) 218.1, Driver.Packet (queue worker 0x0) 214.5, Driver.Packet.dispatch (queue worker 0x0) 196.5

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
title 22.0 (1 %) 20.1 (1 %) 2524.1 0.2 Shader.Register 21.8, Shader.ResolveGraphicsStagesAbi 0.1
shader prepare 2296.0 (89 %) 0.0 (0 %) 270.2 0.0 Shader.PrepareArtifact 2296.0
shader prepare 2297.0 (90 %) 0.0 (0 %) 269.2 0.0 Shader.PrepareArtifact 2297.0
shader prepare 2296.2 (89 %) 0.0 (0 %) 270.0 0.0 Shader.PrepareArtifact 2296.2
shader prepare 2297.8 (90 %) 0.0 (0 %) 268.4 0.0 Shader.PrepareArtifact 2297.8
shader prepare 2297.5 (90 %) 0.0 (0 %) 268.7 0.0 Shader.PrepareArtifact 2297.5
shader prepare 2294.2 (89 %) 0.0 (0 %) 272.0 0.0 Shader.PrepareArtifact 2294.2
shader prepare 2294.3 (89 %) 0.0 (0 %) 272.0 0.0 Shader.PrepareArtifact 2294.3
shader prepare 2299.2 (90 %) 0.0 (0 %) 267.1 0.0 Shader.PrepareArtifact 2299.2
queue worker 0x0 136.0 (5 %) 2428.5 (95 %) 1.7 5.1 Driver.Packet 163.5, Driver.Completion 0.1
shader prepare 1.1 (0 %) 0.0 (0 %) 2565.1 0.0 Vulkan.GraphicsPipelinePrebuild 1.1
queue worker 0x20 0.5 (0 %) 2558.9 (100 %) 6.8 0.1 Driver.Packet 37.9, Driver.EndSubmission 0.3
queue worker 0x52 3.4 (0 %) 131.1 (5 %) 2431.7 0.8 Driver.Packet 34.3, Driver.EndSubmission 0.4
queue worker 0x53 0.8 (0 %) 134.3 (5 %) 2431.1 0.2 Driver.Packet 39.1, Driver.EndSubmission 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
queue worker 0x30 22.1 (1 %) 2542.6 (99 %) 1.5 0.7 Driver.Packet 113.0, Driver.EndSubmission 0.0
queue worker 0x38 20.9 (1 %) 2544.0 (99 %) 1.4 0.8 Driver.Packet 130.2, Driver.EndSubmission 0.2
queue worker 0x48 3.2 (0 %) 2556.5 (100 %) 6.5 0.3 Driver.Packet 10.7, Driver.EndSubmission 0.8
draw committer 41.1 (2 %) 16.2 (1 %) 2508.9 0.3 Vulkan.DrawFromRecipe 19.3, Graphics.Draw 17.3
presenter 9.4 (0 %) 0.0 (0 %) 2556.8 0.1 VideoOut.Flip 9.3, Driver.Present 0.2
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveGraphicsAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0
title 0.0 (0 %) 0.0 (0 %) 2566.2 0.0 Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveGraphicsAbi 0.0
gpu 79.6 (3 %) 0.0 (0 %) 2486.6 0.0 batch 79.6

Largest slices (ms per frame, inclusive, all threads): Shader.PrepareArtifact 18372.0, Driver.WorkerWait 12552.1, Driver.WorkerWait.idle_and_completion_poll 12552.1, Driver.Packet 528.8, Driver.Packet.dispatch 245.0, Driver.Packet.memory_wait 211.6, Driver.Dispatch 158.3, batch 79.6, Resources.Complete 62.0, Vulkan.Dispatch 57.1

Longest waits

  • Driver.WorkerWait (queue worker 0x20) 131887.5 ms at 8890 ms, present 207
  • Driver.WorkerWait (queue worker 0x48) 131788.0 ms at 8991 ms, present 208
  • Driver.WorkerWait (queue worker 0x30) 131627.9 ms at 9151 ms, present 208
  • Driver.WorkerWait (queue worker 0x38) 131609.9 ms at 9169 ms, present 208
  • Driver.WorkerWait (queue worker 0x0) 131560.6 ms at 9219 ms, present 209
  • Driver.WorkerWait (queue worker 0x20) 501.8 ms at 7895 ms, present 203
  • Driver.WorkerWait (queue worker 0x48) 412.4 ms at 7986 ms, present 204
  • Driver.WorkerWait (queue worker 0x48) 313.1 ms at 619 ms, present 160
  • Driver.Packet.memory_wait (queue worker 0x30) 262.7 ms at 140813 ms, present 209
  • Driver.WorkerWait (queue worker 0x20) 262.1 ms at 671 ms, present 160

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

  • batch 1821: 157.9 ms at 9323 ms, present 209: GPU no ranges; recorded by Driver.WorkerWait (queue worker 0x0) 131560.8, Driver.WorkerWait.idle_and_completion_poll (queue worker 0x0) 131560.8, Recorder.Sync (queue worker 0x0) 158.2, Driver.Dispatch.decode_key_device_setup (queue worker 0x0) 75.2
  • batch 314: 70.6 ms at 1642 ms, present 164: GPU no ranges; recorded by no CPU slices
  • batch 240: 69.8 ms at 1257 ms, present 162: GPU no ranges; recorded by no CPU slices
  • batch 351: 69.7 ms at 1837 ms, present 165: GPU no ranges; recorded by no CPU slices
  • batch 281: 69.3 ms at 1451 ms, present 163: GPU no ranges; recorded by no CPU slices

AI-assisted: yes (Claude Code).

@Celegans12

Copy link
Copy Markdown
Contributor Author

@Dextroid17 thanks, that's exactly the main comparison the label asks for. I've linked your comment from Tested and put your median main run and the closest #8911 run there as the two summary lines. Their title field had the double-encoded "Yōtei", which keeps them from parsing, so I fixed only that field. I read your numbers the way you do: on the title menu the two builds don't separate (p50 160.1 vs 158.9 ms, inside the spread), and the open-world effect is the only place this change shows up in our own runs.

@github-actions github-actions Bot removed the perf numbers missing perf pull request without a before and after summary line label Oct 24, 2026
Celegans12 added a commit to Celegans12/AnyPS5-Ghost-of-Yotei that referenced this pull request Oct 24, 2026
@Celegans12

Copy link
Copy Markdown
Contributor Author

I've finished the second round of world captures I mentioned, this time with 60-present windows (the first round's 16-present windows were too noisy to use). All ten are warm runs of PPSA26344 v1.008 on our own tree (085bd8f, which carries all six of these changes; not main), back to back in one session on the same laptop (RTX 3080 Laptop, driver 610.62, Windows 11), from the same open-world save with the same pad script. Each capture is APS5_TRACE_FRAMES=880:60, about 90 s in the world once the scene settles. The A runs are the tree as it is; each B run adds one off switch. One caveat on the protocol: our run script also sets APS5_PROFILE_DRAW=1 on every run, A and B alike. Run order: pe2-a1, pe2-b9287, pe2-b9289, pe2-a2, pe2-b8911, pe2-b8912k, pe2-a3k, pe2-b8913k, pe2-b10382k, pe2-a4k. For this PR the B run adds APS5_NO_HELD_READ_SKIP=1. That switch is in our tree only; this PR has no switch of its own, so the A/B here is our tree's version of the change.

With the change switched off, the frame p50 was 1,646 ms against 1,867 and 1,605 ms in the A runs on either side (mean 1,736), and GPU busy was 858 against 955 and 906 ms per present (mean 930). That's within the spread of its two A runs (1,867 and 1,605 ms, 15 % apart), so this world capture doesn't separate the two sides, much like @Dextroid17's title-menu runs on main.

These are all on one tree, so they don't replace a main capture for the perf label. I'm making main-against-main+this-PR captures on the title menu next and will add those summary lines to the description.

Files are on our media branch (the comment box can't take 35 MB traces):

aps5-summary.jsonl window lines (B, then the two A runs)
{"commit":"085bd8f20325","dirty":false,"env":{"APS5_ASYNC_LANE":"51","APS5_BINDLESS_IMAGES":"1","APS5_BINDLESS_LAZY":"1","APS5_CACHE_SPIRV_BACKING":"1","APS5_COLD_SPIRV":"1","APS5_COLD_SPIRV_FILE":"1","APS5_DEFER_REFRESH_FLUSH":"1","APS5_DUMP_FRAMES":"300","APS5_DUMP_FRAMES_EVERY":"10","APS5_INLINE_SHADER_PREPARE":"1","APS5_MEM_STATS":"10","APS5_NO_ADDRESS_DRAW_REUSE":"1","APS5_NO_DRAW_AHEAD":"1","APS5_NO_HELD_READ_SKIP":"1","APS5_NO_PAD_INPUT":"1","APS5_NO_PIPELINE_JOURNAL":"1","APS5_NO_RESULT_MEMO":"1","APS5_PAD_SCRIPT":"100:cross,106:cross,112:cross,118:cross,124:cross,130:cross,136:cross,142:cross,148:cross,154:cross,160:cross,166:cross,172:cross,178:cross,184:cross,190:cross,196:cross,202:cross,208:cross,214:cross,220:cross,226:cross,232:cross,238:cross,244:cross,250:cross,256:cross,262:cross,268:cross,274:cross,280:cross,286:cross,292:cross,298:cross,304:cross,310:cross,316:cross,322:cross,328:cross,334:cross,340:cross,346:cross,352:cross,358:cross,364:cross,370:cross,376:cross,382:cross,388:cross,394:cross,400:cross,406:cross,412:cross,418:cross,424:cross,430:cross,436:cross,442:cross,448:cross,454:cross,460:cross,466:cross,472:cross,478:cross,484:cross,490:cross,496:cross,502:cross,508:cross,514:cross,520:cross,526:cross,532:cross,538:cross,544:cross,550:cross,556:cross,562:cross,568:cross,574:cross,580:cross","APS5_PAD_SCRIPT_REPEAT":"","APS5_PIPELINE_INDIRECT":"1","APS5_PROFILE_DRAW":"1","APS5_PROFILE_GPU":"0","APS5_RESOURCE_CACHE_ENTRIES":"1024","APS5_SPANNED_WAVE":"1","APS5_STAGING_DIFF":"1","APS5_TEXTURE_OVERFLOW_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_FRAMES":"880:60","APS5_TRACE_SUMMARY_EVERY":"10","APS5_UNNORM_WRAP_GUARD":"1"},"gpu":"NVIDIA GeForce RTX 3080 Laptop GPU","driver":"NVIDIA 610.62","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz","cpu_threads":16,"memory_mib":32469,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"frames 880:60","first_present":880,"ms":103115.527},"presents":60,"frame_ms":{"p50":1646.161,"p90":2017.432,"p99":2083.754,"max":2083.754},"gpu_busy_ms_per_present":858.029,"worker_busy_pct":{"queue worker 0x0":91.589,"queue worker 0x20":72.695,"queue worker 0x53":59.167,"queue worker 0x52":59.599,"queue worker 0x38":86.150,"queue worker 0x48":3.345,"queue worker 0x30":84.486,"queue worker 0x51":7.119,"queue worker 0x50":36.681},"top_phases_ms_per_frame":{"Driver.Packet":8602.988,"Driver.Packet.memory_wait":6023.072,"Driver.Packet.dispatch":1123.073,"DrawPipeline.commit":1073.707,"Graphics.Draw":959.498,"Driver.Packet.draw":916.222,"Driver.Draw":911.526,"Driver.Dispatch":888.268},"trace_dropped":false,"trace":"aps5-trace-085bd8f20325-24308.json.gz"}
{"commit":"085bd8f20325","dirty":false,"env":{"APS5_ASYNC_LANE":"51","APS5_BINDLESS_IMAGES":"1","APS5_BINDLESS_LAZY":"1","APS5_CACHE_SPIRV_BACKING":"1","APS5_COLD_SPIRV":"1","APS5_COLD_SPIRV_FILE":"1","APS5_DEFER_REFRESH_FLUSH":"1","APS5_DUMP_FRAMES":"300","APS5_DUMP_FRAMES_EVERY":"10","APS5_INLINE_SHADER_PREPARE":"1","APS5_MEM_STATS":"10","APS5_NO_ADDRESS_DRAW_REUSE":"1","APS5_NO_DRAW_AHEAD":"1","APS5_NO_PAD_INPUT":"1","APS5_NO_PIPELINE_JOURNAL":"1","APS5_NO_RESULT_MEMO":"1","APS5_PAD_SCRIPT":"100:cross,106:cross,112:cross,118:cross,124:cross,130:cross,136:cross,142:cross,148:cross,154:cross,160:cross,166:cross,172:cross,178:cross,184:cross,190:cross,196:cross,202:cross,208:cross,214:cross,220:cross,226:cross,232:cross,238:cross,244:cross,250:cross,256:cross,262:cross,268:cross,274:cross,280:cross,286:cross,292:cross,298:cross,304:cross,310:cross,316:cross,322:cross,328:cross,334:cross,340:cross,346:cross,352:cross,358:cross,364:cross,370:cross,376:cross,382:cross,388:cross,394:cross,400:cross,406:cross,412:cross,418:cross,424:cross,430:cross,436:cross,442:cross,448:cross,454:cross,460:cross,466:cross,472:cross,478:cross,484:cross,490:cross,496:cross,502:cross,508:cross,514:cross,520:cross,526:cross,532:cross,538:cross,544:cross,550:cross,556:cross,562:cross,568:cross,574:cross,580:cross","APS5_PAD_SCRIPT_REPEAT":"","APS5_PIPELINE_INDIRECT":"1","APS5_PROFILE_DRAW":"1","APS5_PROFILE_GPU":"0","APS5_RESOURCE_CACHE_ENTRIES":"1024","APS5_SPANNED_WAVE":"1","APS5_STAGING_DIFF":"1","APS5_TEXTURE_OVERFLOW_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_FRAMES":"880:60","APS5_TRACE_SUMMARY_EVERY":"10","APS5_UNNORM_WRAP_GUARD":"1"},"gpu":"NVIDIA GeForce RTX 3080 Laptop GPU","driver":"NVIDIA 610.62","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz","cpu_threads":16,"memory_mib":32469,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"frames 880:60","first_present":880,"ms":116142.666},"presents":60,"frame_ms":{"p50":1867.327,"p90":2241.303,"p99":3623.795,"max":3623.795},"gpu_busy_ms_per_present":954.812,"worker_busy_pct":{"queue worker 0x0":91.749,"queue worker 0x20":73.259,"queue worker 0x52":60.295,"queue worker 0x53":59.844,"queue worker 0x38":86.110,"queue worker 0x48":3.289,"queue worker 0x30":84.485,"queue worker 0x51":7.580,"queue worker 0x50":35.976},"top_phases_ms_per_frame":{"Driver.Packet":9724.737,"Driver.Packet.memory_wait":6819.175,"Driver.Packet.dispatch":1305.988,"DrawPipeline.commit":1198.993,"Graphics.Draw":1073.074,"Driver.Packet.draw":1047.088,"Driver.Draw":1041.814,"Driver.Dispatch":1022.959},"trace_dropped":false,"trace":"aps5-trace-085bd8f20325-1084.json.gz"}
{"commit":"085bd8f20325","dirty":false,"env":{"APS5_ASYNC_LANE":"51","APS5_BINDLESS_IMAGES":"1","APS5_BINDLESS_LAZY":"1","APS5_CACHE_SPIRV_BACKING":"1","APS5_COLD_SPIRV":"1","APS5_COLD_SPIRV_FILE":"1","APS5_DEFER_REFRESH_FLUSH":"1","APS5_DUMP_FRAMES":"300","APS5_DUMP_FRAMES_EVERY":"10","APS5_INLINE_SHADER_PREPARE":"1","APS5_MEM_STATS":"10","APS5_NO_ADDRESS_DRAW_REUSE":"1","APS5_NO_DRAW_AHEAD":"1","APS5_NO_PAD_INPUT":"1","APS5_NO_PIPELINE_JOURNAL":"1","APS5_NO_RESULT_MEMO":"1","APS5_PAD_SCRIPT":"100:cross,106:cross,112:cross,118:cross,124:cross,130:cross,136:cross,142:cross,148:cross,154:cross,160:cross,166:cross,172:cross,178:cross,184:cross,190:cross,196:cross,202:cross,208:cross,214:cross,220:cross,226:cross,232:cross,238:cross,244:cross,250:cross,256:cross,262:cross,268:cross,274:cross,280:cross,286:cross,292:cross,298:cross,304:cross,310:cross,316:cross,322:cross,328:cross,334:cross,340:cross,346:cross,352:cross,358:cross,364:cross,370:cross,376:cross,382:cross,388:cross,394:cross,400:cross,406:cross,412:cross,418:cross,424:cross,430:cross,436:cross,442:cross,448:cross,454:cross,460:cross,466:cross,472:cross,478:cross,484:cross,490:cross,496:cross,502:cross,508:cross,514:cross,520:cross,526:cross,532:cross,538:cross,544:cross,550:cross,556:cross,562:cross,568:cross,574:cross,580:cross","APS5_PAD_SCRIPT_REPEAT":"","APS5_PIPELINE_INDIRECT":"1","APS5_PROFILE_DRAW":"1","APS5_PROFILE_GPU":"0","APS5_RESOURCE_CACHE_ENTRIES":"1024","APS5_SPANNED_WAVE":"1","APS5_STAGING_DIFF":"1","APS5_TEXTURE_OVERFLOW_MIB":"1024","APS5_TRACE_DIR":"<path>","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_FRAMES":"880:60","APS5_TRACE_SUMMARY_EVERY":"10","APS5_UNNORM_WRAP_GUARD":"1"},"gpu":"NVIDIA GeForce RTX 3080 Laptop GPU","driver":"NVIDIA 610.62","os":"Windows 10.0.26200","cpu":"11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz","cpu_threads":16,"memory_mib":32469,"title_id":"PPSA26344","title":"Ghost of Y\u00c5\u008dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"frames 880:60","first_present":880,"ms":97466.171},"presents":60,"frame_ms":{"p50":1605.492,"p90":1758.921,"p99":1913.625,"max":1913.625},"gpu_busy_ms_per_present":906.032,"worker_busy_pct":{"queue worker 0x0":91.049,"queue worker 0x53":58.251,"queue worker 0x20":72.397,"queue worker 0x52":58.648,"queue worker 0x38":85.704,"queue worker 0x48":2.584,"queue worker 0x30":83.804,"queue worker 0x51":7.236,"queue worker 0x50":37.859},"top_phases_ms_per_frame":{"Driver.Packet":8079.757,"Driver.Packet.memory_wait":5587.069,"Driver.Packet.dispatch":1119.145,"DrawPipeline.commit":979.337,"Driver.Dispatch":875.332,"Graphics.Draw":856.851,"Driver.Packet.draw":833.317,"Driver.Draw":828.708},"trace_dropped":false,"trace":"aps5-trace-085bd8f20325-3756.json.gz"}

@oneandonlydean
oneandonlydean merged commit 006c364 into boykopovar:main Oct 25, 2026
15 checks passed
johandavidcm added a commit to johandavidcm/AnyPS5 that referenced this pull request Oct 26, 2026
…ort the walks

HeldReadQueries counts every query, as main's QueuedIndexReadOrder test
expects since boykopovar#8911; behind the prefilter it missed the queries the
prefilter answered. HeldReadWalks counts the locked walks, and the
[draw] pipelined line prints both per report.
Celegans12 added a commit to Celegans12/AnyPS5-Ghost-of-Yotei that referenced this pull request Oct 27, 2026
…t-in switches

Main keeps resident linear targets and layer-scoped refreshes on by default;
our tree makes them opt-in (APS5_RESIDENT_LINEAR, APS5_LAYER_REFRESH). The
linear_target tests now run with APS5_RESIDENT_LINEAR=1, draw_bindings also
with APS5_NO_READ_ONLY_LEASE_SKIP=1 (our read-only lease skip records the
store in the open batch instead of syncing, which the test counts), and the
depth_plane_partial_store pair with APS5_LAYER_REFRESH=1. Main's new check
that an empty flush asks for no held reads (boykopovar#8911, merged without a switch)
is skipped in our APS5_NO_HELD_READ_SKIP variant.

AI-assisted: yes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* perf Performance change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants