Repository navigation
Conversation
|
This pull request is labeled |
|
Performance capture, as the
{"commit":"29ce6d87eb5b","dirty":true,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":6163,"ms":20114.841},"presents":106,"frame_ms":{"p50":189.246,"p90":195.995,"p99":204.979,"max":230.648},"gpu_busy_ms_per_present":72.750,"worker_busy_pct":{"queue worker 0x38":0.042,"queue worker 0x20":39.951,"queue worker 0x0":99.036,"queue worker 0x28":78.751},"top_phases_ms_per_frame":{"Driver.Packet":412.342,"Driver.Packet.dispatch":190.274,"Driver.Packet.memory_wait":162.350,"Driver.Dispatch":161.090,"Resources.Complete":111.650,"Vulkan.Dispatch":87.802,"Vulkan.Dispatch.shader_resources":85.984,"Recorder.Sync":73.261},"trace_dropped":false,"trace":"aps5-trace-29ce6d87eb5b-9844.json.gz"}With this PR: {"commit":"29ce6d87eb5b","dirty":true,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":7188,"ms":20072.129},"presents":117,"frame_ms":{"p50":171.684,"p90":178.713,"p99":185.643,"max":192.289},"gpu_busy_ms_per_present":68.587,"worker_busy_pct":{"queue worker 0x38":0.058,"queue worker 0x20":42.295,"queue worker 0x0":99.007,"queue worker 0x28":83.067},"top_phases_ms_per_frame":{"Driver.Packet":383.897,"Driver.Packet.memory_wait":158.302,"Driver.Packet.dispatch":141.131,"Driver.Dispatch":125.192,"Resources.Complete":96.815,"Graphics.Draw":77.083,"Graphics.Draw.draw_and_resource_release":76.286,"Vulkan.Dispatch":63.742},"trace_dropped":false,"trace":"aps5-trace-29ce6d87eb5b-32908.json.gz"}tools/trace_digest.py, without this PRseconds 660:20 from present 6163: 106 presents, frame p50 189.2 / p90 196.0 / p99 205.0 / max 230.6 ms, GPU busy 72.8 ms per present {"commit":"29ce6d87eb5b","dirty":true,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":6163,"ms":20114.841},"presents":106,"frame_ms":{"p50":189.246,"p90":195.995,"p99":204.979,"max":230.648},"gpu_busy_ms_per_present":72.75,"worker_busy_pct":{"queue worker 0x38":0.042,"queue worker 0x20":39.951,"queue worker 0x0":99.036,"queue worker 0x28":78.751},"top_phases_ms_per_frame":{"Driver.Packet":412.342,"Driver.Packet.dispatch":190.274,"Driver.Packet.memory_wait":162.35,"Driver.Dispatch":161.09,"Resources.Complete":111.65,"Vulkan.Dispatch":87.802,"Vulkan.Dispatch.shader_resources":85.984,"Recorder.Sync":73.261},"trace_dropped":false,"trace":"aps5-trace-29ce6d87eb5b-9844.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 410.6, Driver.WorkerWait 342.1, Driver.Packet.dispatch 189.8, Driver.WorkerWait.dequeue_order 185.9, Driver.Packet.memory_wait 162.3, Driver.Dispatch 160.4, Driver.WorkerWait.idle_and_completion_poll 156.2, Resources.Complete 110.5, Vulkan.Dispatch 87.2, Vulkan.Dispatch.shader_resources 85.3 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
tools/trace_digest.py, with this PRseconds 660:20 from present 7188: 117 presents, frame p50 171.7 / p90 178.7 / p99 185.6 / max 192.3 ms, GPU busy 68.6 ms per present {"commit":"29ce6d87eb5b","dirty":true,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":7188,"ms":20072.129},"presents":117,"frame_ms":{"p50":171.684,"p90":178.713,"p99":185.643,"max":192.289},"gpu_busy_ms_per_present":68.587,"worker_busy_pct":{"queue worker 0x38":0.058,"queue worker 0x20":42.295,"queue worker 0x0":99.007,"queue worker 0x28":83.067},"top_phases_ms_per_frame":{"Driver.Packet":383.897,"Driver.Packet.memory_wait":158.302,"Driver.Packet.dispatch":141.131,"Driver.Dispatch":125.192,"Resources.Complete":96.815,"Graphics.Draw":77.083,"Graphics.Draw.draw_and_resource_release":76.286,"Vulkan.Dispatch":63.742},"trace_dropped":false,"trace":"aps5-trace-29ce6d87eb5b-32908.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 382.2, Driver.WorkerWait 298.3, Driver.WorkerWait.dequeue_order 168.3, Driver.Packet.memory_wait 158.3, Driver.Packet.dispatch 140.7, Driver.WorkerWait.idle_and_completion_poll 130.0, Driver.Dispatch 124.6, Resources.Complete 95.8, Graphics.Draw 77.1, Graphics.Draw.draw_and_resource_release 76.3 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
|
|
The two captures behind the summary lines above ( aps5-trace-menu-without-11485.json.gz |
MarcZX10
left a comment
There was a problem hiding this comment.
I reviewed the segmented-upload path and its new round-trip test. The author reports a controlled same-GPU regression test and validation-layer comparison, and the current required policy checks pass. I have not independently run the AGC GPU tests here, and the hosted product jobs are skipped by path policy.
Two repository requirements still block approval:
- This head is 365 commits behind current
main(check_main_sync.py --strictreports 1 ahead / 365 behind; merge preview is clean).CONTRIBUTING.mdrequires branches to be based on and kept up to date with currentmain. Please sync the branch, resolve any changed-context effects, and rerun the focused AGC validation tests on the updated base and change. - The performance evidence is in comments, while the rule requires the PR description to contain two valid summary lines with different commits. The two posted
aps5-summary.jsonllines both identify29ce6d87eb5banddirty: true; the reported baseline is also based on7a01e6a494, not currentmain. Please provide a current-main/change pair with distinct commit IDs and put both lines, the trace attachments, and digest output in the PR description. The reported CLI/runtime data is useful, but the current evidence does not yet meet the stated gate.
I did not find a separate confirmed code defect in the diff during this pass. The related issue #11481 describes a distinct small-tiled-image shadow/write-before-label case; this PR's segmented upload change does not alter that write-back/label path, so I do not consider it a fix for #11481.
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
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.
|
9b4f425 to
4f44a8f
Compare
|
No-title Windows/NVIDIA test report for head Environment: Windows 11 Home 26200, 13th Gen Intel Core i5-13500H, NVIDIA GeForce RTX 4060 Laptop GPU, NVIDIA driver 596.21, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release. Official Khronos validation layer 1.4.363.0. Ran the 22-test set from the PR description (
The baseline predates All three logs contain AI-assisted: yes (Kimi K3.1 Pro) |
|
@MarcZX10 Both points are addressed in the description now:
One thing the new runs show that the old pair did not: both runs with this PR have one or two frames of 489–767 ms that the base runs do not (base maximum 290 ms). The description reports them and does not claim a tail improvement; I'm tracing host imports next to find the cause. Thanks @Sumaiter for the NVIDIA run, now listed in the description. |
|
Thanks, the multi-import upload looks right and the presents gain is good to see. A few things before merge:
|
4f44a8f to
1c01a02
Compare
|
@oneandonlydean Thanks. Two of the three are done in 1c01a02; the third needs game-rig runs I haven't done yet. Rebase: onto Tests (
Gather buffer size:
It's allocated only when no single import covers the surface, and the recorder keeps it until the batch retires. Long-frame outliers: not done yet. I still need to run matched, repeated control runs of both builds on the game rig, and I'll post them with the original captures kept. Until then the 489-767 ms frames are unexplained, and the description says so. AI-assisted: yes (Claude Code). |
MarcZX10
left a comment
There was a problem hiding this comment.
Re-review — changes requested
The new three-segment and shadow-slab tests address the coverage request, and the CollectWrites refresh is retained inside the accepted-import block. The current performance report and integration evidence still do not satisfy the repository's review requirements.
Findings
[P1] Replace the non-compliant performance capture
This PR is labeled perf. The report's four captures use the RESIDENT EVIL requiem main menu and set APS5_PROFILE_GPU=1 and APS5_TRACE_SUMMARY_EVERY=30 (along with frame-dump/logging switches). The repository's Performance report form requires a stable gameplay scene, warm caches, no other APS5_TRACE_* or APS5_PROFILE_* switch, and no redirected log. Please provide the required matched main/change captures using that protocol, with the two summary lines, attached traces, and trace_digest.py output in the PR description. Alternate at least two runs per build as GAME_TESTING.md requires. The current captures are useful diagnostic evidence but cannot substantiate this PR's performance claim under the prescribed form.
[P2] Validate the current-main integration
The capture/test base is 8ff4baf53489033dae79090640143e82d159ee4d. Current main is 4c7d275bef89d309313d16bc2bc05d37a1b50be2 and has since changed Texture.cpp and Recorder.cpp, both touched by this PR. The merge preview is clean, but the current integrated code has not been covered by the reported GPU tests. Please rebase or integrate current main and rerun the focused upload tests on both current main and the change with the required Vulkan validation settings.
[P2] Close the unexplained long-frame follow-up
The PR description still records 489–767 ms frames only in the candidate captures and says matched repeated controls have not been completed. The later candidate-only runs do not rule out a baseline outlier. Please run the requested matched controls or otherwise identify the cause before retaining the performance claim. I am not treating this as a demonstrated regression; the comparison is currently inconclusive for the tail.
What I checked
- Exact head
1c01a02411d7af40ed02f786ecbd3c0802f118e1; currentmainmerge preview is clean. - The author reports the new three-segment and slab-held cases, validation-layer runs, and a negative control.
git diff --checkandtools/check_conventions.pypass against currentmain.- Hosted Windows passes; product Linux and specialized jobs are skipped.
Not verified
I did not run a local AGC build or GPU tests; this workspace exposes no Vulkan device.
✅ 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 (5 IDs in 484 tests)Skipped (45)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. |
|
@QRMOE heads-up from #13251, which also changes
|
|
The three-segment and shadow-slab tests, |
|
@oneandonlydean understood. The repeated controls for the 489–767 ms long frames are still owed. I'll post baseline and candidate captures from the same machine and scene, keeping the original captures, before asking for another look. |
|
Repeated A/B from PPSA28416 (Star Wars Galactic Racer, UE5), title screen: about +12%, CPU storage uploads gone In this title, two 3840x2160 storage targets (formats 36 and 56, 32 MiB each) take the CPU upload path every frame on Setup: RTX 3080 Ti (NVIDIA 615.71.09), Ryzen 9 5950X, Ubuntu 26.10 (Linux 7.3), headless, no input, Trees:
Presents per 10 s over the last eight 10-s windows of 240-s runs:
That's about 4.65 → 5.2 FPS, about +12%. There are no exceptions or aborts in any of the logs. PR #9999 removes the remaining 64 MiB per-frame CPU read in this scene. Together with this PR, the title runs at about 5.9 FPS. AI-assisted. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1c01a02 to
b98d93c
Compare
✅ NVIDIA GPU test: passedPR head
Unstable on main (4, 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 (13 IDs in 549 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. |
✅ AMD GPU test: passedPR head
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (8, not counted against this PR)Validation IDs already present on main (8 IDs in 549 tests)Skipped (60)ReproduceAutomated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
What
A storage image whose guest range no single host import covers was uploaded through the CPU even when every piece of it was imported:
StorageTexture::uploadaskedHostImportForfor one import of the whole surface, and without it read the surface throughGuestMemory::ReadCommitted, which also waits for the GPU writes pending over it. Write-back already handles the same layout: it falls back toimportSegments()and stores through each import (writeBackWindows). With the 8 MiB import window and aligned power-of-two import blocks, an image over registered ranges smaller than the window that crosses a block edge always lands in this case. RESIDENT EVIL requiem (PPSA31246) maps its render targets in 2 MiB pieces, so its 3840x2160 targets (about 32 MiB) took the CPU path on every refresh.uploadnow falls back toimportSegments()for block-unit images, as write-back does, andrefreshtreats such an image as direct.uploadWindowstakes the import segments: with one segment it is unchanged; with several, each segment's pieces are found in its own import and unit shadow (ShadowSources), each window's tiled bytes are copied on the GPU into one device buffer, and the windows are detiled from it as from a slab. Bytes of a window outside the runs (the rest of a tail block) are copied from the import that holds them. The copies are recorded into the open batch and noted as pending reads of the import ranges, like the single-import detile.Tested
Windows 11 Home 26200, Ryzen 7 9800X3D, AMD Radeon RX 9070 XT (AMD 32.0.31021.1015, Vulkan 1.4.349), WinLibs GCC 15.2.0 r7, Release. The head is 1c01a02 on
main8ff4baf (rebased;Texture.cppconflicted with #10696, whoseCollectWritesrefresh now runs inside the newif (!segments.empty())block, after the segments are imported). The regression tests and the validation comparison below were run on that head; the title runs further down were run on the earlier head.agc_storage_writeback_blocksgainsuploadBlockTests: a 64 KiB R_X 1024x1024 image, once over 64 adjacent 64 KiB pieces (one import covers it) and once 64 KiB in, over 66 pieces (two aligned import blocks, so two segment imports). Each is created from a byte pattern, must leave aStorageUploadpending read in the recorder (the GPU-direct path; the CPU path leaves none), and is then written back unchanged; every guest byte must still match the pattern.uploadShadowedSegmentTestscovers the gathered-slab branch ofuploadWindows: the surface sits 1 MiB into write-watched memory over three 2 MiB imports, and one whole unit in each import's part of the surface is held fresh by a unit shadow slab, filled with its own byte (0xc1-0xc3) that guest memory doesn't hold. The image is uploaded, written back unchanged and published; the slab-held units must come back with the slab bytes and every other byte must match the pattern.main(Texture.cppandTexture.hppfrom 8ff4baf, with these tests): the two-segment and three-segment cases fail withthe upload took the CPU path. With this PR: all four cases pass, GPU-direct, 4194304 of 4194304 bytes as expected, 196608 of 196608 from the slabs.the round trip changed 195840 bytes, 195840 of them in the slab-held units, so it does exercise that branch.Khronos validation layer (Vulkan SDK 1.4.363.0), same machine and GPU,
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation,ctest --test-dir build -R <pattern> -Vover the 23agc_storage_*,agc_driver_storage_*,agc_driver_graphicsandagc_driver_bda_devicetests on 8ff4baf (22 on 88795ed): neither log containswas not found but was requested by env var VK_INSTANCE_LAYERS(withVK_LOADER_DEBUG=layerthe loader insertsVK_LAYER_KHRONOS_validationfrom the SDK'sVkLayer_khronos_validation.dll);VUID-occurrences are 0 onmainand 0 with this PR;main(8ff4bafTexture.cppandTexture.hpp, with this PR's tests) passes 22 of 23 (agc_storage_writeback_blocksfails, its multi-segment cases taking the CPU upload), this PR 23 of 23. Before the rebase the same comparison on 88795ed gave 21 of 22 and 22 of 22.uploadWindowsallocates one device buffer holding the tiled bytes of every window it detiles, each window rounded up to 256 bytes, kept by the recorder until the batch retires. For a whole-surface upload the windows cover the surface, so the buffer is the surface'sguestBytesplus at most 255 bytes per window; a partial upload gathers only its runs. For a 3840x2160 64 KiB R_X target (DescribeSurface, height padded to 2176): 33,423,360 bytes (31.9 MiB) at 4 bytes per texel, 66,846,720 (63.8 MiB) at 8 and 133,693,440 (127.5 MiB) at 16; with a full 12-level mip chain at 4 bytes, 46,071,808 (43.9 MiB). Only surfaces that no single import covers take this path.main88795ed: 22 of 22 each, 0VUID-, and the same negative control fails as expected.On the previous base (
main7a01e6a),tools/select_tests.pyselected 1524 of 2467 tests for this diff,-j4,ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1: 7 failures, all also failing onmainon this machine:select_tests,nid_database_cache,agc_host_import_cut_lifetime,agc_driver_depth_plane_partial_store,agc_driver_sample_order_grid_reference,guest_timed_join_import_libkernel_sys,guest_timed_join_import_libkernel_web.Title: RESIDENT EVIL requiem (PPSA31246, 01.200.000), main menu, same machine, four runs in one session alternating the two builds (base, this PR, base, this PR), same script and environment (
APS5_TRACE_SECONDS=660:20 APS5_TRACE_SUMMARY_EVERY=30 APS5_PROFILE_GPU=1 APS5_LOOP_GUARD=100000, noAPS5_PROFILE_DRAW), after one warm-up run of the base build. Both builds are commits with a clean tree, so the summary lines carrydirty: false:e08df2b41307:main88795ed with fix(libScePad): return an error for unsupported port probes #10935, fix(agc): keep buffer owners when a staged address space dissolves #10304, feat(agc): publish a written native multisample D32 depth surface to its guest planes on access #9950, fix(shader): keep pixel helper lanes out of guest lane masks #11199 and fix(agc): release a resident multisample depth before a GPU buffer may write over it #11369 merged (the title stops earlier without them), and the merge of fix(shader_recompiler): pack format 11_11_10 float image stores in shader #8898 reverted: on currentmainthe title stops at boot withcompute shader ...: reads or writes a converted float image with 16-bit data, which is not implemented(fix(shader): load and store 16-bit data of converted packed images #11580 implements that path; it has not been run with the title yet).c1ed7352b4e9: the base with this branch merged; the diff between the two is this PR's three files.e08df2b41307c1ed7352b4e9e08df2b41307c1ed7352b4e95c93abe8121c, maximum 231 to 235 ms) and one more run ofc1ed7352b4e9with the worker sampler (109 presents, p50 183.6 ms, maximum 239.6 ms). The slow frames are intermittent and not shown to come from this PR; two base runs are too few to rule them out there. This PR does not claim an improvement of the frame-time tail.aps5-summary.jsonl window lines, b1, c1, b2, c2
{"commit":"e08df2b41307","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":3720,"ms":20083.213},"presents":93,"frame_ms":{"p50":214.347,"p90":226.734,"p99":289.952,"max":289.952},"gpu_busy_ms_per_present":67.952,"worker_busy_pct":{"queue worker 0x38":0.042,"queue worker 0x20":46.649,"queue worker 0x0":99.389,"queue worker 0x28":80.323},"top_phases_ms_per_frame":{"Driver.Packet":488.467,"Driver.Packet.memory_wait":218.719,"Driver.Packet.dispatch":205.718,"Driver.Dispatch":173.243,"Resources.Complete":106.721,"Vulkan.Dispatch":80.859,"Vulkan.Dispatch.shader_resources":78.897,"Graphics.Draw":75.724},"trace_dropped":false,"trace":"aps5-trace-e08df2b41307-19260.json.gz"} {"commit":"c1ed7352b4e9","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":4324,"ms":20026.206},"presents":104,"frame_ms":{"p50":187.865,"p90":197.666,"p99":218.649,"max":521.423},"gpu_busy_ms_per_present":64.448,"worker_busy_pct":{"queue worker 0x38":0.047,"queue worker 0x20":49.908,"queue worker 0x0":98.993,"queue worker 0x28":85.057},"top_phases_ms_per_frame":{"Driver.Packet":450.326,"Driver.Packet.memory_wait":219.756,"Driver.Packet.dispatch":151.962,"Driver.Dispatch":133.122,"Graphics.Draw":79.329,"Graphics.Draw.draw_and_resource_release":78.618,"Resources.Complete":76.338,"Driver.Packet.draw":44.702},"trace_dropped":false,"trace":"aps5-trace-c1ed7352b4e9-3224.json.gz"} {"commit":"e08df2b41307","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":3638,"ms":20056.808},"presents":93,"frame_ms":{"p50":214.260,"p90":227.304,"p99":266.413,"max":266.413},"gpu_busy_ms_per_present":64.978,"worker_busy_pct":{"queue worker 0x38":0.051,"queue worker 0x20":48.591,"queue worker 0x0":99.207,"queue worker 0x28":81.755},"top_phases_ms_per_frame":{"Driver.Packet":494.795,"Driver.Packet.memory_wait":228.181,"Driver.Packet.dispatch":205.546,"Driver.Dispatch":174.355,"Resources.Complete":105.054,"Vulkan.Dispatch":79.770,"Vulkan.Dispatch.shader_resources":77.792,"Graphics.Draw":73.480},"trace_dropped":false,"trace":"aps5-trace-e08df2b41307-7844.json.gz"} {"commit":"c1ed7352b4e9","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":4160,"ms":20079.305},"presents":104,"frame_ms":{"p50":182.442,"p90":195.542,"p99":489.340,"max":767.129},"gpu_busy_ms_per_present":65.779,"worker_busy_pct":{"queue worker 0x38":0.044,"queue worker 0x20":51.359,"queue worker 0x0":99.199,"queue worker 0x28":84.551},"top_phases_ms_per_frame":{"Driver.Packet":453.752,"Driver.Packet.memory_wait":222.389,"Driver.Packet.dispatch":156.665,"Driver.Dispatch":145.725,"Graphics.Draw":72.726,"Graphics.Draw.draw_and_resource_release":72.076,"Resources.Complete":67.923,"Vulkan.Dispatch":44.686},"trace_dropped":false,"trace":"aps5-trace-c1ed7352b4e9-21436.json.gz"}tools/trace_digest.py, base (b2)
seconds 660:20 from present 3638: 93 presents, frame p50 214.3 / p90 227.3 / p99 266.4 / max 266.4 ms, GPU busy 65.0 ms per present
AMD Radeon RX 9070 XT, AMD proprietary driver 26.6.2 (LLPC), Windows 10.0.26200, 3840x2160, commit e08df2b41307, dropped: no
{"commit":"e08df2b41307","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":3638,"ms":20056.808},"presents":93,"frame_ms":{"p50":214.26,"p90":227.304,"p99":266.413,"max":266.413},"gpu_busy_ms_per_present":64.978,"worker_busy_pct":{"queue worker 0x38":0.051,"queue worker 0x20":48.591,"queue worker 0x0":99.207,"queue worker 0x28":81.755},"top_phases_ms_per_frame":{"Driver.Packet":494.795,"Driver.Packet.memory_wait":228.181,"Driver.Packet.dispatch":205.546,"Driver.Dispatch":174.355,"Resources.Complete":105.054,"Vulkan.Dispatch":79.77,"Vulkan.Dispatch.shader_resources":77.792,"Graphics.Draw":73.48},"trace_dropped":false,"trace":"aps5-trace-e08df2b41307-7844.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 493.0, Driver.WorkerWait 363.3, Driver.Packet.memory_wait 228.2, Driver.WorkerWait.dequeue_order 211.5, Driver.Packet.dispatch 204.9, Driver.Dispatch 173.6, Driver.WorkerWait.idle_and_completion_poll 151.8, Resources.Complete 104.1, Vulkan.Dispatch 79.2, Vulkan.Dispatch.shader_resources 77.2
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
tools/trace_digest.py, this PR (c2)
seconds 660:20 from present 4160: 104 presents, frame p50 182.4 / p90 195.5 / p99 489.3 / max 767.1 ms, GPU busy 65.8 ms per present
AMD Radeon RX 9070 XT, AMD proprietary driver 26.6.2 (LLPC), Windows 10.0.26200, 3840x2160, commit c1ed7352b4e9, dropped: no
{"commit":"c1ed7352b4e9","dirty":false,"env":{"APS5_DUMP_FRAMES":"100000","APS5_DUMP_FRAMES_EVERY":"20","APS5_LOG_TIMESTAMPS":"1","APS5_LOOP_GUARD":"100000","APS5_NO_PROFILE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PROFILE_GPU":"1","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"660:20","APS5_TRACE_SUMMARY_EVERY":"30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.6.2 (LLPC)","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9800X3D 8-Core Processor","cpu_threads":16,"memory_mib":32313,"title_id":"PPSA31246","title":"RESIDENT EVIL requiem","content_version":"01.200.000","resolution":"3840x2160","window":{"spec":"seconds 660:20","first_present":4160,"ms":20079.305},"presents":104,"frame_ms":{"p50":182.442,"p90":195.542,"p99":489.34,"max":767.129},"gpu_busy_ms_per_present":65.779,"worker_busy_pct":{"queue worker 0x38":0.044,"queue worker 0x20":51.359,"queue worker 0x0":99.199,"queue worker 0x28":84.551},"top_phases_ms_per_frame":{"Driver.Packet":453.752,"Driver.Packet.memory_wait":222.389,"Driver.Packet.dispatch":156.665,"Driver.Dispatch":145.725,"Graphics.Draw":72.726,"Graphics.Draw.draw_and_resource_release":72.076,"Resources.Complete":67.923,"Vulkan.Dispatch":44.686},"trace_dropped":false,"trace":"aps5-trace-c1ed7352b4e9-21436.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 451.4, Driver.WorkerWait 315.8, Driver.Packet.memory_wait 222.4, Driver.WorkerWait.dequeue_order 189.5, Driver.Packet.dispatch 155.5, Driver.Dispatch 144.5, Driver.WorkerWait.idle_and_completion_poll 126.3, Graphics.Draw 72.7, Graphics.Draw.draw_and_resource_release 72.0, Resources.Complete 66.8
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
tools/check_conventions.py --base origin/mainpasses.tools/pr_overlap.py --branch perf/agc-segmented-storage-uploadlists text overlaps, none implementing the same thing:CollectWritesinside the import branch ofupload, which this PR restructures; after the rebase it runs inside the newif (!segments.empty())branch. At 1c01a02tools/pr_overlap.pyreports no line conflicts; the PRs it could not compare conflict withmainthemselves.HostImportForcall inrefresh'sdirectwith a cached lookup; this PR adds|| (blockUnits && !importSegments().empty())to the same line.tests/Recorder.cpp.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