Repository navigation
perf(agc): build a pipelined draw's resource-cache key before it reaches the committer - #10678
WallisSkill wants to merge 3 commits into
Conversation
MarcZX10
left a comment
There was a problem hiding this comment.
The early-key path appears to preserve the existing fallback when the device marker does not match, and the verification mode compares the precomputed key with the committer-side calculation. I cannot approve this AGC change yet because the repository's AGC validation rule requires the same focused tests on main and this head with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, and VK_LAYER_KHRONOS_validation, then a comparison confirming no new VUIDs. The PR reports the validation layer is unavailable and gives branch test counts only. Please attach both runs from a layer-equipped machine/GPU (including confirmation the layer was actually loaded), or explain what supported validation route can satisfy the rule.
The contribution guide also requires tools/trace_digest.py output for performance claims. The release has the traces and per-capture JSON summary assets; please include the digest output for the paired captures (or the prescribed report output). I downloaded the base-1 and pr4-1 trace assets and confirmed the digester reads them; it reports 147 and 158 frames, respectively, but no summary line was found when run against the release asset layout.
This head currently conflicts with main in Draw.cpp (GitHub also reports DIRTY) and conflicts with open #10677 in that same file; the two PRs currently say Depends on: none. Please rebase/resolve the main conflict and coordinate landing order with #10677's author, then record the dependency on the checklist. The overlap is substantive: current main captures writablePrograms in finishDraw, while this branch retains programs; integrating both needs an explicit resolution that preserves the current-main behavior and the early-key change.
|
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.
|
dd04c54 to
f0d6652
Compare
|
Thanks for the review. Addressed:
|
MarcZX10
left a comment
There was a problem hiding this comment.
Reviewed exact head f0d6652d3b0f82d2effe59697c0b8be4fc0362b0. The early key is built from the same draw inputs and carries the originating device handle; the commit path falls back to recomputing it if the active device differs, and the verification mode compares it against the committer-side key. The author reports 76/76 focused AGC tests passing with key verification enabled, plus the same 38 tests on main and this head with Vulkan validation confirmed loaded and no new VUIDs. The paired performance report now includes trace_digest.py summaries and trace assets. Current hosted conventions, labels, eligibility and report checks pass; product CI jobs are skipped by policy.
|
The branch is now marked |
f0d6652 to
4d4b48d
Compare
|
Rebased onto
|
|
A data point from a title that is bound by the queue worker rather than by the committer, in case it helps decide the default. Planet of Lana (PPSA19450), Apple M4 Pro, macOS 27.0.1, x86-64 under Rosetta 2, MoltenVK 1.4.2, default driver settings (no
In this scene the queue worker translates for about 29 of the 34 ms of a frame, and it is what paces the title. Moving the key onto it adds about 1 ms per frame there (29 to 30 ms, rounded), so the change is neutral to about 2% slower. The difference is close to the run-to-run spread. In titles where the committer is the limit, as in your Graveyard Keeper 2 scene, the trade goes the other way. So One run with AI-assisted: yes |
|
@imellag thanks, that is exactly the case I had not measured. 7b0b45a builds the early key only on the draw finisher; a draw that queue worker 0 finishes itself leaves the key to the committer as before, so the change no longer puts anything on the worker. Re-measured on Graveyard Keeper 2 against
With the finisher the gain stays (about 5 %); without it the new head matches The AGC suite passes again at 7b0b45a in plain and pipelined modes with |
|
Linux run of this head
Edited: the first version of this comment reported 23 failures and called them lavapipe-only AGC tests that also fail on AI-assisted: yes (Claude Code) |
|
Additional Linux/AMD correctness check for exact PR head
No performance claim: this native run had validation/verifier overhead and disabled shader caches. Its pink foreground palette also differs from the earlier blue/cyan baseline capture. An initial harness attempt lacked its menu reference images and did not reach gameplay; it was rejected, fixed with a reference-image preflight, and repeated before the result above. Paired fixture logs, exact build pins and native receipt · SHA-256 |
|
@JJenkx Thanks for the AMD run with the verifier and validation layer on. No early-key mismatch on a real title is good to see. |
…hes the committer The thread that finishes a pipelined draw (the draw finisher, or queue worker 0) now builds the draw's resource-cache key from the same stages, state and parameters, and the commit uses it when it was made for the committing device. Graveyard Keeper 2, first dungeon room, APS5_PIPELINED_DRAWS 256: frame p50 67.3-68.8 ms on main, 62.5-63.8 ms with this change. APS5_NO_EARLY_DRAW_KEY keeps the key on the committer; APS5_VERIFY_EARLY_DRAW_KEY rebuilds it there and requires both to match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A draw that queue worker 0 finishes itself (the draw pipeline without the finisher hand-off) built the resource-cache key on the worker before queueing the commit. In a title paced by the worker that moved about 1 ms per frame onto the slowest thread. The key is now built early only on the draw finisher, which runs beside the worker; every other draw leaves it to the committer as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7b0b45a to
f32df51
Compare
|
Rebased onto On the rebased head:
I also re-measured, since
The change still moves the key off the committer (about 4.5 ms less AI-assisted: yes (Claude Code) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The branch conflicted with The conflict was with 2b349ff (the draw shape memo).
On the merged head, Windows 11 Pro, MinGW GCC Release, RTX 5070 (616.92):
The performance situation is the one in my last comment. On current AI-assisted: yes (Claude Code) |
✅ NVIDIA GPU test: passedPR head
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validation IDs already present on main (4 IDs in 525 tests)Skipped (49)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
Re-checked — new head, current frame-time gain not demonstratedThe exact head I ran A matched capture against current |
…re-ahead branch
…and main Merge johandavidcm's feat/agc-draw-prepare-ahead (4c1af4f, with boykopovar#10678) for the Windows A/B measurement. The prepared-ahead fragment outputs, stages and vertex layout and the early resource key feed planDraw. An adopted pipeline takes precedence over main's shape memo. Main's shape parameter is kept ahead of contentKey and ahead in every Draw signature. The pipelined summary keeps main's separate read-range field. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011mLh2dBi2gkidDMAs7CY9u
|
@WallisSkill #14051 (the draw-side step 2 from #7895) builds the resource key in a new |
|
One more data point on the frame-time question, from ASTRO BOT (PPSA21567 01.019.000) at Crash Site (
Frame p50 moves by +0.9 ms in round 1 and −0.7 ms in round 2, so the difference changes sign between rounds and stays inside the run-to-run spread. Pooling the 38 intervals per arm gives a median difference of +0.3 ms, with a bootstrap 95 % interval of −0.8 to +1.2 ms. The phases move in the expected direction but only slightly: Verification: I ran 150 s at the same scene with AI-assisted: yes (Claude Code) |
|
Hi @WallisSkill, thanks for keeping this branch current. It conflicts with Two things would move it forward:
The reason for the second point: the runs we have so far don't show a gain. In @MarcZX10's re-check of |
What
The draw finisher now builds the resource-cache key of a pipelined draw it finishes (
DrawResourceKey, the same inputsresolveDrawResourcesuses) before it queues the commit, andDriver::commitDrawpasses it down throughVulkanDevice::DrawandGraphics::Draw.resolveDrawResourcesuses the key when it was made for the committing device (the key's first words hold the device handle) and builds its own otherwise, as before. The committer runs every draw under the GPU mutex and is the stage the draws wait for in this scene, while the finisher has time to spare. A draw that queue worker 0 finishes itself (no finisher hand-off) leaves the key to the committer as before, so the change never adds work to the worker (head 7b0b45a, after the Planet of Lana measurement in the review).APS5_NO_EARLY_DRAW_KEYkeeps the key on the committer.APS5_VERIFY_EARLY_DRAW_KEYrebuilds it on the committer and requires both keys to be equal; a first-room run and the AGC suite below ran with it and found no difference.Tested
Windows 11 Pro 10.0.26200, AMD Ryzen 7 9800X3D, NVIDIA GeForce RTX 5070 (driver 616.92), MinGW Release build.
Update,
maincccdaa2 (head f32df51): re-measured with the same setup, three interleaved rounds, the arms differing only inlibSceAgcDriver.prx: frame p50 52.7 / 53.0 / 52.3 ms onmainand 52.8 / 52.3 / 53.3 ms with this change, so the frame-time gain below does not reproduce on currentmain. The committer still spends about 4.5 ms less per frame inGraphics.Draw(43.4-44.0 against 38.8-39.4 ms) and the finisher about 2 ms more, but queue worker 0 is now the limit (96 % busy in every capture of both arms). The 38 AGC tests pass on this head in plain and pipelined mode withAPS5_VERIFY_EARLY_DRAW_KEY=1(76 of 76), and the validation comparison against cccdaa2 is unchanged (VUID-VkDeviceCreateInfo-pNext-pNextonly, 138 on each side, identical per test). The measurements below are from the earlier bases.Performance: Graveyard Keeper 2 (PPSA35943), the first dungeon room after New game, 1920x1080 window, captured with
APS5_TRACE_SECONDS=120:10andAPS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=256 APS5_PIPELINE_DISPATCH=1 APS5_MIMALLOC=1, no otherAPS5_TRACE_*orAPS5_PROFILE_*switch and no log redirection. Base ismain3fcb5e4; the change was built at 0039a4195, which differs from this branch's head only in the commit message. Each build ran the scene once to warm the caches, then the captures below ran back to back on the same machine; the input came fromAPS5_PAD_INPUT_FILE(the libScePad command file), so the window was not focused. The trace buffer dropped events at its default size in every capture (dropped: yes); the frame times come from the presents.Summary lines (main, then this change):
{"commit":"3fcb5e4d7649","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2344,"ms":10047.517},"presents":148,"frame_ms":{"p50":67.270,"p90":72.242,"p99":77.354,"max":78.058},"gpu_busy_ms_per_present":8.861,"worker_busy_pct":{"queue worker 0x0":96.438},"top_phases_ms_per_frame":{"Driver.Packet":65.406,"Graphics.Draw":57.908,"Graphics.Draw.draw_and_resource_release":49.344,"Driver.Packet.draw":42.270,"Driver.Draw":41.904,"Driver.DrawFinish":35.172,"Driver.Draw.prepare":32.781,"Driver.DrawFinish.shader_compile_and_link":31.427},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":6.419,"events_lost":154720,"totals_full":false}},"trace":"aps5-trace-3fcb5e4d7649-48276.json.gz"} {"commit":"0039a41950a1","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2459,"ms":10006.312},"presents":159,"frame_ms":{"p50":62.738,"p90":67.191,"p99":73.602,"max":82.012},"gpu_busy_ms_per_present":8.973,"worker_busy_pct":{"queue worker 0x0":96.247},"top_phases_ms_per_frame":{"Driver.Packet":60.504,"Graphics.Draw":51.029,"Graphics.Draw.draw_and_resource_release":42.879,"Driver.Packet.draw":42.139,"Driver.Draw":41.770,"Driver.DrawFinish":36.897,"Driver.Draw.prepare":34.393,"Driver.DrawFinish.shader_compile_and_link":30.273},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.734,"events_lost":198648,"totals_full":false}},"trace":"aps5-trace-0039a41950a1-49148.json.gz"}Traces and the other summary lines: https://github.com/WallisSkill/AnyPS5/releases/tag/gk2-perf-traces-2026-10-24 (files
gk2-base-*andgk2-pr4-*).Second measurement, at head 7b0b45a (
maincf528e7 as base), same scene and machine, with two launch configurations.ppis the configuration above (APS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=256 APS5_PIPELINE_DISPATCH=1 APS5_MIMALLOC=1, the finisher on);npdrops the three draw pipeline switches, so queue worker 0 finishes every draw and is the limit (98 % busy in everynpcapture).oldis the previous head 4d4b48d, which built the key on whichever thread finished the draw. One warm-up run, then two rounds of np main, np old, np fixed, pp main, pp fixed, interleaved; onlylibSceAgcDriver.prxdiffers between them.mainmainSummary lines of the pp pair:
{"commit":"cf528e78c6c8","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2582,"ms":10022.136},"presents":167,"frame_ms":{"p50":59.443,"p90":63.864,"p99":69.202,"max":70.419},"gpu_busy_ms_per_present":8.153,"worker_busy_pct":{"queue worker 0x0":96.375},"top_phases_ms_per_frame":{"Driver.Packet":57.775,"Graphics.Draw":51.418,"Graphics.Draw.draw_and_resource_release":43.756,"Driver.Packet.draw":37.369,"Driver.Draw":37.035,"Driver.DrawFinish":32.035,"Driver.Draw.prepare":29.601,"Driver.DrawFinish.shader_compile_and_link":28.782},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.674,"events_lost":37548,"totals_full":false}},"trace":"aps5-trace-cf528e78c6c8-22008.json.gz"} {"commit":"7b0b45a52101","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2644,"ms":10037.288},"presents":178,"frame_ms":{"p50":55.885,"p90":60.024,"p99":65.750,"max":69.923},"gpu_busy_ms_per_present":8.118,"worker_busy_pct":{"queue worker 0x0":96.141},"top_phases_ms_per_frame":{"Driver.Packet":54.149,"Graphics.Draw":45.583,"Driver.Packet.draw":38.391,"Graphics.Draw.draw_and_resource_release":38.222,"Driver.Draw":38.051,"Driver.DrawFinish":34.184,"Driver.Draw.prepare":31.822,"Driver.DrawFinish.shader_compile_and_link":28.210},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":7.670,"events_lost":82083,"totals_full":false}},"trace":"aps5-trace-7b0b45a52101-37168.json.gz"}With the finisher the change still takes about 5 % off the frame. Without it this head matches
main, as intended. In this title the previous head was faster there too (the committer is close to the limit as well), but in the Planet of Lana scene from the review it cost about 1 ms per frame on the worker, so the key now stays off the worker everywhere. Traces and summary lines: filesgk2-ek-*in the release.Tests: 38 AGC driver tests (draw pipeline, finisher, label order, vertex fetch, vertex table read order, draw cache, depth and DCC cases) in plain and
APS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1modes withANYPS5_NO_SHADER_CACHE=1: 76 of 76 pass, run withAPS5_VERIFY_EARLY_DRAW_KEY=1, at 4d4b48d and again at 7b0b45a. The branch is rebased ontomaincf528e7.mainnow passes aDrawTraceContextthroughDriver::commitDraw,VulkanDevice::DrawandGraphics::Draw(andPreparedDraw::trace); the key goes after it in each of those signatures, the pipelined commit captures bothtraceandwritableProgramsfrommainand addscontentKey, andVulkanDevice::Drawkeepsmain'straceDrawsswitch.DrawResourceContentKeystill builds the key from the sameDrawResourceKeyinputs asresolveDrawResources(indexBytesisindexCount * indexSizein both), whichAPS5_VERIFY_EARLY_DRAW_KEY=1checks on every draw of the suite. The captures above are from the first head 0039a4195.Validation: the same 38 AGC driver tests ran on
maincf528e7 and on this head (rebased onto it) withVK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation,ANYPS5_NO_SHADER_CACHE=1,ANYPS5_REQUIRE_VULKAN=1,APS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=32 APS5_PIPELINE_DISPATCH=1andVK_LOADER_DEBUG=layer. The layer is theVkLayer_khronos_validation.dllthat Steam ships inbin/cef/cef.win64, registered throughVK_ADD_LAYER_PATHwith its own manifest; every test that creates a device logsInserted device layer "VK_LAYER_KHRONOS_validation"(31 of 38; the other 7 make no Vulkan device), and no log containswas not found but was requested by env var VK_INSTANCE_LAYERS. All 38 pass on both. The only validation message on either side isVUID-VkDeviceCreateInfo-pNext-pNext, 132 times onmainand 132 times on this head, the same count in each test (this layer build predates some device-creation structures the driver chains); no VUID is new. The comparison was repeated at 7b0b45a with the same result.Digests of a paired capture (the release holds every trace and summary line):
trace_digest.py of ek-pp-main2-1
seconds 120:10 from present 2582: 167 presents, frame p50 59.4 / p90 63.9 / p99 69.2 / max 70.4 ms, GPU busy 8.2 ms per present
NVIDIA GeForce RTX 5070, NVIDIA 616.92, Windows 10.0.26200, 1920x1080, commit cf528e7, dropped: yes
{"commit":"cf528e78c6c8","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2582,"ms":10022.136},"presents":167,"frame_ms":{"p50":59.443,"p90":63.864,"p99":69.202,"max":70.419},"gpu_busy_ms_per_present":8.153,"worker_busy_pct":{"queue worker 0x0":96.375},"top_phases_ms_per_frame":{"Driver.Packet":57.775,"Graphics.Draw":51.418,"Graphics.Draw.draw_and_resource_release":43.756,"Driver.Packet.draw":37.369,"Driver.Draw":37.035,"Driver.DrawFinish":32.035,"Driver.Draw.prepare":29.601,"Driver.DrawFinish.shader_compile_and_link":28.782},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.674,"events_lost":37548,"totals_full":false}},"trace":"aps5-trace-cf528e78c6c8-22008.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 31.7, Driver.Packet 26.8, Graphics.Draw.draw_and_resource_release 25.4, Driver.Packet.draw 12.1, Driver.Packet.dispatch 11.8, Driver.Dispatch 11.8, Driver.Draw 11.6, batch 8.2, Driver.DrawFinish 6.5, Recorder.Sync 6.2
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py of ek-pp-fixed-1
seconds 120:10 from present 2644: 178 presents, frame p50 55.9 / p90 60.0 / p99 65.8 / max 69.9 ms, GPU busy 8.1 ms per present
NVIDIA GeForce RTX 5070, NVIDIA 616.92, Windows 10.0.26200, 1920x1080, commit 7b0b45a, dropped: yes
{"commit":"7b0b45a52101","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2644,"ms":10037.288},"presents":178,"frame_ms":{"p50":55.885,"p90":60.024,"p99":65.75,"max":69.923},"gpu_busy_ms_per_present":8.118,"worker_busy_pct":{"queue worker 0x0":96.141},"top_phases_ms_per_frame":{"Driver.Packet":54.149,"Graphics.Draw":45.583,"Driver.Packet.draw":38.391,"Graphics.Draw.draw_and_resource_release":38.222,"Driver.Draw":38.051,"Driver.DrawFinish":34.184,"Driver.Draw.prepare":31.822,"Driver.DrawFinish.shader_compile_and_link":28.21},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":7.67,"events_lost":82083,"totals_full":false}},"trace":"aps5-trace-7b0b45a52101-37168.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 26.6, Graphics.Draw.draw_and_resource_release 22.2, Driver.Packet 21.0, Driver.Packet.draw 11.5, Driver.Draw 11.1, Driver.DrawFinish 8.4, batch 8.1, Driver.Packet.dispatch 7.1, Driver.Dispatch 7.1, Recorder.Sync 6.2
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py of base-1
seconds 120:10 from present 2344: 148 presents, frame p50 67.3 / p90 72.2 / p99 77.4 / max 78.1 ms, GPU busy 8.9 ms per present
NVIDIA GeForce RTX 5070, NVIDIA 616.92, Windows 10.0.26200, 1920x1080, commit 3fcb5e4, dropped: yes
{"commit":"3fcb5e4d7649","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2344,"ms":10047.517},"presents":148,"frame_ms":{"p50":67.27,"p90":72.242,"p99":77.354,"max":78.058},"gpu_busy_ms_per_present":8.861,"worker_busy_pct":{"queue worker 0x0":96.438},"top_phases_ms_per_frame":{"Driver.Packet":65.406,"Graphics.Draw":57.908,"Graphics.Draw.draw_and_resource_release":49.344,"Driver.Packet.draw":42.27,"Driver.Draw":41.904,"Driver.DrawFinish":35.172,"Driver.Draw.prepare":32.781,"Driver.DrawFinish.shader_compile_and_link":31.427},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":6.419,"events_lost":154720,"totals_full":false}},"trace":"aps5-trace-3fcb5e4d7649-48276.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 39.5, Graphics.Draw.draw_and_resource_release 31.0, Driver.Packet 27.3, Driver.Packet.draw 14.8, Driver.Draw 14.4, Driver.DrawFinish 10.8, Driver.Packet.dispatch 10.1, Driver.Dispatch 10.0, batch 8.9, Driver.DrawFinish.shader_compile_and_link 7.7
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py of pr4-1
seconds 120:10 from present 2459: 159 presents, frame p50 62.7 / p90 67.2 / p99 73.6 / max 82.0 ms, GPU busy 9.0 ms per present
NVIDIA GeForce RTX 5070, NVIDIA 616.92, Windows 10.0.26200, 1920x1080, commit 0039a41950a1, dropped: yes
{"commit":"0039a41950a1","dirty":null,"env":{"APS5_DRAW_PIPELINE":"1","APS5_MIMALLOC":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PIPELINED_DRAWS":"256","APS5_PIPELINE_DISPATCH":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"120:10"},"gpu":"NVIDIA GeForce RTX 5070","driver":"NVIDIA 616.92","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31908,"title_id":"PPSA35943","title":"Graveyard Keeper 2","content_version":"01.001.000","resolution":"1920x1080","window":{"spec":"seconds 120:10","first_present":2459,"ms":10006.312},"presents":159,"frame_ms":{"p50":62.738,"p90":67.191,"p99":73.602,"max":82.012},"gpu_busy_ms_per_present":8.973,"worker_busy_pct":{"queue worker 0x0":96.247},"top_phases_ms_per_frame":{"Driver.Packet":60.504,"Graphics.Draw":51.029,"Graphics.Draw.draw_and_resource_release":42.879,"Driver.Packet.draw":42.139,"Driver.Draw":41.77,"Driver.DrawFinish":36.897,"Driver.Draw.prepare":34.393,"Driver.DrawFinish.shader_compile_and_link":30.273},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.734,"events_lost":198648,"totals_full":false}},"trace":"aps5-trace-0039a41950a1-49148.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Graphics.Draw 32.4, Graphics.Draw.draw_and_resource_release 26.5, Driver.Packet 21.7, Driver.DrawFinish 14.3, Driver.Packet.draw 13.1, Driver.Draw 12.7, batch 9.0, Recorder.Sync 7.4, Driver.DrawFinish.shader_compile_and_link 7.3, Driver.Draw.prepare 6.7
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)🤖 Generated with Claude Code