Skip to content

perf(agc): upload a storage image over several host imports on the GPU - #11485

Open
QRMOE wants to merge 2 commits into
boykopovar:mainfrom
QRMOE:perf/agc-segmented-storage-upload
Open

QRMOE wants to merge 2 commits into
boykopovar:mainfrom
QRMOE:perf/agc-segmented-storage-upload

Conversation

@QRMOE

@QRMOE QRMOE commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

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::upload asked HostImportFor for one import of the whole surface, and without it read the surface through GuestMemory::ReadCommitted, which also waits for the GPU writes pending over it. Write-back already handles the same layout: it falls back to importSegments() 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.

upload now falls back to importSegments() for block-unit images, as write-back does, and refresh treats such an image as direct. uploadWindows takes 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 main 8ff4baf (rebased; Texture.cpp conflicted with #10696, whose CollectWrites refresh now runs inside the new if (!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_blocks gains uploadBlockTests: 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 a StorageUpload pending 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.

    • A third case puts the same 66 pieces in 2 MiB import windows, so the surface spans three segment imports.
    • uploadShadowedSegmentTests covers the gathered-slab branch of uploadWindows: 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.
    • On main (Texture.cpp and Texture.hpp from 8ff4baf, with these tests): the two-segment and three-segment cases fail with the 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.
    • With the slab branch broken on purpose (gathered slab pieces copied from the import instead of the slab), the shadowed case fails with 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> -V over the 23 agc_storage_*, agc_driver_storage_*, agc_driver_graphics and agc_driver_bda_device tests on 8ff4baf (22 on 88795ed): neither log contains was not found but was requested by env var VK_INSTANCE_LAYERS (with VK_LOADER_DEBUG=layer the loader inserts VK_LAYER_KHRONOS_validation from the SDK's VkLayer_khronos_validation.dll); VUID- occurrences are 0 on main and 0 with this PR; main (8ff4baf Texture.cpp and Texture.hpp, with this PR's tests) passes 22 of 23 (agc_storage_writeback_blocks fails, 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.

    • Gather buffer size: with several segments, uploadWindows allocates 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's guestBytes plus 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.
    • @Sumaiter ran the earlier 22 tests on an NVIDIA GeForce RTX 4060 Laptop GPU (driver 596.21) at this head and at main 88795ed: 22 of 22 each, 0 VUID-, and the same negative control fails as expected.
  • On the previous base (main 7a01e6a), tools/select_tests.py selected 1524 of 2467 tests for this diff, -j4, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1: 7 failures, all also failing on main on 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, no APS5_PROFILE_DRAW), after one warm-up run of the base build. Both builds are commits with a clean tree, so the summary lines carry dirty: false:

    run build commit presents in 20 s frame p50 / p90 / p99 / max (ms) GPU busy per present (ms)
    b1 base e08df2b41307 93 214.3 / 226.7 / 290.0 / 290.0 68.0
    c1 this PR c1ed7352b4e9 104 187.9 / 197.7 / 218.6 / 521.4 64.4
    b2 base e08df2b41307 93 214.3 / 227.3 / 266.4 / 266.4 65.0
    c2 this PR c1ed7352b4e9 104 182.4 / 195.5 / 489.3 / 767.1 65.8
    • With this PR the median frame is 182 to 188 ms against 214 ms, 104 presents per 20 s against 93 (about +12 %), in both pairs.
    • c1 and c2 each have one or two slow frames (521 ms in c1, 767 and 489 ms in c2; base maximum 290 ms over its two runs). Matched, repeated control runs of both builds are still to be done; until then the slow frames are unexplained. In each, one dispatch on queue worker 0x0 runs for 300 to 590 ms while the GPU is idle and other queues wait on its memory; the time is not inside any traced slice. Five later runs of the same scene on builds that contain this PR's change had none: the four runs of perf(agc): wait on a flush only for writers over the image layers it stores #8887 on top of this PR (5c93abe8121c, maximum 231 to 235 ms) and one more run of c1ed7352b4e9 with 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.
    • Traces of b2 and c2: aps5-trace-menu-base-e08df2b41307.json.gz, aps5-trace-menu-11485-c1ed7352b4e9.json.gz.
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)

  • present 3688: 266.4 ms at 10730 ms: Driver.WorkerWait (queue worker 0x38) 266.3, Driver.WorkerWait.dequeue_order (queue worker 0x38) 264.8, Driver.Packet (queue worker 0x0) 262.3, Driver.Packet (queue worker 0x28) 228.2
  • present 3690: 251.4 ms at 11221 ms: Driver.WorkerWait (queue worker 0x38) 251.3, Driver.WorkerWait.dequeue_order (queue worker 0x38) 249.5, Driver.Packet (queue worker 0x0) 248.4, Driver.Packet (queue worker 0x28) 200.0
  • present 3654: 239.7 ms at 3460 ms: Driver.WorkerWait (queue worker 0x38) 239.6, Driver.WorkerWait.dequeue_order (queue worker 0x38) 237.8, Driver.Packet (queue worker 0x0) 235.8, Driver.Packet (queue worker 0x28) 193.1
  • present 3651: 232.4 ms at 2777 ms: Driver.WorkerWait (queue worker 0x38) 232.3, Driver.WorkerWait.dequeue_order (queue worker 0x38) 230.3, Driver.Packet (queue worker 0x0) 228.6, Driver.Packet (queue worker 0x28) 192.6
  • present 3671: 231.7 ms at 7109 ms: Driver.WorkerWait (queue worker 0x38) 231.6, Driver.WorkerWait.dequeue_order (queue worker 0x38) 229.9, Driver.Packet (queue worker 0x0) 228.3, Driver.Packet (queue worker 0x28) 193.2

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x38 0.0 (0 %) 213.3 (99 %) 2.3 0.0 Driver.EndSubmission 0.1, Driver.Completion 0.0
queue worker 0x20 64.4 (30 %) 150.0 (70 %) 1.3 1.2 Driver.Packet 104.6, Driver.EndSubmission 0.1
queue worker 0x0 155.9 (72 %) 57.9 (27 %) 1.9 15.0 Driver.Packet 212.3
draw committer 67.4 (31 %) 5.5 (3 %) 142.8 0.4 Graphics.Draw 67.7, Recorder.Sync 0.4
presenter 1.3 (1 %) 0.7 (0 %) 213.7 0.1 VideoOut.Flip 2.0
queue worker 0x28 6.4 (3 %) 208.9 (97 %) 0.5 0.2 Driver.Packet 176.1, Driver.EndSubmission 0.2
gpu 64.3 (30 %) 0.0 (0 %) 151.3 0.0 batch 64.3, draw 0.0

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

  • Driver.WorkerWait (queue worker 0x38) 266.5 ms at 10730 ms, present 3688
  • Driver.WorkerWait (queue worker 0x38) 251.1 ms at 11221 ms, present 3690
  • Driver.WorkerWait (queue worker 0x38) 239.6 ms at 3460 ms, present 3654
  • Driver.WorkerWait (queue worker 0x38) 232.9 ms at 2777 ms, present 3651
  • Driver.WorkerWait (queue worker 0x38) 231.7 ms at 7109 ms, present 3671
  • Driver.WorkerWait (queue worker 0x38) 231.1 ms at 13175 ms, present 3699
  • Driver.WorkerWait (queue worker 0x38) 229.8 ms at 11472 ms, present 3691
  • Driver.WorkerWait (queue worker 0x38) 227.8 ms at 438 ms, present 3640
  • Driver.WorkerWait (queue worker 0x38) 227.7 ms at 18961 ms, present 3726
  • Driver.WorkerWait (queue worker 0x38) 227.1 ms at 7341 ms, present 3672

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

  • batch 187782: 25.1 ms at 11128 ms, present 3689: GPU draw 21.5, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.7, Graphics.Draw.draw_and_resource_release (draw committer) 19.7, Resources.Complete (draw committer) 17.2, Resources.Prepare (draw committer) 0.3
  • batch 187842: 23.3 ms at 11367 ms, present 3690: GPU draw 19.8, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.7, Graphics.Draw.draw_and_resource_release (draw committer) 19.7, Resources.Complete (draw committer) 17.2, Resources.Prepare (draw committer) 0.3
  • batch 187964: 19.0 ms at 11835 ms, present 3692: GPU draw 15.4, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 21.1, Graphics.Draw.draw_and_resource_release (draw committer) 21.1, Resources.Complete (draw committer) 17.5, Recorder.Sync (draw committer) 1.8
  • batch 187905: 18.7 ms at 11603 ms, present 3691: GPU draw 15.1, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 22.9, Graphics.Draw.draw_and_resource_release (draw committer) 22.9, Resources.Complete (draw committer) 19.4, Recorder.Sync (draw committer) 1.7
  • batch 188026: 18.5 ms at 12044 ms, present 3693: GPU draw 14.9, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.0, Graphics.Draw.draw_and_resource_release (draw committer) 19.0, Resources.Complete (draw committer) 16.6, Resources.Prepare (draw committer) 0.3
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)

  • present 4180: 767.1 ms at 3708 ms: Driver.WorkerWait (queue worker 0x38) 767.1, Driver.WorkerWait.dequeue_order (queue worker 0x38) 765.7, Driver.Packet (queue worker 0x0) 764.1, Driver.Packet (queue worker 0x28) 737.2
  • present 4215: 489.3 ms at 10664 ms: Driver.WorkerWait (queue worker 0x38) 489.3, Driver.WorkerWait.dequeue_order (queue worker 0x38) 487.1, Driver.Packet (queue worker 0x0) 485.6, Driver.Packet (queue worker 0x28) 459.1
  • present 4166: 239.1 ms at 1097 ms: Driver.WorkerWait (queue worker 0x38) 239.0, Driver.WorkerWait.dequeue_order (queue worker 0x38) 237.0, Driver.Packet (queue worker 0x0) 235.8, Driver.Packet (queue worker 0x28) 208.9
  • present 4188: 208.7 ms at 5757 ms: Driver.WorkerWait (queue worker 0x38) 208.6, Driver.WorkerWait.dequeue_order (queue worker 0x38) 206.8, Driver.Packet (queue worker 0x0) 205.2, Driver.Packet (queue worker 0x28) 176.1
  • present 4179: 207.6 ms at 3501 ms: Driver.WorkerWait (queue worker 0x38) 207.4, Driver.WorkerWait.dequeue_order (queue worker 0x38) 206.1, Driver.Packet (queue worker 0x0) 204.5, Driver.Packet (queue worker 0x28) 177.1

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x38 0.0 (0 %) 191.3 (99 %) 1.8 0.0 Driver.EndSubmission 0.1
queue worker 0x20 62.0 (32 %) 130.1 (67 %) 1.0 1.0 Driver.Packet 98.6, Driver.EndSubmission 0.0
queue worker 0x0 120.0 (62 %) 71.2 (37 %) 1.9 13.2 Driver.Packet 189.7, Driver.Completion 0.0
draw committer 49.1 (25 %) 1.6 (1 %) 142.3 0.4 Graphics.Draw 48.3, Recorder.Sync 0.7
presenter 1.0 (0 %) 0.6 (0 %) 191.5 0.1 VideoOut.Flip 1.6
queue worker 0x28 1.3 (1 %) 191.4 (99 %) 0.3 0.1 Driver.Packet 163.1, Driver.EndSubmission 0.1
gpu 66.4 (34 %) 0.0 (0 %) 126.6 0.0 batch 66.4

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

  • Driver.WorkerWait (queue worker 0x38) 767.2 ms at 3709 ms, present 4180
  • Driver.Packet.memory_wait (queue worker 0x28) 735.1 ms at 3711 ms, present 4180
  • Driver.WorkerWait (queue worker 0x20) 673.2 ms at 3804 ms, present 4180
  • Driver.WorkerWait (queue worker 0x38) 489.3 ms at 10664 ms, present 4215
  • Driver.Packet.memory_wait (queue worker 0x28) 455.8 ms at 10668 ms, present 4215
  • GpuMutex.wait.indirect (queue worker 0x20) 299.3 ms at 10688 ms, present 4215
  • Driver.WorkerWait (queue worker 0x38) 239.5 ms at 1098 ms, present 4166
  • Driver.WorkerWait (queue worker 0x38) 208.8 ms at 5757 ms, present 4188
  • Driver.Packet.memory_wait (queue worker 0x28) 207.4 ms at 1100 ms, present 4166
  • Driver.WorkerWait (queue worker 0x38) 207.1 ms at 3501 ms, present 4179

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

  • batch 158221: 21.1 ms at 16912 ms, present 4246: GPU draw 17.1, shadow-publish 0.3, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 20.7, Graphics.Draw.draw_and_resource_release (draw committer) 20.6, Resources.Complete (draw committer) 17.7, Resources.Prepare (draw committer) 0.3
  • batch 156932: 21.1 ms at 11089 ms, present 4215: GPU draw 16.9, shadow-publish 0.3, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 21.2, Graphics.Draw.draw_and_resource_release (draw committer) 21.1, Resources.Complete (draw committer) 18.3, Recorder.Sync (draw committer) 0.9
  • batch 157762: 21.0 ms at 14845 ms, present 4235: GPU draw 17.3, shadow-publish 0.3, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 19.3, Graphics.Draw.draw_and_resource_release (draw committer) 19.3, Resources.Complete (draw committer) 16.7, Resources.Prepare (draw committer) 0.2
  • batch 157517: 21.0 ms at 13700 ms, present 4229: GPU draw 17.2, shadow-publish 0.3, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 25.5, Graphics.Draw.draw_and_resource_release (draw committer) 25.5, Resources.Complete (draw committer) 22.2, Resources.Prepare (draw committer) 0.4
  • batch 157927: 21.0 ms at 15593 ms, present 4239: GPU draw 17.2, shadow-publish 0.3, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 20.4, Graphics.Draw.draw_and_resource_release (draw committer) 20.3, Resources.Complete (draw committer) 17.7, Resources.Prepare (draw committer) 0.3

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: AMD Radeon RX 9070 XT, AMD driver 32.0.31021.1015 (Vulkan 1.4.349), Windows 11 Home 26200; NVIDIA GeForce RTX 4060 Laptop GPU, driver 596.21, Windows 11 Home 26200 (the 22-test set, by @Sumaiter)
  • AI-assisted: yes

🤖 Generated with Claude Code

@github-actions github-actions Bot added perf Performance change perf numbers missing perf pull request without a before and after summary line labels Oct 26, 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.

@QRMOE

QRMOE commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

Performance capture, as the perf label asks. RESIDENT EVIL requiem (PPSA31246, 01.200.000), main menu, same machine (RX 9070 XT, AMD 32.0.31021.1015, Windows 11 26200), the same session script and the same environment in both runs (APS5_TRACE_SECONDS=660:20 APS5_TRACE_SUMMARY_EVERY=30 APS5_PROFILE_GPU=1, no APS5_PROFILE_DRAW). "Without" is main 29ce6d8 with #10935, #10304, #9950, #11199 and #11369 applied (the title stops earlier without them); "with" adds this PR. One run each, so run-to-run noise is not measured. The two aps5-trace-*.json.gz captures will be attached in a follow-up comment.

aps5-summary.jsonl window line, without 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":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 PR

seconds 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
AMD Radeon RX 9070 XT, AMD proprietary driver 26.6.2 (LLPC), Windows 10.0.26200, 3840x2160, commit 29ce6d8 (dirty), dropped: no

{"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)

  • present 6266: 230.6 ms at 19493 ms: Driver.WorkerWait (queue worker 0x38) 230.6, Driver.WorkerWait.dequeue_order (queue worker 0x38) 228.1, Driver.Packet (queue worker 0x0) 226.9, Driver.Packet (queue worker 0x28) 189.1
  • present 6251: 205.0 ms at 16675 ms: Driver.WorkerWait (queue worker 0x38) 204.9, Driver.WorkerWait.dequeue_order (queue worker 0x38) 202.8, Driver.Packet (queue worker 0x0) 201.4, Driver.Packet (queue worker 0x28) 164.5
  • present 6242: 201.2 ms at 14987 ms: Driver.WorkerWait (queue worker 0x38) 201.0, Driver.WorkerWait.dequeue_order (queue worker 0x38) 199.3, Driver.Packet (queue worker 0x0) 198.1, Driver.Packet (queue worker 0x28) 157.8
  • present 6268: 199.8 ms at 19915 ms: Driver.Packet (queue worker 0x0) 196.8, Driver.Packet (queue worker 0x28) 150.3, Driver.Packet.memory_wait (queue worker 0x28) 149.3, Driver.Packet.dispatch (queue worker 0x0) 133.6
  • present 6166: 199.4 ms at 583 ms: Driver.WorkerWait (queue worker 0x38) 199.3, Driver.WorkerWait.dequeue_order (queue worker 0x38) 197.6, Driver.Packet (queue worker 0x0) 196.4, Driver.Packet (queue worker 0x28) 155.7

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x38 0.0 (0 %) 187.8 (99 %) 1.9 0.0 Driver.EndSubmission 0.1
queue worker 0x20 35.4 (19 %) 153.2 (81 %) 1.2 1.2 Driver.Packet 75.1, Driver.EndSubmission 0.6
queue worker 0x0 158.8 (84 %) 29.1 (15 %) 1.8 14.2 Driver.Packet 186.4, Driver.Suspend 0.0
draw committer 63.9 (34 %) 9.0 (5 %) 116.8 0.5 Graphics.Draw 64.2, Recorder.Sync 0.5
presenter 0.5 (0 %) 0.8 (0 %) 188.5 0.1 VideoOut.Flip 1.3
queue worker 0x28 3.7 (2 %) 185.6 (98 %) 0.5 0.2 Driver.Packet 149.2, Driver.EndSubmission 0.2
gpu 71.9 (38 %) 0.0 (0 %) 117.8 0.0 batch 71.9, draw 0.0

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

  • Driver.WorkerWait (queue worker 0x38) 231.0 ms at 19493 ms, present 6266
  • Driver.WorkerWait (queue worker 0x38) 204.8 ms at 16676 ms, present 6251
  • Driver.WorkerWait (queue worker 0x38) 200.8 ms at 14988 ms, present 6242
  • Driver.WorkerWait (queue worker 0x38) 199.0 ms at 583 ms, present 6166
  • Driver.WorkerWait (queue worker 0x38) 199.0 ms at 10819 ms, present 6220
  • Driver.WorkerWait (queue worker 0x38) 198.8 ms at 11785 ms, present 6225
  • Driver.WorkerWait (queue worker 0x38) 198.4 ms at 13483 ms, present 6234
  • Driver.WorkerWait (queue worker 0x38) 197.7 ms at 4397 ms, present 6186
  • Driver.WorkerWait (queue worker 0x38) 196.2 ms at 782 ms, present 6167
  • Driver.WorkerWait (queue worker 0x38) 196.0 ms at 14609 ms, present 6240

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

  • batch 187568: 31.1 ms at 684 ms, present 6166: GPU draw 27.7, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.1, Graphics.Draw.draw_and_resource_release (draw committer) 19.1, Resources.Complete (draw committer) 16.9, Resources.Prepare (draw committer) 0.3
  • batch 187622: 30.9 ms at 880 ms, present 6167: GPU draw 27.5, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 17.4, Graphics.Draw.draw_and_resource_release (draw committer) 17.3, Resources.Complete (draw committer) 15.4, Recorder.Sync (draw committer) 0.9
  • batch 187400: 30.7 ms at 102 ms, present 6163: GPU draw 27.2, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.0, Graphics.Draw.draw_and_resource_release (draw committer) 19.0, Resources.Complete (draw committer) 17.0, Resources.Prepare (draw committer) 0.3
  • batch 188507: 30.2 ms at 3925 ms, present 6183: GPU draw 26.8, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 17.9, Graphics.Draw.draw_and_resource_release (draw committer) 17.9, Resources.Complete (draw committer) 15.9, Recorder.Sync (draw committer) 0.8
  • batch 188619: 29.8 ms at 4299 ms, present 6185: GPU draw 26.4, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 18.2, Graphics.Draw.draw_and_resource_release (draw committer) 18.1, Resources.Complete (draw committer) 16.2, Resources.Prepare (draw committer) 0.2
tools/trace_digest.py, with this PR

seconds 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
AMD Radeon RX 9070 XT, AMD proprietary driver 26.6.2 (LLPC), Windows 10.0.26200, 3840x2160, commit 29ce6d8 (dirty), dropped: no

{"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)

  • present 7272: 192.3 ms at 14539 ms: Driver.WorkerWait (queue worker 0x38) 192.1, Driver.WorkerWait.dequeue_order (queue worker 0x38) 190.6, Driver.Packet (queue worker 0x0) 188.8, Driver.Packet (queue worker 0x28) 164.4
  • present 7200: 185.6 ms at 2051 ms: Driver.WorkerWait (queue worker 0x38) 185.5, Driver.WorkerWait.dequeue_order (queue worker 0x38) 183.9, Driver.Packet (queue worker 0x0) 182.2, Driver.Packet (queue worker 0x28) 156.1
  • present 7202: 182.6 ms at 2413 ms: Driver.WorkerWait (queue worker 0x38) 182.5, Driver.WorkerWait.dequeue_order (queue worker 0x38) 180.5, Driver.Packet (queue worker 0x0) 179.1, Driver.Packet (queue worker 0x28) 152.7
  • present 7275: 181.4 ms at 15053 ms: Driver.WorkerWait (queue worker 0x38) 181.4, Driver.WorkerWait.dequeue_order (queue worker 0x38) 179.6, Driver.Packet (queue worker 0x0) 178.3, Driver.Packet (queue worker 0x28) 146.8
  • present 7222: 181.2 ms at 5878 ms: Driver.WorkerWait (queue worker 0x38) 181.0, Driver.WorkerWait.dequeue_order (queue worker 0x38) 179.2, Driver.Packet (queue worker 0x0) 177.4, Driver.Packet (queue worker 0x28) 151.8

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x38 0.0 (0 %) 170.0 (99 %) 1.5 0.0 Driver.EndSubmission 0.1
queue worker 0x20 34.6 (20 %) 136.0 (79 %) 1.0 1.2 Driver.Packet 71.6, Driver.EndSubmission 0.9
queue worker 0x0 141.7 (83 %) 28.0 (16 %) 1.8 14.7 Driver.Packet 168.3, Driver.Suspend 0.0
draw committer 55.5 (32 %) 7.2 (4 %) 108.9 0.5 Graphics.Draw 54.4, Recorder.Sync 0.9
presenter 0.6 (0 %) 0.6 (0 %) 170.4 0.1 VideoOut.Flip 1.2
queue worker 0x28 1.9 (1 %) 169.3 (99 %) 0.3 0.1 Driver.Packet 142.4, Driver.EndSubmission 0.1
gpu 69.3 (40 %) 0.0 (0 %) 102.3 0.0 batch 69.3

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

  • Driver.WorkerWait (queue worker 0x38) 191.9 ms at 14540 ms, present 7272
  • Driver.WorkerWait (queue worker 0x38) 185.1 ms at 2052 ms, present 7200
  • Driver.WorkerWait (queue worker 0x38) 182.3 ms at 2413 ms, present 7202
  • Driver.WorkerWait (queue worker 0x38) 181.6 ms at 15054 ms, present 7275
  • Driver.WorkerWait (queue worker 0x38) 180.8 ms at 5878 ms, present 7222
  • Driver.WorkerWait (queue worker 0x38) 180.3 ms at 4323 ms, present 7213
  • Driver.WorkerWait (queue worker 0x38) 180.3 ms at 10408 ms, present 7248
  • Driver.WorkerWait (queue worker 0x38) 179.8 ms at 7270 ms, present 7230
  • Driver.WorkerWait (queue worker 0x38) 179.7 ms at 10050 ms, present 7246
  • Driver.WorkerWait (queue worker 0x38) 179.4 ms at 9347 ms, present 7242

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

  • batch 170400: 31.7 ms at 17998 ms, present 7292: GPU draw 27.9, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 20.2, Graphics.Draw.draw_and_resource_release (draw committer) 20.2, Resources.Complete (draw committer) 18.1, Resources.Prepare (draw committer) 0.3
  • batch 170815: 31.4 ms at 19661 ms, present 7302: GPU draw 27.8, shadow-publish 0.2, storage-upload 0.2; recorded by Graphics.Draw (draw committer) 18.9, Graphics.Draw.draw_and_resource_release (draw committer) 18.9, Resources.Complete (draw committer) 16.9, Resources.Prepare (draw committer) 0.3
  • batch 170899: 31.4 ms at 19992 ms, present 7304: GPU draw 27.7, storage-upload 0.2, shadow-publish 0.2; recorded by Graphics.Draw (draw committer) 19.7, Graphics.Draw.draw_and_resource_release (draw committer) 19.7, Resources.Complete (draw committer) 17.7, Resources.Prepare (draw committer) 0.3
  • batch 170283: 30.7 ms at 17484 ms, present 7289: GPU draw 27.1, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.2, Graphics.Draw.draw_and_resource_release (draw committer) 19.2, Resources.Complete (draw committer) 17.2, Resources.Prepare (draw committer) 0.3
  • batch 170075: 30.3 ms at 16667 ms, present 7284: GPU draw 26.9, storage-upload 0.2, dcc-clear 0.0; recorded by Graphics.Draw (draw committer) 19.9, Graphics.Draw.draw_and_resource_release (draw committer) 19.9, Resources.Complete (draw committer) 17.8, Resources.Prepare (draw committer) 0.3

@QRMOE

QRMOE commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

The two captures behind the summary lines above (APS5_TRACE_SECONDS=660:20, main menu, same machine and session script), without and with this PR:

aps5-trace-menu-without-11485.json.gz
aps5-trace-menu-with-11485.json.gz

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

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:

  1. This head is 365 commits behind current main (check_main_sync.py --strict reports 1 ahead / 365 behind; merge preview is clean). CONTRIBUTING.md requires branches to be based on and kept up to date with current main. Please sync the branch, resolve any changed-context effects, and rerun the focused AGC validation tests on the updated base and change.
  2. 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.jsonl lines both identify 29ce6d87eb5b and dirty: true; the reported baseline is also based on 7a01e6a494, not current main. 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.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 4448 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp L2591, L3162
PR 15674 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp L2591

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/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1395 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 5021 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 5925 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6186 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6187 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6188 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6192 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6209 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6280 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6481 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7085 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
PR 7457 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7514 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7604 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 7642 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 8484 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 9289 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 9884 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10193 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10249 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10442 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 10920 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 11444 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 12746 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 13486 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13793 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13796 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 13809 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13863 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13920 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13928 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 13929 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 14344 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
PR 15136 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 15169 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 15529 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 15570 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp

@QRMOE
QRMOE force-pushed the perf/agc-segmented-storage-upload branch from 9b4f425 to 4f44a8f Compare October 26, 2026 18:03
@github-actions github-actions Bot added the agc libSceAgc* label Oct 26, 2026
@Sumaiter

Copy link
Copy Markdown
Contributor

No-title Windows/NVIDIA test report for head 4f44a8f582e6f5aa024025b20910d5cf1816e1a4 against its parent baseline 88795ed44801fa719eb2df990cbe1f11a1f9bd81.

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. ANYPS5_GPU=4060; the logs identify the NVIDIA device. No game or title was used.

Ran the 22-test set from the PR description (agc_storage_*, agc_driver_storage_*, agc_driver_graphics, and agc_driver_bda_device) with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, and VK_LOADER_DEBUG=layer.

Commit Result VUID- occurrences Missing-layer warning
baseline 88795ed448 22/22 passed 0 absent
PR head 4f44a8f582 22/22 passed 0 absent

The baseline predates uploadBlockTests, so I also ran a negative control with only the PR's tests/Recorder.cpp applied to the baseline production code. There, agc_storage_writeback_blocks fails as expected: the 64 KiB-offset image over 66 pieces makes 2 segment imports but uses CPU upload, reporting the upload took the CPU path. With the PR, the same case uses GPU-direct upload, and all 4,194,304 bytes survive the round trip.

All three logs contain Insert instance layer "VK_LAYER_KHRONOS_validation". No VUID- validation errors occurred in the comparison.

AI-assisted: yes (Kimi K3.1 Pro)

@QRMOE

QRMOE commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

@MarcZX10 Both points are addressed in the description now:

  1. The branch is rebased onto main 88795ed (head 4f44a8f). The regression test and the 22-test validation comparison were rerun on that head: this PR passes 22 of 22, main's Texture.cpp/Texture.hpp with the new test 21 of 22, with 0 VUID- in both logs and the layer confirmed loaded. main has moved 264 commits since, some in the same files; git merge-tree reports a clean merge, and I'll rebase and rerun again before it lands if you want that head tested too.
  2. The description now has four aps5-summary.jsonl window lines from one session alternating two clean commits (e08df2b41307 base, c1ed7352b4e9 with this PR, both dirty: false), the trace_digest.py output of one run of each, and both traces. Median frame 214 ms → 182–188 ms and 93 → 104 presents per 20 s in both pairs.

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.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed perf numbers missing perf pull request without a before and after summary line labels Oct 26, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 27, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

Thanks, the multi-import upload looks right and the presents gain is good to see. A few things before merge:

  • Long-frame outliers: the candidate captures show long frames (around 489-767 ms) that the baseline doesn't. Could you check them with matched, repeated control runs and either explain or fix them? Please keep the original captures.
  • Test coverage: please add a case where a unit shadow slab holds part of the surface across two imports, and one with three segments, so the gathered-slab branch of uploadWindows is exercised. Also say how large the gather buffer gets for a 4K target (it's allocated per upload and kept until the batch retires).
  • Rebase: this conflicts with main in Texture.cpp (around line 2747). Main (fix(agc): collect upload generation after host import #10696) added a CollectWrites refresh there; please keep it inside the new accepted-import block rather than taking either side wholesale.

@QRMOE
QRMOE force-pushed the perf/agc-segmented-storage-upload branch from 4f44a8f to 1c01a02 Compare October 27, 2026 11:55
@QRMOE

QRMOE commented Oct 27, 2026

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Thanks. Two of the three are done in 1c01a02; the third needs game-rig runs I haven't done yet.

Rebase: onto main 8ff4baf. #10696's CollectWrites refresh now runs inside the new accepted-import block (if (!segments.empty())), right after the segments are imported, rather than taking either side whole. tools/pr_overlap.py reports no line conflicts at the new head.

Tests (agc_storage_writeback_blocks, new commit test(agc): cover three-segment and slab-held storage uploads):

  • A three-segment case: the same 66 pieces in 2 MiB import windows, so the surface spans three segment imports.
  • uploadShadowedSegmentTests covers the gathered-slab branch. The surface sits 1 MiB into write-watched memory over three 2 MiB imports, and one whole unit in each import's part is held fresh by a unit shadow slab with its own byte (0xc1-0xc3) that guest memory doesn't hold. After the upload, write-back and publish, those units must hold the slab bytes and every other byte must match the pattern.
  • With this PR all four cases pass GPU-direct, 4194304 of 4194304 bytes as expected (196608 of 196608 from the slabs). With main's Texture.cpp/Texture.hpp the two- and three-segment cases fail with the upload took the CPU path. With the slab branch broken on purpose (gathered slab pieces copied from the import instead), the shadowed case fails with 195840 of the slab bytes wrong, so the test does reach that branch.
  • Validation (RX 9070 XT, AMD 32.0.31021.1015, SDK 1.4.363.0 layer, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, the 23 agc_storage_*/agc_driver_storage_*/agc_driver_graphics/agc_driver_bda_device tests): this PR 23 of 23, main 22 of 23 (agc_storage_writeback_blocks). 0 VUID- in both logs, no missing-layer message, and VK_LOADER_DEBUG=layer shows the layer inserted.

Gather buffer size: uploadWindows sums each window's tiled span, rounded up to 256 bytes. For a whole-surface upload the windows cover the surface, so the buffer is the surface's guestBytes plus at most 255 bytes per window; a partial upload gathers only its runs. For a 3840x2160 64 KiB R_X target (DescribeSurface pads the height to 2176) that is:

  • 33,423,360 bytes (31.9 MiB) at 4 bytes per texel;
  • 66,846,720 bytes (63.8 MiB) at 8;
  • 133,693,440 bytes (127.5 MiB) at 16;
  • 46,071,808 bytes (43.9 MiB) with a full 12-level chain at 4 bytes.

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

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; current main merge preview is clean.
  • The author reports the new three-segment and slab-held cases, validation-layer runs, and a negative control.
  • git diff --check and tools/check_conventions.py pass against current main.
  • 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.

@TechLevelZero

TechLevelZero commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 1c01a02 merged onto main 93dbd0f · tested 2026-11-02 09:08 UTC · 35 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,443 passed · 6 failed (0 new, 3 also fail on main, 3 unstable on main) · 45 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,494 of 3,165 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (930 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_graphics_maps_fallback 30.6 s, ⚠️ agc_driver_graphics 30.3 s
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_job_manager_compute_capacity: failed in 1 of the last 10 main runs
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress: failed in 7 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (5 IDs in 484 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (484 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 476 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (45)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fps_limit: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_o
Reproduce
git fetch origin 1c01a02411d7af40ed02f786ecbd3c0802f118e1 93dbd0f82aea684e95f15f06e7d42c0064af18cf
git checkout 93dbd0f82aea684e95f15f06e7d42c0064af18cf && git merge --no-ff 1c01a02411d7af40ed02f786ecbd3c0802f118e1
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@EagleBearerYS

Copy link
Copy Markdown
Contributor

@QRMOE heads-up from #13251, which also changes StorageTexture::refresh in Texture.cpp.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

The three-segment and shadow-slab tests, CollectWrites resolution, and gather-buffer size explanation address those parts of the earlier request. The matched repeated controls for the 489–767 ms long-frame outliers are still outstanding in your reply. Please provide the promised baseline/candidate captures and explain or fix the outliers, preserving the original captures. The later focused GPU test reports do not settle that performance question.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@QRMOE

QRMOE commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

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

@mrfelek

mrfelek commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

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 main. They start in a 2 MiB allocation and run into the 848 MiB one after it, so no single host import covers them. That's about 92 CPU uploads (about 2.9 GB) per 10 s. With this PR they upload over both import segments, and the CPU storage uploads drop to 0.

Setup: RTX 3080 Ti (NVIDIA 615.71.09), Ryzen 9 5950X, Ubuntu 26.10 (Linux 7.3), headless, no input, APS5_UNIT_SHADOW_MIB=2048.

Trees:

Presents per 10 s over the last eight 10-s windows of 240-s runs:

runs steady windows
A 3 46–47 in each
B 6 (two interleaved with A, four later as the base of other A/Bs) 50–53 in each

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.

QRMOE and others added 2 commits November 4, 2026 17:32
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@QRMOE
QRMOE force-pushed the perf/agc-segmented-storage-upload branch from 1c01a02 to b98d93c Compare November 4, 2026 16:41
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head b98d93c merged onto main b11c7bf · tested 2026-11-04 18:44 UTC · 29 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,782 passed · 7 failed (0 new, 3 also fail on main, 4 unstable on main) · 49 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,838 of 3,894 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (981 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.2 s
Unstable on main (4, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 3 of the last 10 main runs
agc_driver_submit_progress: failed in 3 of the last 10 main runs
agc_submit_progress: failed in 4 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 3 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (13 IDs in 549 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (549 tests): agc_driver, agc_driver_address_draw_space_reuse, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, and 541 more
VUID-VkShaderModuleCreateInfo-pCode-08737 (8 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_float16_fma_rounding, agc_driver_float16_unused_nan_payloads, agc_driver_packed_alu, agc_driver_packed_f16_denormal_modes, agc_driver_packed_float16_native
VUID-VkShaderModuleCreateInfo-pCode-08739 (8 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_float16_fma_rounding, agc_driver_float16_unused_nan_payloads, agc_driver_packed_alu, agc_driver_packed_f16_denormal_modes, agc_driver_packed_float16_native
VUID-VkShaderModuleCreateInfo-pCode-08741 (8 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_float16_fma_rounding, agc_driver_float16_unused_nan_payloads, agc_driver_packed_alu, agc_driver_packed_f16_denormal_modes, agc_driver_packed_float16_native
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_srgb8_color_target
VUID-VkPipelineShaderStageCreateInfo-module-parameter (1 test): agc_driver_float16_unused_nan_payloads
VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849 (1 test): agc_driver_float16_unused_nan_payloads
VUID-VkSamplerCreateInfo-addressModeU-01079 (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeU-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeV-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeW-parameter (1 test): agc_driver_image_gather_volume
Skipped (49)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_stencil_ref_export: skipped, the device lacks VK_EXT_shader_stencil_export
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not av
Reproduce
git fetch origin b98d93c85ae58494030c2ead134ede8a537bb66b b11c7bf84f5d2f636ff60166cc3371bd071e24d5
git checkout b11c7bf84f5d2f636ff60166cc3371bd071e24d5 && git merge --no-ff b98d93c85ae58494030c2ead134ede8a537bb66b
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head b98d93c merged onto main b11c7bf · tested 2026-11-04 19:25 UTC · 34 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,769 passed · 9 failed (0 new, 8 also fail on main, 1 unstable on main) · 60 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,838 of 3,894 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (981 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ public_headers 58.0 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 8 of the last 10 main runs
Failing on main too (8, not counted against this PR)
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (8 IDs in 549 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (549 tests): agc_driver, agc_driver_address_draw_space_reuse, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, and 541 more
VUID-vkCmdCopyImage-srcImage-01548 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_srgb8_color_target
VUID-VkSamplerCreateInfo-addressModeU-01079 (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeU-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeV-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeW-parameter (1 test): agc_driver_image_gather_volume
Skipped (60)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_idle_publish_wait: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a forced watch of the import reads its submissions as CPU stores
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_storage_pending_key_refresh: skipped, refreshes over a pending key store are not testable here
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platf
Reproduce
git fetch origin b98d93c85ae58494030c2ead134ede8a537bb66b b11c7bf84f5d2f636ff60166cc3371bd071e24d5
git checkout b11c7bf84f5d2f636ff60166cc3371bd071e24d5 && git merge --no-ff b98d93c85ae58494030c2ead134ede8a537bb66b
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

This branch has not been deployed

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

Labels

agc libSceAgc* perf Performance change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants