Skip to content

perf(agc): wait at submit only for the preparations of the programs a submission binds - #6867

Open
Pipodi wants to merge 5 commits into
boykopovar:mainfrom
Pipodi:perf/referenced-preparation-wait
Open

Pipodi wants to merge 5 commits into
boykopovar:mainfrom
Pipodi:perf/referenced-preparation-wait

Conversation

@Pipodi

@Pipodi Pipodi commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

What

Driver::Submit waits on the submitting thread only for the registration preparations of the programs the submission binds, and moves each to the front of the queue (PrioritizeRegistrationPreparation), instead of waiting for every queued preparation (#5007). The scan reads the program address registers (SPI_SHADER_PGM_LO/HI of the pixel, geometry, export, hull and local stages, COMPUTE_PGM_LO/HI) written by SET_SH_REG and by SET_SH_REG_INDIRECT lists, including packets inside INDIRECT_BUFFER and COND_INDIRECT_BUFFER targets (they are copied into the submission before the scan).

Rebased on main bb04a4f1ea. The pool part reuses main's PrioritizeRegistrationPreparation, as Dextroid17's port did. AwaitRegistrationPreparation and the pool's sequence tracking stay as they are, because the wait-for-all fallback below uses them. The pool also records which preparation owns each queued or running task, so the submit wait can wait for that task.

Change since the review: a submission that writes only one register of a program pair (the other half came from an earlier submission) is not proven by the scan. It now waits for all queued preparations at submit, as main does, instead of leaving that program to an unbounded wait in the queue worker at first use (CnRJay's #5007 concern). A bound after N seconds was not chosen: continuing without the program would skip the draw, which is invented behaviour.

Change since jotitadev's run on 10-27: the wait for a bound program waited on its snapshot's settled condition whenever pending was set. A preparation marked pending with no pool task, as agc_driver_prepared_shaders_dispatch_ahead_prewarm (#8735) does, was never settled, and the submission hung. The wait now moves the program's pool task to the front and waits for that task to finish. It does not wait for a preparation the pool does not hold.

The scan also falls back to the wait-for-all when it cannot see every program the submission uses: the submission ends in a REWIND (the tail is copied later in the queue worker), a SET_SH_REG_INDIRECT list has an invalid register (the worker reads such a list again at execution), a draw (a dispatch) comes before any graphics (the compute) program pair written in the same submission, so the program may have been bound by an earlier submission, or a program address is written by a predicated SET_SH_REG or one inside a COND_EXEC range, which may not run.

Not covered, and recorded in the technical debt entry: a draw that writes one graphics pair but also uses a stage bound by an earlier submission, and a program registered again at an address an earlier submission bound, then used without rebinding while the submission writes a different graphics pair. Their first draw waits in the queue worker with no bound. The longest preparation seen is 74 s on one thread (cold, 55,144-dword shader, Ghost of Yōtei), and a submission that binds such a shader waits as long at submit. A submission the scan cannot prove waits for every queued preparation, as on main (76.3 s first-submission wait on Yōtei, cold, earlier measurement). The measured waits below are machine and cache dependent; no bound is claimed.

Tested

Tests on the rebased branch (Windows, MinGW GCC 15.2, Release, RTX, ANYPS5_REQUIRE_VULKAN=1)
  • ^agc_driver_(prepared|registered), 28 tests, --repeat until-fail:3: 28/28 (a3c2759); the four agc_driver_prepared_shaders* variants pass again on ccbf4f2.
  • Validation: the same 28 tests on main e5f2355 and on this branch, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest -R "^agc_driver_(prepared|registered)" -V: 28/28 on both. Neither log has the "was not found but was requested" line. Both logs have the same 14 VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 errors, all in agc_driver_prepared_exports, so this branch adds no new validation errors.
  • New UnprovenProgramsAtSubmit (in agc_driver_prepared_shaders): a slow (1500 ms) queued preparation, then a real sceAgcDriverSubmitDcb:
submission Submit waited
low register only (SET_SH_REG) waits (preparation done on return)
high register only waits (preparation done on return)
low register only inside an INDIRECT_BUFFER target waits (preparation done on return)
submission ending in a REWIND (tail not scanned) waits (preparation done on return)
whole pair (control) returns before the preparation is done

The rows prove the early return or the wait by whether the preparation had finished when Submit returned, not by a time bound. Scan-level rows cover an invalid indirect list, a draw or dispatch with no pair written before it in the submission (a bind by an earlier submission and none now), a predicated pair, a pair inside a COND_EXEC range (not complete, no address resolved), and a pair after a COND_EXEC range that holds only another register (still complete). The invalid-list fallback is tested at scan level only: through Submit, the queue worker throws on such a list ("indirect register sentinel semantics are not implemented"), so it never reaches the wait.

  • Negative controls: with the half-pair fallback disabled (if (false && !scan.complete)) the test fails at the first row ("a submission writing half of a program address did not wait for the queued preparations"); with the REWIND fallback removed it fails with "a submission ending in a REWIND did not wait ..."; with the draw/dispatch check disabled it fails with "a dispatch that binds no program in its submission was reported as fully scanned"; without the predication check it fails with "a predicated program pair was reported as fully scanned", and without the COND_EXEC check with "a program pair inside a conditional execution range was reported as fully scanned". In that state the program would be waited for at first use in the queue worker, for the whole remaining preparation (1500 ms here; 74 s for the cold shader above).
  • AwaitedRegistrationPreparation (main's ticket-rule test) is kept.
  • Full ctest on 08fe590 (rebased on main bb04a4f): 3028/3029; guest_freebsd_clocks aborts with 0xc0000409 as in Tests: guest_freebsd_clocks aborts where the host zone is not UTC #12736 (host zone not UTC), a libkernel test this branch does not touch.
  • Full ctest on ccbf4f2: 2304/2306. agc_host_import_cut_lifetime and agc_driver_depth_plane_partial_store fail; both fail the same way on plain main e5f2355 on this machine.
Ghost of Yōtei, this revision, cold: total submit wait 182 s → 7 s, first wait 49–52 s → 1 s

Windows, RTX 4090, driver 617.42. Both builds have a fully cold recompiler cache and a drained NVIDIA pipeline cache, a fresh profile, and the same environment. Each run is 900 s. A is main e5f2355 (run499, and run501 as a rerun for the trace). B is this branch, 4703b22 (run500). Both builds carry the same local log line for submit waits of 100 ms or more; it is not part of this PR. On plain main the intro stays dark for the whole 900 s in all three runs, with or without this PR, so first-lit-frame times are missing.

A (main) B (this PR)
submit waits ≥ 100 ms 20 (22) 5
waits > 1 s 12 (12) 2
first wait 49.3 s (51.9 s) 0.96 s
longest wait 49.3 s (51.9 s) 3.2 s
total submit wait 182 s (182 s) 7 s
time to frame 1 / 10 / 200 101 / 121 / 141 s 60 / 80 / 101 s
time to frame 300 402 s 342 s
time to frame 330 422 s 563 s

Frame 330 is later in B because a 116 s compute compile stall (shader 0x8000196500, the same in both builds) falls earlier there; this PR does not change compile times.

Trace digest, frames 100–200, queue worker (the hottest thread), inclusive ms per frame, A (run501) / B (run500). The window covers 277 s in A and 258 s in B.

phase A B
Driver.Packet 888 1128
dispatch 502 652
Vulkan.ComputePipeline 443 573
memory_wait 256 312
WorkerWait 495 161

The worker waits a third as long for preparations. That time now goes to compiling pipelines that are no longer held back behind the submit wait, so per-frame work in the window is higher, not lower.

Summary lines of the two traces above (aps5-summary.jsonl, frames 100–200)

main e5f2355 (run501), then this branch 4703b22 (run500). Both are marked dirty because both builds carry the local submit-wait log line described above. 4703b22 is the measured revision; the head since adds only the fix for a pending preparation with no pool task (761ef11), and was not remeasured. The traces are kept locally and can be shared on request. The title field is written as Y\u014dtei here; the summary writer had stored it double-encoded (\u00c5\u008d), which GitHub does not keep intact.

{"commit":"e5f23554c9c7","dirty":true,"env":{"APS5_GPU_CHECKPOINTS":"1","APS5_HOST_IMPORT_MIB":"16384","APS5_NO_PIPELINE_JOURNAL":"1","APS5_NO_RESULT_MEMO":"1","APS5_NO_SNAPSHOT_CHECK":"1","APS5_PIPELINE_DISPATCH":"1","APS5_PREBUILD_THREADS":"2","APS5_PREPARED_SPIRV_MIB":"6144","APS5_PROFILE_DRAW":"1","APS5_RESOURCE_CACHE_ENTRIES":"1024","APS5_SPANNED_WAVE":"1","APS5_STAGING_POOL_MIB":"2048","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_FRAMES":"100:200"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 617.42","os":"Windows 10.0.26200","cpu":"13th Gen Intel(R) Core(TM) i9-13900K","cpu_threads":32,"memory_mib":32476,"title_id":"PPSA26344","title":"Ghost of Y\u014dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"frames 100:200","first_present":100,"ms":277022.035},"presents":200,"frame_ms":{"p50":128.075,"p90":1197.832,"p99":41793.606,"max":90343.336},"gpu_busy_ms_per_present":78.271,"worker_busy_pct":{"queue worker 0x0":64.237,"queue worker 0x52":3.601,"queue worker 0x53":0.792,"queue worker 0x20":16.643,"queue worker 0x30":32.427,"queue worker 0x38":25.118,"queue worker 0x48":8.323},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":5975.056,"Driver.Packet":2091.511,"Driver.Packet.dispatch":1004.043,"Driver.Dispatch":979.062,"Driver.Packet.memory_wait":912.059,"Vulkan.ComputePipeline":824.439,"Vulkan.GraphicsPipeline":98.891,"Graphics.Draw":76.754},"trace_dropped":true,"trace_dropped_threads":{"title":{"events_full_after_s":69.232,"events_lost":19632,"totals_full":false}},"trace":"aps5-trace-e5f23554c9c7-39372.json.gz"}
{"commit":"4703b22bde3c","dirty":true,"env":{"APS5_GPU_CHECKPOINTS":"1","APS5_HOST_IMPORT_MIB":"16384","APS5_NO_PIPELINE_JOURNAL":"1","APS5_NO_RESULT_MEMO":"1","APS5_NO_SNAPSHOT_CHECK":"1","APS5_PIPELINE_DISPATCH":"1","APS5_PREBUILD_THREADS":"2","APS5_PREPARED_SPIRV_MIB":"6144","APS5_PROFILE_DRAW":"1","APS5_RESOURCE_CACHE_ENTRIES":"1024","APS5_SPANNED_WAVE":"1","APS5_STAGING_POOL_MIB":"2048","APS5_TRACE_EVENTS":"1048576","APS5_TRACE_FRAMES":"100:200"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 617.42","os":"Windows 10.0.26200","cpu":"13th Gen Intel(R) Core(TM) i9-13900K","cpu_threads":32,"memory_mib":32476,"title_id":"PPSA26344","title":"Ghost of Y\u014dtei","content_version":"01.008.000","resolution":"3840x2160","window":{"spec":"frames 100:200","first_present":100,"ms":258171.356},"presents":200,"frame_ms":{"p50":147.813,"p90":899.185,"p99":42781.232,"max":92980.382},"gpu_busy_ms_per_present":86.150,"worker_busy_pct":{"queue worker 0x0":87.494,"queue worker 0x20":26.181,"queue worker 0x52":3.969,"queue worker 0x53":0.884,"queue worker 0x30":44.612,"queue worker 0x38":38.061,"queue worker 0x48":13.947},"top_phases_ms_per_frame":{"Shader.PrepareArtifact":6685.836,"Driver.Packet":2774.642,"Driver.Packet.dispatch":1299.561,"Driver.Dispatch":1272.832,"Driver.Packet.memory_wait":1259.496,"Vulkan.ComputePipeline":1071.626,"Vulkan.GraphicsPipeline":145.679,"Vulkan.GraphicsPipelineLibrary":113.949},"trace_dropped":true,"trace_dropped_threads":{"title":{"events_full_after_s":26.225,"events_lost":20046,"totals_full":false}},"trace":"aps5-trace-4703b22bde3c-13556.json.gz"}
Earlier measurements (before this revision)
  • Ghost of Yōtei (PPSA26344), Windows, RTX 4090, cold cache: first frame 101 s to 40 s; first submission wait 76.3 s to under 3 s; longest wait 2.6 s for 83 bound programs.
  • Dextroid17, Linux, lavapipe, cold cache: first frame 221 s to 171 s (2 runs each). RTX 3080 Ti, cold cache, 3 runs each: longest frame 132-134 s on main, 1.6 / 4.9 / 4.2 s with a port of this PR; longest queue-worker WorkerWait 1.5 / 2.7 / 2.0 s.
  • Warm cache pair, supplied by Dextroid17 (RTX 3080 Ti, Linux, 2 runs each): median frame 192 / 137 ms on main, 194 / 134 ms with the port; p90 357 / 362 vs 359 / 347 ms; presents 96 / 115 vs 114 / 121. No visible cost of ReferencedPrograms; it was not timed on its own.
  • parl0v, RTX 3060, Minecraft Dungeons II: neutral (6.61 / 6.61 FPS vs 6.70 / 6.60).
  • Not remeasured on this revision: how often titles write one register of a pair alone, which makes a submit wait for all preparations again.

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
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: PPSA26344 (Ghost of Yōtei) first-frame time
  • GPUs tested: NVIDIA GeForce RTX 4090, driver 617.42, Windows 11 (this revision's tests); RTX 4090, RTX 3080 Ti, RTX 3070, RTX 3060, lavapipe for the earlier revision (see the reports above)
  • AI-assisted: yes

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q9BMpf1muQhujJd4AbteUA

@MarcZX10

Copy link
Copy Markdown
Contributor

I traced the new scan against the driver paths: readRegisterLists keys each indirect list by packet offset, and draw/dispatch resolve the same program address encoding from the SH register pairs. The per-snapshot wait still prioritizes and settles a demanded registration; work not found by the scan falls back to the existing first-use wait in the queue worker. The regression exercises direct compute binding, indirect vertex binding, half-written addresses, bound-vs-unrelated preparation, and a submission behind unrelated work.

I did not find a concrete correctness issue in the diff. I attempted the focused Linux build locally, but GCC 12 stops earlier in unchanged SrtDescriptorEvaluation.cpp:183 (read.read->Flags<MemoryFlags>()), so I could not run agc_driver_prepared_shaders here. The platform CI jobs are currently skipped; I am not treating the reported Windows/Yōtei runs as my own validation.

@MarcZX10

Copy link
Copy Markdown
Contributor

One small regression-coverage gap: in ReferencedRegistrationPreparation, boundSnapshot->prepared is marked pending and then settled by SettleLater on a separate std::async thread. It does exercise the wait on a referenced snapshot while the unrelated pool task is pending, but it does not exercise the newly integrated path where the bound snapshot's own registration task is queued in RegistrationPreparePool and PrioritizeRegistrationPreparation moves that task ahead of unrelated queued work (the pool only receives the unrelated snapshot in this fixture).

Could the fixture queue the bound preparation through SubmitRegistrationPreparation(..., boundSnapshot->prepared.get()) as well, then verify that the bound task settles before a blocked/unrelated task completes? The separate queue-priority test is useful, but this would connect registry lookup, task identity, prioritization and the submission wait in one regression. I see this as coverage hardening rather than a code defect.

@github-actions

github-actions Bot commented Oct 16, 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 6973 docs/dev/debt/libSceAgcDriver.md L326
PR 7978 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp L473-474
PR 11346 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp L227

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 2434 docs/dev/debt/libSceAgcDriver.md
PR 5925 docs/dev/debt/libSceAgcDriver.md
PR 6186 docs/dev/debt/libSceAgcDriver.md
PR 6188 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 6194 docs/dev/debt/libSceAgcDriver.md
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 docs/dev/debt/libSceAgcDriver.md
PR 6412 docs/dev/debt/libSceAgcDriver.md
PR 6481 docs/dev/debt/libSceAgcDriver.md
PR 6548 docs/dev/debt/libSceAgcDriver.md
PR 6804 docs/dev/debt/libSceAgcDriver.md
PR 6808 docs/dev/debt/libSceAgcDriver.md
PR 6987 docs/dev/debt/libSceAgcDriver.md
PR 6989 docs/dev/debt/libSceAgcDriver.md
PR 6995 docs/dev/debt/libSceAgcDriver.md
PR 7002 docs/dev/debt/libSceAgcDriver.md
PR 7085 docs/dev/debt/libSceAgcDriver.md
PR 7256 docs/dev/debt/libSceAgcDriver.md
PR 7449 docs/dev/debt/libSceAgcDriver.md
PR 7604 docs/dev/debt/libSceAgcDriver.md
PR 7642 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7668 docs/dev/debt/libSceAgcDriver.md
PR 7682 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 8592 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
docs/dev/debt/libSceAgcDriver.md
PR 8707 docs/dev/debt/libSceAgcDriver.md
PR 9020 docs/dev/debt/libSceAgcDriver.md
PR 9318 docs/dev/debt/libSceAgcDriver.md
PR 9335 docs/dev/debt/libSceAgcDriver.md
PR 9356 docs/dev/debt/libSceAgcDriver.md
PR 9387 docs/dev/debt/libSceAgcDriver.md
PR 9592 docs/dev/debt/libSceAgcDriver.md
PR 9672 docs/dev/debt/libSceAgcDriver.md
PR 9673 docs/dev/debt/libSceAgcDriver.md
PR 9675 docs/dev/debt/libSceAgcDriver.md
PR 9700 docs/dev/debt/libSceAgcDriver.md
PR 9748 docs/dev/debt/libSceAgcDriver.md
PR 9895 docs/dev/debt/libSceAgcDriver.md
PR 9898 docs/dev/debt/libSceAgcDriver.md
PR 9915 docs/dev/debt/libSceAgcDriver.md
PR 9950 docs/dev/debt/libSceAgcDriver.md
PR 10049 docs/dev/debt/libSceAgcDriver.md
PR 10193 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
docs/dev/debt/libSceAgcDriver.md
PR 10233 docs/dev/debt/libSceAgcDriver.md
PR 10256 docs/dev/debt/libSceAgcDriver.md
PR 10359 docs/dev/debt/libSceAgcDriver.md
PR 10743 docs/dev/debt/libSceAgcDriver.md
PR 11436 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp
PR 11442 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
PR 11825 docs/dev/debt/libSceAgcDriver.md
PR 11998 docs/dev/debt/libSceAgcDriver.md
PR 12120 docs/dev/debt/libSceAgcDriver.md
PR 12565 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp
docs/dev/debt/libSceAgcDriver.md
PR 12567 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp
docs/dev/debt/libSceAgcDriver.md
PR 13599 docs/dev/debt/libSceAgcDriver.md
PR 13707 docs/dev/debt/libSceAgcDriver.md
PR 13863 docs/dev/debt/libSceAgcDriver.md
PR 13920 docs/dev/debt/libSceAgcDriver.md
PR 13928 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
docs/dev/debt/libSceAgcDriver.md
PR 13929 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Shaders/ShaderRegistry.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp
core/libs/prx/libSceAgcDriver/tests/execution/PreparedShaders.cpp
docs/dev/debt/libSceAgcDriver.md
PR 13963 docs/dev/debt/libSceAgcDriver.md
PR 13994 docs/dev/debt/libSceAgcDriver.md
PR 14005 docs/dev/debt/libSceAgcDriver.md
PR 14212 docs/dev/debt/libSceAgcDriver.md
PR 14302 docs/dev/debt/libSceAgcDriver.md
PR 14311 docs/dev/debt/libSceAgcDriver.md
PR 14344 docs/dev/debt/libSceAgcDriver.md
PR 14561 docs/dev/debt/libSceAgcDriver.md
PR 14621 docs/dev/debt/libSceAgcDriver.md
PR 14943 docs/dev/debt/libSceAgcDriver.md
PR 14944 docs/dev/debt/libSceAgcDriver.md
PR 14976 docs/dev/debt/libSceAgcDriver.md

@github-actions github-actions Bot added docs agc libSceAgc* labels Oct 16, 2026

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

A Linux run of the regression, which the description (Windows) and the review above (GCC 12 stopped before it) do not have.

Machine: NVIDIA GeForce RTX 3070, driver 595.99.02, Vulkan 1.4.329, plus lavapipe (Mesa 26.0.3, LLVM 21.1.8) on the same machine. Ubuntu 26.04, i7-8700, GCC 15.2, Release, BUILD_TESTING=ON. Head 20cc5ae56 merged into main 452494439 (clean merge). The build of PreparedShaders.cpp and the changed driver sources goes through on GCC 15.2.

  • agc_driver_prepared_shaders: 3/3 pass on the RTX 3070 (Selected GPU name=NVIDIA GeForce RTX 3070) and 3/3 on lavapipe, about 3.4 to 3.9 s per run (1.1 s on main with main's test).
  • ^agc_driver_(prepared|registered), 18 tests, -j1: 18/18 on both devices, no skips.
  • No negative control: with main's Submission.* and ShaderRegistry.* the new test does not compile (ReferencedPrograms is not a member of AgcDriver::DriverDetail).

This does not address the coverage gap raised above (the bound snapshot's own task queued in RegistrationPreparePool); I did not try that variant.

Not run: Windows, AMD, the full suite, any title.

GPUs tested: NVIDIA GeForce RTX 3070 (595.99.02), lavapipe (Mesa 26.0.3, LLVM 21.1.8), Ubuntu 26.04

Written with AI assistance (Claude Code). I ran the builds and tests above on my machine.

@Pipodi

Pipodi commented Oct 16, 2026

Copy link
Copy Markdown
Contributor Author

Thanks, good catch. 7241b05 now queues the bound preparation through SubmitRegistrationPreparation as well. The test occupies every preparation worker, queues the unrelated preparation ahead of the bound one, and frees a single worker once the submit wait has demanded the bound one. The bound task must run first and the unrelated one must still be pending when the wait returns. With the PrioritizeRegistrationPreparation call removed from AwaitReferencedPreparations, the test fails ("the queued preparation of a bound program was not moved ahead of unrelated queued work").

@Dextroid17

Copy link
Copy Markdown
Contributor

Timed this on Ghost of Yōtei (PPSA26344) on Linux with lavapipe, cold shader cache on every run, base and PR runs interleaved:

run  build   first frame
1    base    231 s
2    PR      181 s
3    base    211 s
4    PR      161 s

Base averages 221 s and the PR 171 s (2 runs each), so the first frame came about 50 s (23%) earlier. The ranges do not overlap (base 211–231 s, PR 161–181 s). The time comes from a memory probe that logs every 10 s, so each value can be up to 10 s after the actual first frame.

Setup: both builds are main 5d9dcc4 plus the same 11 local commits that are not in main. These are the sceNetCtlGetInfo code 12 fix (the same fix as #6227), sRGB and min/max texture copies this title needs to get past three early stops, two shader-cache checks, and the env-gated memory probe used for the timing. The PR build adds 20cc5ae and 7241b05, which cherry-picked cleanly. The two trees differ only by those two commits, and libSceAgcDriver.prx is the only library built from the files they change. -O2 build (CMAKE_BUILD_TYPE empty), lavapipe from Mesa 26.2.4 (LLVM 23.1.1), same game files, same host.

For comparison, your Windows runs had the first frame at 40 s with this PR against 101 s on main (61 s), and main ranged 80–181 s across your three runs. A 50 s gain here is in the same range. I did not measure the submit waits themselves.

AI-assisted: yes

@parl0v

parl0v commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Data point: RTX 3060 12 GB (NVIDIA 617.42), i5-12400F, Windows 10 19045, MinGW GCC Release. Minecraft Dungeons II (PPSA16064 01.100.100), title screen, no input, 200 s rows, APS5_PROFILE_DRAW=1 APS5_PROFILE_GPU=1; main 93e54ce vs main + this PR, interleaved with three other PRs in one batch, two rounds. FPS is the mean of the last 10 [present] windows, GPU busy and idle gaps per frame over the last 8.

libs FPS GPU busy idle gaps
main 6.61 / 6.61 104 / 105 ms 46 / 46 ms
+ this PR (7241b05) 6.70 / 6.60 106 / 104 ms 44 / 47 ms

Neutral on this scene (mean +0.7 %, within the row spread); no regression. 0 fatal.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added the fix error Closes an issue (Fixes #N) label Oct 17, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 17, 2026
@github-actions github-actions Bot added perf Performance change perf numbers missing perf pull request without a before and after summary line unblocks title Names a title ID on the Unblocks line labels Oct 18, 2026
@adriadam10 adriadam10 self-assigned this Oct 19, 2026
@MarcZX10

Copy link
Copy Markdown
Contributor

I have an independent follow-up in progress for #8470: at shutdown, finish the running library prebuild but discard queued speculative prebuilds, leaving registration preparation and device-replacement waits unchanged. The candidate touches RegistrationPreparePool::Close and the ticket/wait bookkeeping that this PR also refactors, so the current-main branch may need a rebase/adaptation if #6867 lands first. I have not opened or pushed a PR; the candidate still needs a runtime test. Please let me know if you prefer a particular merge order or want me to wait for this pool refactor before preparing the follow-up.

@CnRJay CnRJay left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The result is large and measured (Ghost of Yotei, cold cache, first frame 101 s to 40 s, first submission wait 76.3 s to under 3 s), and moving a bound program's preparation to the front of the queue (#4404) is the right use of the scan. The part I would not merge as is is the fallback.

  • #5007 made Driver::Submit wait for every queued preparation for one reason: a title that sees a submission take seconds treats the GPU as hung. Goat Simulator 3 (PPSA04159) failed a 10 s timeout when the wait sat in the queue worker. Waiting "in the queue worker at first use" is what this PR leaves for any program the scan misses: bound by an earlier submission, a half-written address, an address reached another way, or an indirect buffer the scan didn't follow. Those cases reproduce the Goat Simulator situation (the GPU side of a submission blocked on a long preparation), and the PR does not say how long such a wait can be. The cold-cache 55,144-dword shader this was found on took 74 s on one thread. If a program the scan misses is bound by a draw, the queue worker blocks for that long.
  • Please add a test where the program is reachable only through a path the scan doesn't see (address written in two halves across submissions; address in an indirect buffer), with a slow preparation, and state the resulting wait. If it is long, the scan needs the missing paths, or the fallback needs a bound (after N seconds, report and continue).
  • The 2.6 s longest wait for 83 bound programs is still a seconds-long submit. It is under the 10 s limit that failed, but the margin is a property of this title on a 4090; a slower machine's cold cache would be longer. State the worst wait by machine, or the time the scan assumes.
  • The numbers are from a tree with #6227 and two local diagnostics. The runs are cold-cache only. Post a warm-cache pair as well to show the scan costs nothing when preparations are already done (ReferencedPrograms walks every copied command on every submit).
  • Marked conflicting with main; rebase before it can be tested again.

@Dextroid17

Copy link
Copy Markdown
Contributor

Follow-up to my lavapipe timings above, now on an NVIDIA GPU, with the warm-cache pair @CnRJay asked for.

Ghost of Yōtei (PPSA26344), RTX 3080 Ti (driver 615.78.08), Linux. The base build is main 2b3baac with no local commits. The PR build is that plus one local commit, a port of 20cc5ae (details below). The launch scripts are identical apart from the build tree, and both use the same game files. Each run was traced with APS5_TRACE_SECONDS=20:30. The numbers come from that trace window's summary.

Cold shader cache (deleted before every run), 3 runs each:

build        longest frame             presents in window   longest queue-worker WorkerWait
main         133.8 / 132.1 / 132.1 s   49 / 55 / 56         131.6-133.7 s (5 workers, every run)
main + PR      1.6 /   4.9 /   4.2 s   109 / 132 / 123      1.5 / 2.7 / 2.0 s

On main, every cold run hits one stall of about 132 s. That stall is the interval that closes the trace window, so the window stretches to about 141 s, and all of main's presents fall in its first ~9 s. During the stall, five queue workers sit in WorkerWait the whole time. That is consistent with #6846. With the PR, no run has such a stall inside the window. Presents continue through the window, and the largest gap between them is 1.6, 1.8 and 1.9 s (the 4.9 and 4.2 s figures are the interval that closes the window). Shader compilation still runs in the background past the window, and I did not trace that later stretch.

Warm shader cache (each build reusing its own cache from its previous run), 2 runs each:

build        longest frame   median frame       p90 frame          presents
main         6.1 / 3.6 s     192 / 137 ms       357 / 362 ms       96 / 115
main + PR    3.2 / 3.6 s     194 / 134 ms       359 / 347 ms       114 / 121

With a warm cache, the PR's median, p90 and present count are no worse than main's two runs. I did not time ReferencedPrograms on its own, so this rules out a visible cost, not a small one.

What this does not answer from the review:

  • Worst submit wait by machine. The trace has no span around the Driver::Submit wait, so I have no direct measure of it. The queue-worker WorkerWait figures above are the workers' idle time, not the submit wait.
  • The scan-miss fallback. From the code, a program the scan misses is not waited for at Driver::Submit. Its wait happens later, through the existing per-program AwaitRegisteredPreparation when it is first used, and that wait has no bound. None of these runs go down a path the scan doesn't see, so they don't show how long that wait can be.

How the PR was applied: 20cc5ae does not cherry-pick cleanly onto 2b3baac. It conflicts in ShaderRegistry.cpp (the preparation pool changed on main), PreparedShaders.cpp and docs/dev/debt/libSceAgcDriver.md. In the port, AwaitReferencedPreparations and the Submission.cpp/.hpp changes are identical to the PR's. The difference is the pool. The port moves a bound program to the front of the queue with main's existing PrioritizeRegistrationPreparation, and keeps AwaitRegistrationPreparation and its sequence tracking (no longer called from Submit). I left out 7241b05 (the test). 2b3baac is 258 commits behind main today, and all three files still conflict against main 11e8ad2.

Caveats:

  • The base runs were made before a kernel update (7.3.0-2-cachyos) and the PR runs after it (7.3.0-4-cachyos), on the same machine and the same driver. The cold difference is far too large to come from that, but the warm comparison spans the change.
  • In 2 of the 3 PR cold runs and in all four warm runs, the title thread's trace buffer filled up and dropped events. Presents are recorded on a different thread, so the frame numbers are complete.
  • No run exited on its own. Each was stopped by a 600 s timeout. The 3 main cold runs stopped cleanly (exit 124). The 3 PR cold runs and all four warm runs (both builds) were force-killed 30 s later at teardown (exit 137), so the hard kill is not specific to the PR.

AI-assisted: yes

TheBlenDed pushed a commit to TheBlenDed/AnyPS5 that referenced this pull request Oct 25, 2026
…st from raw code

0x8000083400 (Pipodi's 74 s structurizer front end in boykopovar#6867) has no capture:
only its raw guest code (shader_samples/main-8000083400.bin) and its
registration environment (sweep/programs/32ac8b907b12797b.env) exist.
--make-request <target.req> <shader.bin> <shader.env> <address> <out.req>
writes a standalone compute request from them with a captured request's
target, the same reconstruction as the earlier --prepare-pair-raw
(4fa3b17e1): header omitted, user data zero. The result replays through
every existing mode (--prepare-only, --spv, --materialize).
@Pipodi
Pipodi force-pushed the perf/referenced-preparation-wait branch from 7241b05 to d5bcd0c Compare October 25, 2026 13:25
@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.

… submission binds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Pipodi
Pipodi force-pushed the perf/referenced-preparation-wait branch from 08fe590 to 447087a Compare November 1, 2026 13:34
@github-actions github-actions Bot added review queue Next in the maintainer review queue: checks pass, no open change request, no conflict and removed needs rebase Conflicts with main, rebase needed labels Nov 1, 2026
@ntamas94

ntamas94 commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

@Pipodi A gap in the register list at head 447087a, found while reading the PR for a PS4 GCN title (Crysis Remastered, CUSA18659).

ReferencedPrograms (Execution/src/Driver/Queues/Submission.cpp:230) scans these program registers:

constexpr std::array<std::uint32_t, 6> programRegisters{0x008u, 0x088u, 0x0c8u, 0x108u, 0x148u, 0x20cu};

0x048, the VS program pair, is not in the list. BoundGraphicsPrograms in the same file (:384) has it, and so does DrawRegisterKey.cpp ({0x008u, 0x048u, 0x088u, 0x0c8u, 0x108u, 0x148u}).

Effect: a submission whose draws bind a VS pair together with a PS pair (the usual shape on GCN) sets a graphics pair through 0x008. The draw check at :259 then passes, scan.complete stays true, and scan.addresses holds only the PS program. AwaitReferencedPreparations waits for that one. The VS program's preparation is not awaited at submit, so a draw that uses it waits in the queue worker instead, which is the stall the submit-time wait is there to avoid. A submission that binds only a VS pair still falls back to the full wait, because no scanned graphics pair is bound.

Adding 0x048u to the list (and growing the array to 7) should close it. The bound.end() - 1 test at :259 still excludes the compute pair, as long as 0x20cu stays last.

I have not run the branch; this is from reading the code. The rest of the scan (the indirect register lists, the REWIND fallback) looked consistent to me.

AI-assisted: yes

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 447087a merged onto main f2d874c · tested 2026-11-02 00:54 UTC · 22 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,444 passed · 7 failed (0 new, 4 also fail on main, 3 unstable on main) · 46 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,497 of 3,168 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 (936 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_flat_store 35.7 s, ⚠️ agc_driver_graphics_maps_fallback 30.9 s, ⚠️ agc_driver_graphics 30.6 s, ⚠️ agc_driver_recorder 30.1 s
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress: failed in 5 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 7 of the last 10 main runs
Failing on main too (4, not counted against this PR)
agc_driver_dcc_keys_first_write
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (1, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_recorder: Timeout in the parallel run
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 (46)
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_pipeline_binary_vulkan: skipped, the device lacks VK_KHR_pipeline_binary
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
Reproduce
git fetch origin 447087a4f31d123531360ead695c655d55d05e98 f2d874c1fdccf781c0fa5d86619bb5dd8894b958
git checkout f2d874c1fdccf781c0fa5d86619bb5dd8894b958 && git merge --no-ff 447087a4f31d123531360ead695c655d55d05e98
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.

@JJenkx

JJenkx commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

I reproduced @ntamas94's missing 0x048u classic vertex-program pair on the unchanged head 447087a4f31d123531360ead695c655d55d05e98 and prepared a minimal follow-up you can cherry-pick:

ccb8e15fa76 — include classic vertex programs in preparation scans. This commit is directly on your PR head, changes the scan's array from six pairs to seven, and keeps 0x20cu last. It adds four assertions for mixed PS/VS bindings, VS alone, an incomplete VS pair alongside a complete PS pair, and an indirect register list containing both programs.

Regression control: the identical frozen test executable (44891cf84495fe7578b30467d700a3e787bc0d3f52e41438ebf639f4bab30881) fails against the original PR library with a pixel and classic vertex program pair did not both reach the submit preparation wait. It passes with the one-line production fix. This covers the case where a complete PS pair otherwise hides the missing or incomplete VS pair.

Linux gates: the AGC code from main d2ce337078f8, your original PR integrated onto that baseline, and the fixed integration each pass all 23 agc_driver_prepared_shaders* tests, zero skips. Each run requests required Vulkan and disables the shader cache; loader logs confirm the actual Khronos validation layer was inserted. All three logs have 0 VUID lines and 0 missing-layer errors. The default test includes the added assertions in the fixed build. A separate same-executable negative/positive run establishes the regression above.

I also replayed one private Severed Steel post-movie frame with the fixed integration: both display-buffer references match pixel-for-pixel, maximum channel difference 0, zero unfinished submissions and zero synthesized waits, with validation mapped and 0 VUIDs. This is a rendering-correctness check on the recorded workload; a cold-cache title comparison remains necessary for a title speed claim.

Patch, synthetic GPU-test logs, JUnit, hashes and numeric replay receipt — SHA-256 99c099c47657aba5f1a56aad6751f5aa668b29a58c7e490207c4f091caed134d. The archive excludes title binaries, shaders, saves, captured memory and raw title/replay logs.

GPU: AMD Radeon RX 6650 XT (RADV NAVI23), Mesa vulkan-radeon 26.2.6-1, Arch Linux 7.2.11-arch1-1. The matched baseline has unrelated call-trace/AvPlayer diagnostics outside AGC; those are excluded from the public follow-up commit. No competing PR opened. AI-assisted: yes.

@JJenkx

JJenkx commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Native cold-start pilot for PPSA05106, Severed Steel 01.000.000, following the classic-VS follow-up above. The candidate is this PR at 447087a4f31d plus ccb8e15fa76, integrated on the same AGC baseline as main d2ce337078f8.

With identical saves/settings, no injected inputs, empty private shader/Mesa cache directories and Mesa disk caching disabled, the first reviewed Campaign-menu screenshots were:

Run First matching menu capture (10 s sampling)
AGC baseline, initial run 160.2 s
PR + classic-VS fix 130.0 s
AGC baseline, repeat 170.3 s

All three runs closed normally with exit 0 and passed protected-input/SDK/generated-module, kernel-restoration and process-cleanup checks. Native stdout remained on a PTY. A two-second host sampler saw no compiler process samples; a stopped CMake process and brief Ninja appearances are documented in the receipt, so exclusive machine use is not claimed.

Completed main/change traces, summary lines, trace digests, menu images and pilot receipt, SHA-256 8e0e1344db4ff4211acad53f9994da3b90b650439c84e848a45433c19c3d0287.

The completed traces have the same seconds 0:180 window, environment, GPU, driver, OS, title and resolution, clean revision metadata and trace_dropped=false. The original baseline closed before its trace window ended; that incomplete trace is excluded. The repeat extends the closing deadline so its trace can finish.

Coverage limit: the profiler starts at the first present. Its recording message was observed about 73–75 s into baseline startup and about 4 s into candidate startup. Earlier work is absent, so these traces cannot supply whole-startup shader-compilation time, and their aggregate FPS mixes loading and menu time. This is an earlier-menu observation in one candidate run, not a gameplay-FPS result. Baseline SDK 59cc98c68e09 and candidate SDK 3adcbfef84b2 share unrelated disabled call-trace/AvPlayer diagnostics outside AGC; that qualification and the capture bounds are in the receipt. Raw title logs, binaries, saves, shaders and guest memory are excluded. AI-assisted: yes.

@Pipodi

Pipodi commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

@ntamas94 thanks, confirmed: ReferencedPrograms was missing the 0x048 vertex-program pair that BoundGraphicsPrograms and DrawRegisterKey.cpp both have. A vertex pair on its own was safe (no other graphics pair, so the scan fell back to waiting for every queued preparation), but a pixel pair plus a vertex pair counted as complete without the vertex program's address, so submit did not wait for it.

@JJenkx thanks for the fix and the tests. I cherry-picked ccb8e15 unchanged, with you as the author, and thanks for the Severed Steel cold-start numbers (160.2 s -> 130.0 s to the Campaign menu).

New head 36fc8f9cc9: that commit plus a merge of main d1ae628bc2 (clean, no conflicts with the current head; the conflicts in the review on 11-01 were against the older 08fe590f67). Release build, full ctest: 3884/3888 on Windows (RTX 4090); the 4 failures are the same on plain main (two symlink-privilege tests, agc_driver_direct_write_completion, guest_filesystem 0xc0000409). All 23 agc_driver_prepared_shaders* tests pass, including the 4 new assertions.

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

Reviewed — approved

The merged tree builds, and all 24 agc_driver_prepared_shaders* tests pass with the Khronos validation layer. Three targeted negative controls each fail with the expected message, and the one new VUID in the script's comparison also appears with main's production files.

What I ran

Head 36fc8f9cc93098b621694564d4432fc9a3973c75, main 4f41f4c375f5abb487dbd184fbc150f31994d762, merged tree 2e2c8ac56814ee32fb9eab40be05cf8b4c32771d, in a clean worktree. Debian 13 VM, 2× Xeon Gold 6136 (32 vCPU), GCC 14.2.0, Release, lavapipe (Mesa 26.1.6, LLVM 19).

git diff --check 4f41f4c375f5abb487dbd184fbc150f31994d762...36fc8f9cc93098b621694564d4432fc9a3973c75
python3 tools/check_conventions.py --base 4f41f4c375f5abb487dbd184fbc150f31994d762
VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1 VK_LOADER_DEBUG=error,warn,layer \
  ctest --test-dir build -j8 --test-load 32 -V -R "agc_driver_prepared_shaders|agc_driver_native_depth_uniform_planes"
# main's four production files restored (Submission.hpp/.cpp, ShaderRegistry.hpp/.cpp):
ninja -C build -j32 -l32 libs agc_driver_native_multisample_depth_tests agc_driver_prepared_shaders_tests
VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ... ctest --test-dir build -V -R "^agc_driver_native_depth_uniform_planes$"
# partial controls on the merged Submission.cpp, each rebuilt and run as build/tests/agc_driver_prepared_shaders_tests
# finally the merged files restored, rebuilt, test rerun, git status --porcelain

Results

Check Result
git diff --check clean
check_conventions.py all checks passed
Configure / build / libs (script) ok
Script test run (2169 tests) no new failures, no timeouts; 7 known failures that also fail on main
agc_driver_prepared_shaders* (23) + agc_driver_native_depth_uniform_planes, with validation 24/24 pass; the layer loaded; agc_driver_prepared_shaders 9.3 s (longest of the four *_shaders variants: 10.1 s), all under 30 s
Waits measured by UnprovenProgramsAtSubmit on this machine low-only 1500 ms, high-only 1500–1505 ms, low-only through an INDIRECT_BUFFER 1500 ms, proven pair 0 ms
Script's validation comparison, new VUID in agc_driver_native_depth_uniform_planes not caused by this PR: the same 4 VUID-vkCmdDispatch-groupCountX-00386 errors appear with main's production files (the baseline run was on an older main, d1ae628bc2, where this test did not run)
VUID check with main's production files
ctest -R ^agc_driver_native_depth_uniform_planes$ -V   -> exit 0
Validation Error: [ VUID-vkCmdDispatch-groupCountX-00386 ]   x4 (same count as the merged tree)
Insert instance layer                                         x4

Negative control

When main's four production files are restored, the test does not compile ('ReferencedPrograms' is not a member of 'AgcDriver::DriverDetail'), as jotitadev already reported. So I changed single lines in the merged Submission.cpp instead, rebuilding and running the test after each change:

Change Result
0x048u removed from programRegisters (the classic-VS fix taken from JJenkx) fails: a pixel and classic vertex program pair did not both reach the submit preparation wait
Submit always waits for every queued preparation (main's behaviour) fails: a submission writing a whole program address waited for an unrelated preparation
!scan.complete fallback removed fails: a submission writing half of a program address did not wait for the queued preparations

Afterwards I restored the merged file and rebuilt. The test passes again, and git status --porcelain is empty. This confirms on Linux and lavapipe the controls jotitadev ran and the classic-VS regression JJenkx reported.

Findings

Blocking

None.

Non-blocking

  • The Yōtei traces are not attached. CONTRIBUTING asks a perf PR to attach its traces. The description has both summary lines and a digest table, but says the traces "are kept locally and can be shared on request". JJenkx's archive has a main/change trace pair, but it is for Severed Steel. Suggested fix: attach the two aps5-trace-*.json.gz files that the summary lines name.
  • The measured revision is older than the head. The Yōtei numbers come from 4703b22bde. Since then the branch gained the pool-ownership wait (761ef1105e) and the 0x048 vertex pair. The 0x048 fix makes submit wait for more programs. So the "3.2 s longest, 7 s total" figure in docs/dev/debt/libSceAgcDriver.md:333 may be too low for the current code. Suggested fix: re-measure, or say in the debt entry which revision the figure is from.
  • The Unblocks line has no discussion link. The line names PPSA26344 but not its Game bring-up discussion (Unblocks: PPSAxxxxx #N), which CONTRIBUTING asks for.

What I checked in the code without finding a problem:

  • AwaitReferencedPreparations (core/libs/prx/libSceAgcDriver/Execution/src/Driver/Shaders/ShaderRegistry.cpp:1919) uses the same upper_bound and code-range lookup as RegisteredProgram.
  • AwaitOwned (ShaderRegistry.cpp:1658) waits on the pool's unfinished sequences under the pool mutex. owned is cleaned up both when a worker finishes a task and when queued tasks are dropped. The pending check takes prepared.mutex and releases it before the pool lock, so the two locks are never held together.
  • ReferencedPrograms (core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp:229) builds the address the same way as BoundGraphicsPrograms, and its register list now matches BoundGraphicsPrograms plus 0x20c.

Not verified

  • Hardware GPUs: I ran only on lavapipe.
  • Any title, and the Yōtei and Severed Steel timings.
  • How long submit waits are under the current head on a real workload.
  • The full test suite: I ran only the tests this change reaches.

@github-actions github-actions Bot added review queue Next in the maintainer review queue: checks pass, no open change request, no conflict and removed review queue Next in the maintainer review queue: checks pass, no open change request, no conflict labels Nov 3, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 36fc8f9 merged onto main 1e65852 · tested 2026-11-03 22:02 UTC · 26 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,706 passed · 5 failed (0 new, 3 also fail on main, 2 unstable on main) · 48 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,759 of 3,818 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 (935 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 4 of the last 10 main runs
agc_driver_submit_progress: failed in 5 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 (4 IDs in 517 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (517 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 509 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_srgb8_color_target
Skipped (48)
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_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 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 co
Reproduce
git fetch origin 36fc8f9cc93098b621694564d4432fc9a3973c75 1e658521a0a599872612bb91949311e2956b5283
git checkout 1e658521a0a599872612bb91949311e2956b5283 && git merge --no-ff 36fc8f9cc93098b621694564d4432fc9a3973c75
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.

@savvaniss

Copy link
Copy Markdown
Contributor

AMD Windows run of this head (the RX 9070 XT run above was on 08fe590f67, before 2625d0acee and the main merge): the 41 focused tests pass with this PR merged into main, with the same VUID- errors as main.

  • Setup: Windows 11 Pro 26300, WinLibs GCC 15.2.0, Release, AMD Radeon RX 9070 XT (1002:7550), driver 32.0.31041.1004 (Adrenalin 26.8.1). Every run had ANYPS5_GPU=AMD, ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation and VK_LOADER_DEBUG=error,warn,layer, serial ctest -V. AMD's VkCache was moved aside before the first run.
  • Trees: main b11c7bf84f, and head 36fc8f9cc9 merged into it (clean, local only).
  • 34 of the 41 tests open a device. Every one is the RX 9070 XT (Selected GPU line), the loader inserts VK_LAYER_KHRONOS_validation into every instance, and no log has was not found but was requested by env var VK_INSTANCE_LAYERS.
3 runs each main b11c7bf84f this head merged
The 30 agc_driver_prepared* tests (the 23 agc_driver_prepared_shaders* among them), the 7 agc_preparation_inputs_*, agc_driver_preparation_scope_settle, agc_driver_submit_progress, agc_submit_progress, agc_submit_progress_no_timeline 41 of 41 pass 41 of 41 pass
VUID- IDs VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605, only in agc_driver_prepared_exports the same ID, in the same test, as many times in each run

Not run: Ghost of Yōtei or any other title, so no speed figure; negative controls; a -DANYPS5_ENABLE_SPIRV_TOOLS=ON build.

AI-assisted: yes (Claude Code)

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head 36fc8f9 merged onto main 5b1d381 · tested 2026-11-04 12:54 UTC · 18 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,755 passed · 8 failed (0 new, 7 also fail on main, 1 unstable on main) · 58 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,821 of 3,883 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 (973 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ public_headers 76.4 s, ⚠️ agc_driver_image_sample_unnormalized 33.5 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 (7, not counted against this PR)
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (8 IDs in 544 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (544 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 536 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 (2 tests): agc_driver_prepared_exports, 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 (58)
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_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_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 plat
Reproduce
git fetch origin 36fc8f9cc93098b621694564d4432fc9a3973c75 5b1d381d5ad5d9f923326b18479c3bd889cdd588
git checkout 5b1d381d5ad5d9f923326b18479c3bd889cdd588 && git merge --no-ff 36fc8f9cc93098b621694564d4432fc9a3973c75
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.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed review queue Next in the maintainer review queue: checks pass, no open change request, no conflict labels Nov 4, 2026
…ration-wait-1025

# Conflicts:
#	core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/Submission.cpp
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 5, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head b09aff2 merged onto main acac7c8 · tested 2026-11-05 03:25 UTC · 26 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,817 passed · 7 failed (0 new, 3 also fail on main, 4 unstable on main) · 55 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,879 of 3,960 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 (993 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_indirect_thread_dimensions 35.6 s, ⚠️ agc_driver_lazy_resolved_abi 33.8 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 2 of the last 10 main runs
agc_submit_progress: failed in 3 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 2 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 (9 IDs in 556 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (556 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 548 more
VUID-VkShaderModuleCreateInfo-pCode-08737 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08739 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08741 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 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 (2 tests): agc_driver_prepared_exports, 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
Skipped (55)
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_host_resolution_disabled: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_four_k: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_height_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_limit: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_malformed: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_width_only: 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
Reproduce
git fetch origin b09aff2b917f9d63334f8247bce8b93c014106cb acac7c854182a1674162f5e623aa25a6469985ae
git checkout acac7c854182a1674162f5e623aa25a6469985ae && git merge --no-ff b09aff2b917f9d63334f8247bce8b93c014106cb
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 b09aff2 merged onto main b611e63 · tested 2026-11-05 04:09 UTC · 38 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,754 passed · 6 failed (0 new, 6 also fail on main) · 109 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,869 of 3,946 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 (1040 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ public_headers 90.2 s, ⚠️ agc_driver_image_sample_unnormalized 42.1 s, ⚠️ agc_driver_lazy_resolved_abi 37.4 s, ⚠️ agc_shader_sampler_limits 33.9 s, ⚠️ check_skips 32.6 s
Failing on main too (6, not counted against this PR)
agc_driver_image_gather_volume
agc_driver_image_table
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_submit_progress
agc_submit_progress_no_timeline
Passed on retry (1, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
public_headers: Timeout in the parallel run; also passed only on retry in 22 other runs in the last 7 days
Validated but not compared (56, not in the main baseline's validation pass)
guest_job_manager_worker_spin_scale_0.1
guest_job_manager_worker_spin_scale_10
public_headers
public_headers_compile_1
public_headers_compile_11
public_headers_compile_13
public_headers_compile_15
public_headers_compile_17
public_headers_compile_19
public_headers_compile_21
public_headers_compile_22
public_headers_compile_23
public_headers_compile_24
public_headers_compile_25
public_headers_compile_26
public_headers_compile_27
public_headers_compile_28
public_headers_compile_29
public_headers_compile_3
public_headers_compile_30
public_headers_compile_31
public_headers_compile_32
public_headers_compile_33
public_headers_compile_34
public_headers_compile_35
public_headers_compile_36
public_headers_compile_37
public_headers_compile_38
public_headers_compile_39
public_headers_compile_40
public_headers_compile_41
public_headers_compile_42
public_headers_compile_43
public_headers_compile_44
public_headers_compile_45
public_headers_compile_46
public_headers_compile_47
public_headers_compile_48
public_headers_compile_49
public_headers_compile_5
public_headers_compile_50
public_headers_compile_51
public_headers_compile_52
public_headers_compile_53
public_headers_compile_54
public_headers_compile_55
public_headers_compile_56
public_headers_compile_57
public_headers_compile_58
public_headers_compile_59
public_headers_compile_60
public_headers_compile_61
public_headers_compile_62
public_headers_compile_63
public_headers_compile_7
public_headers_compile_9
Validation IDs already present on main (4 IDs in 547 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (547 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 539 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_prepared_exports
Skipped (109)
usage: check_skips.py [-h] [--job {linux,windows}] [--list] [--require-tests]
                      junit
check_skips.py: error: /home/ben/anyps5-gpu-ci/data/runs/pr-6867/b09aff2b917f-b611e634f7fc/ctest.xml: testcase 'public_headers_compile_1' is notrun and was not run
Reproduce
git fetch origin b09aff2b917f9d63334f8247bce8b93c014106cb b611e634f7fc024f0c13e342d96de744448ef1d9
git checkout b611e634f7fc024f0c13e342d96de744448ef1d9 && git merge --no-ff b09aff2b917f9d63334f8247bce8b93c014106cb
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.

@github-actions github-actions Bot added the review queue Next in the maintainer review queue: checks pass, no open change request, no conflict label Nov 5, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 269da8f merged onto main 55064c8 · tested 2026-11-05 22:52 UTC · 33 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,898 passed · 5 failed (0 new, 3 also fail on main, 2 unstable on main) · 51 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,954 of 4,105 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 (976 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 1 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
Passed on retry (2, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_submit_progress: Failed in the parallel run; also passed only on retry in 26 other runs in the last 7 days
agc_submit_progress: Failed in the parallel run; also passed only on retry in 1 other runs in the last 7 days
Validation IDs already present on main (9 IDs in 592 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (592 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 584 more
VUID-VkShaderModuleCreateInfo-pCode-08737 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08739 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08741 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 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-VkPipelineShaderStageCreateInfo-module-parameter (1 test): agc_driver_float16_unused_nan_payloads
VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849 (1 test): agc_driver_float16_unused_nan_payloads
Skipped (51)
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_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_net_ctl_disconnected: 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_device_capability: 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_host_resolution_disabled: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_four_k: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_height_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_limit: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_malformed: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_width_only: 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
Reproduce
git fetch origin 269da8f6b9032bb666fe4eef0b52c8612ec1dd56 55064c81fb67060082e3e9f6f4262ba348d95a0a
git checkout 55064c81fb67060082e3e9f6f4262ba348d95a0a && git merge --no-ff 269da8f6b9032bb666fe4eef0b52c8612ec1dd56
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.

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* docs perf Performance change review queue Next in the maintainer review queue: checks pass, no open change request, no conflict unblocks title Names a title ID on the Unblocks line

Projects

None yet

Development

Successfully merging this pull request may close these issues.