Skip to content

feat(agc): replay full titles with repeated passes and the title's pipeline cache - #11435

Open
Sam-mon7 wants to merge 9 commits into
boykopovar:mainfrom
Sam-mon7:feat/frame-replay-full-titles
Open

Sam-mon7 wants to merge 9 commits into
boykopovar:mainfrom
Sam-mon7:feat/frame-replay-full-titles

Conversation

@Sam-mon7

@Sam-mon7 Sam-mon7 commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

What

Follow-up to #8740. Replaying captures of a full title (Demon's Souls) hit three problems the small test captures do not:

  • Repeated passes (--repeat <n>). The first pass compiles every shader and pipeline the frames use, so its frame times mostly measure compilation. With --repeat, before each later pass the replay waits for the driver to go idle, clears the captured ranges, restores the snapshot, registers the snapshot's video outputs again and re-makes the EOP flip reservations that were pending at the snapshot (a token still reserved from the previous pass is kept; any other reservation failure fails the replay). Frame times come from passes 2 to n. agc_driver_frame_replay now also replays its capture with --repeat 3 --diagnostics.
  • Drain timeout. The drain gave up after 10 s without a completion even while the driver was still compiling or preparing work, which reported unfinished submissions and left a process that could not exit. It now gives up only after ten minutes without a completion. A blocked wait on one queue does not mean the replay is stuck, since another queue can still be preparing the work that releases it.
  • Warm pipelines. A replay's device has no window, so it never loaded the title's Vulkan pipeline cache and recompiled every pipeline (minutes for the first Demon's Souls frames), and it replayed the pipeline journal in the background during the measured frames. APS5_HEADLESS_PIPELINE_CACHE makes a windowless device load the cache file; agc_frame_replay sets it unless --cold-pipelines is given, which also clears an inherited value. The driver exports AgcDriverWaitForPipelineJournal; the replay calls it after the registrations.

The JSON line and the progress and drain messages keep the fields they have on main. --diagnostics adds each pass (passes), the tokens kept from the previous pass (kept_reservations) and the journal wait (journal_s) to the JSON line, the waits the queues are blocked on to the progress messages and to the drain's give-up message, and a drain message every 10 s without a completion.

No rendering change outside the replay tool; the driver additions are the export and the headless cache switch.

Order with other pull requests

Tested

Windows 11 Pro 10.0.26200, WinLibs GCC 15.2.0, Release, NVIDIA GeForce RTX 4070 (driver 610.88), Vulkan SDK 1.4.363 validation layer. Synced with main 0d5e03be8c (merge c10ff3e4cb).

  • ctest -R '^agc_(frame_capture|driver_frame_capture_eop|driver_frame_replay)' -V -j2 with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation:
    • main 0d5e03be8c: 11/11 pass, 0 VUID- lines.
    • this head 20ccbe17c8: 15/15 pass, including the new tests, 0 VUID- lines in the ctest output and in the six replay subprocess logs. No missing-layer message.
    • The layer was loaded: with its log file setting, the replay's vkCreateInstance wrote the layer's "Current Validation Enabled" message, and seven test logs show Selected GPU name=NVIDIA GeForce RTX 4070. On main these tests create no Vulkan instance, so a validation ID can only show up on the PR side. The NVIDIA report's VUID-VkDeviceCreateInfo-pNext-pNext in agc_driver_frame_replay_concurrent comes from validation layer 1.3.275 not knowing the Maintenance8 structure that main already chains (attributed in jotitadev's review); it does not appear with 1.4.341 or 1.4.363.
  • Final composition: feat(agc): list a capture's shaders and submissions and trace replay serials #11436's head a110d7694a (which contains this head) with fix(agc): shut the driver down before frame replay exits with an error #14100 659a6eecb4 merged in locally: 18/18 pass, 0 VUID- lines; reservation_error reports the incompatible reservation and exits.
  • Earlier heads, same command: Linux, Ubuntu 26.04 under WSL2, Mesa llvmpipe, this PR merged into main 2227f13661: 17/17. Native Linux by reviewers: RX 7900 GRE, RADV, 20/20 on feat(agc): list a capture's shaders and submissions and trace replay serials #11436 210bd86b58 (janzezno); RX 6650 XT, RADV, 17/17 on 68c782957f, plus a Bugsnax capture that replays to completion with byte-identical display buffers where main exits with an unfinished submission (JJenkx).
  • Demon's Souls (PPSA01341): before the rebases onto current main, these changes let a 6-frame Nexus capture replay completely (6/6 frames, 0 unfinished submissions; about 6.5 s per warm frame), where the replay previously looked stuck at an early serial while it recompiled every pipeline.
  • tools/check_conventions.py, tools/check_main_sync.py and git diff --check pass against main 0d5e03be8c.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: fix(agc): shut the driver down before frame replay exits with an error #14100
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 4070, driver 610.88, Windows 11 Pro 10.0.26200
  • AI-assisted: yes (Claude Code)

🤖 Generated with Claude Code

@MarcZX10

Copy link
Copy Markdown
Contributor

I see this branch and its reported Vulkan before/after runs are based on 7b415520b6; current main is 035ac96edd (9 commits ahead). The intervening commits change AGC driver/CMake paths, so the required same-machine, same-GPU focused comparison should be rerun on current main and the updated PR head. Please sync this base before review.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1395 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 1835 docs/dev/BUILD.md
PR 1896 docs/dev/ENVIRONMENT.md
PR 2434 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4040 core/libs/prx/libSceAgcDriver/Execution/src/Driver/EntryPoints.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4448 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 4472 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 4847 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 5021 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/BUILD.md
PR 5609 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 5925 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6146 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6186 docs/dev/ENVIRONMENT.md
PR 6188 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6290 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6782 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6804 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 6924 docs/dev/ENVIRONMENT.md
PR 6926 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
PR 7002 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7275 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7369 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 7457 docs/dev/ENVIRONMENT.md
PR 7464 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7514 docs/dev/ENVIRONMENT.md
PR 7604 docs/dev/ENVIRONMENT.md
PR 7622 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 7642 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 7643 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 8004 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 8212 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 8246 docs/dev/ENVIRONMENT.md
PR 8484 docs/dev/ENVIRONMENT.md
PR 9012 docs/dev/ENVIRONMENT.md
PR 9248 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
docs/dev/ENVIRONMENT.md
PR 9289 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 9335 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 9345 docs/dev/ENVIRONMENT.md
PR 9356 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 9387 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 9508 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 9676 docs/dev/ENVIRONMENT.md
PR 9712 docs/dev/ENVIRONMENT.md
PR 9776 docs/dev/BUILD.md
PR 9852 docs/dev/ENVIRONMENT.md
PR 9875 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 10043 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 10193 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 10351 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10359 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 10442 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 10443 docs/dev/ENVIRONMENT.md
PR 10652 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10678 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 10757 docs/dev/ENVIRONMENT.md
PR 10867 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 10894 docs/dev/ENVIRONMENT.md
PR 11346 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 11483 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12172 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 12324 docs/dev/ENVIRONMENT.md
PR 12544 docs/dev/ENVIRONMENT.md
PR 12565 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/EntryPoints.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
docs/dev/BUILD.md
PR 12745 docs/dev/ENVIRONMENT.md
PR 12746 docs/dev/ENVIRONMENT.md
PR 12828 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12840 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 12848 docs/dev/ENVIRONMENT.md
PR 12849 docs/dev/ENVIRONMENT.md
PR 12855 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12863 docs/dev/ENVIRONMENT.md
PR 12895 docs/dev/ENVIRONMENT.md
PR 12904 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12930 docs/dev/ENVIRONMENT.md
PR 12944 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 12970 docs/dev/ENVIRONMENT.md
PR 13148 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 13263 docs/dev/ENVIRONMENT.md
PR 13486 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 13707 docs/dev/ENVIRONMENT.md
PR 13793 docs/dev/ENVIRONMENT.md
PR 13809 docs/dev/ENVIRONMENT.md
PR 13863 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 13920 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 13928 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 13929 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 13984 core/libs/prx/libSceAgcDriver/Execution/include/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/EntryPoints.cpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Presentation.cpp
core/libs/prx/libSceAgcDriver/tests/FrameReplayState.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake
core/libs/prx/libSceAgcDriver/tools/FrameReplay.cpp
docs/dev/BUILD.md
PR 14051 docs/dev/ENVIRONMENT.md
PR 14076 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14137 core/libs/prx/libSceAgcDriver/tests/FrameReplayState.cpp
core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake
core/libs/prx/libSceAgcDriver/tools/FrameReplay.cpp
docs/dev/BUILD.md
PR 14217 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14218 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14260 docs/dev/ENVIRONMENT.md
PR 14262 docs/dev/ENVIRONMENT.md
PR 14344 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 14367 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 14709 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 14794 docs/dev/ENVIRONMENT.md
PR 14871 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15015 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 15122 docs/dev/BUILD.md
PR 15169 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 15181 docs/dev/ENVIRONMENT.md
PR 15343 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15417 docs/dev/ENVIRONMENT.md
PR 15455 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 15456 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
core/libs/prx/libSceAgcDriver/Execution/src/Driver/Lifecycle.cpp
docs/dev/BUILD.md
docs/dev/ENVIRONMENT.md
PR 15520 docs/dev/ENVIRONMENT.md
PR 15529 docs/dev/ENVIRONMENT.md
PR 15548 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 15569 docs/dev/ENVIRONMENT.md
PR 15570 docs/dev/ENVIRONMENT.md
PR 15572 docs/dev/ENVIRONMENT.md
PR 15671 docs/dev/ENVIRONMENT.md
PR 15674 docs/dev/ENVIRONMENT.md
PR 15719 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/BUILD.md
docs/dev/ENVIRONMENT.md
PR 15738 docs/dev/ENVIRONMENT.md
PR 15845 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 15859 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 15917 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
docs/dev/ENVIRONMENT.md
PR 15918 docs/dev/ENVIRONMENT.md
PR 15919 docs/dev/ENVIRONMENT.md
PR 15950 docs/dev/BUILD.md
PR 15952 docs/dev/BUILD.md
PR 15974 docs/dev/ENVIRONMENT.md
PR 16013 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 16115 docs/dev/ENVIRONMENT.md
PR 16116 docs/dev/ENVIRONMENT.md
PR 16204 core/libs/prx/libSceAgcDriver/Execution/include/Driver/Driver.hpp
PR 16212 docs/dev/BUILD.md
PR 16217 docs/dev/ENVIRONMENT.md
PR 16252 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
PR 16286 docs/dev/ENVIRONMENT.md
PR 16294 docs/dev/ENVIRONMENT.md
PR 16371 docs/dev/ENVIRONMENT.md
PR 16372 docs/dev/ENVIRONMENT.md
PR 16427 docs/dev/ENVIRONMENT.md
PR 16474 core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp

@janzezno

Copy link
Copy Markdown
Contributor

@Sam-mon7 pr_overlap reports a conflict between this PR (and #11436 on top of it) and #11157, which ports frame capture and replay to Linux. It's in tests/FrameReplay.cpp, at the std::system call of the capture-and-replay case.

#11157 registers agc_driver_frame_replay on Linux. sh reads the extra outer pair of quotes that cmd.exe needs as part of the program name, so #11157 adds that pair on Windows only:

auto command = "\"" + tool.string() + "\" \"" + capture.string() + "\" ...";
#ifdef _WIN32
    command = "\"" + command + "\"";
#endif

Your replay lambda keeps the outer quotes unconditionally. So once both are in, the Linux test would fail unless the lambda gets the same #ifdef. The > "output" redirect works the same in both shells.

Proposed order: either one, no Depends on. Whichever merges second rebases and adds the outer quotes inside replay on Windows only. Nothing else conflicts: your tools/FrameReplay.cpp, BUILD.md and driver changes merge cleanly with #11157. Does that work for you?

@MarcZX10

Copy link
Copy Markdown
Contributor

I checked the exact live heads a6066b04fca8 (#11435) and c86747300210 (#11157). A three-way git merge-tree reports a content conflict in core/libs/prx/libSceAgcDriver/tests/FrameReplay.cpp: both branches edit the replay command construction at the overlapping test hunk. This is consistent with the overlap bot. The command-line behavior may be combinable, but the heads do not merge cleanly as submitted.

Please agree with @janzezno which PR goes first and record that order in Depends on; the second PR can then rebase and preserve both the repeated replay assertions and Windows quoting. I have not completed the full code review yet, so this is a merge-order finding only.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I reviewed the repeat/cold-pipeline changes and regression test on head a6066b04fca846f19e5a28653f281e9597d43257. I found a concrete option-behavior gap: --cold-pipelines only skips setting APS5_HEADLESS_PIPELINE_CACHE, but does not clear an inherited value. VulkanDevice treats any non-null value of that variable as loadFromFile=true, so running with APS5_HEADLESS_PIPELINE_CACHE=1 agc_frame_replay ... --cold-pipelines still loads a pipeline-cache file instead of starting cold. Please clear the variable in the cold branch on both Windows and POSIX, and add a regression that launches the tool with the variable already set.

There is also an unresolved merge-order issue with #11157. I independently checked the live heads and git merge-tree reports a content conflict in core/libs/prx/libSceAgcDriver/tests/FrameReplay.cpp; I left the exact-hunk detail in my earlier comment. Please agree which PR lands first with @janzezno and record that order in Depends on as required by the overlap rule.

Finally, this branch is based on 7b415520b607, while current main is b0f1183ca12b. The merge-tree preview onto current main is clean; among this PR's touched paths, the only intervening main change is docs/dev/ENVIRONMENT.md. Please sync to current main and rerun required checks. The PR reports the focused validation-layer tests passing, but hosted product jobs are path-skipped and I did not independently run the AGC GPU suite.

@janzezno

Copy link
Copy Markdown
Contributor

@MarcZX10 right, the overlap rule asks for the order in Depends on, so my "no Depends on" proposal above doesn't fit it.

@Sam-mon7 here's a concrete proposal: #11157 first.

#ifdef _WIN32
    command = "\"" + command + "\"";
#endif

The > "output" redirect works unchanged under sh.

If you'd rather have #11435 land first, that's fine with me too. Then #11157 records Depends on: #11435 and I do that rebase on my side. Which do you prefer?

@github-actions github-actions Bot added docs agc libSceAgc* needs rebase Conflicts with main, rebase needed labels Oct 26, 2026
@adriadam10 adriadam10 self-assigned this Oct 27, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 27, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

Thanks for the --repeat option. Two things:

  • Rebase: feat(agc): capture and replay frames on Linux #11157 merged and rewrote how tests/FrameReplay.cpp builds the replay command, with platform-specific quoting. Please rebase and keep that quoting for the new replay lambda (the redirect and the --repeat 3 case should work under sh as well as cmd), then rerun frame_capture/frame_replay on Linux.
  • Error handling: later passes currently treat any exception from the repeated EOP reservation as "kept". Please accept only a verified, already-reserved compatible token, propagate allocation, invalid token/output and driver failures, and add a regression where a repeated pass throws a different failure and the replay fails instead of counting it in kept_reservations.

Sam-mon7 and others added 4 commits October 27, 2026 14:16
The first replay pass compiles every shader and pipeline the frames use,
so its frame times mostly measure compilation. agc_frame_replay
--repeat <n> replays the frames n times: before each later pass it waits
for the driver to go idle, clears the captured ranges, restores the
snapshot, registers the video outputs the snapshot had again and makes the
EOP flip reservations that were pending at the snapshot again (a token
still reserved from the previous pass is kept). Frame times come from
passes 2 to n, each pass is listed under passes, and agc_driver_frame_replay
also replays its capture with --repeat 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n minutes

The drain gave up after 10 s without a completion even while the driver
was still compiling or preparing the work, which reported unfinished
submissions on full titles and left a process that could not exit. A
blocked wait on one queue does not mean the replay is stuck either:
another queue can still be preparing the work that releases it. The drain
now gives up only after ten minutes without a completion and reports the
waits the queues are blocked on every ten seconds and when it gives up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lready applied

A replay's device has no window, so it never loaded the title's Vulkan
pipeline cache file and compiled every pipeline the captured frames used
again, minutes for the first Demon's Souls frames. It also replayed the
pipeline journal in the background during the measured frames, which the
title did at boot.

APS5_HEADLESS_PIPELINE_CACHE makes a device without a window load the
file, and agc_frame_replay sets it unless --cold-pipelines is given. The
driver exports AgcDriverWaitForPipelineJournal, and the replay calls it
after the registrations and reports the wait as journal_s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g, reservation errors

--cold-pipelines now clears an inherited APS5_HEADLESS_PIPELINE_CACHE on both platforms, the replay test
builds its command with boykopovar#11157's quoting so the redirect and --repeat work under sh and cmd, and a reservation
that fails in a repeated pass is reported and fails the replay instead of being dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Sam-mon7
Sam-mon7 force-pushed the feat/frame-replay-full-titles branch from a6066b0 to 5584210 Compare October 27, 2026 18:21
@Sam-mon7

Copy link
Copy Markdown
Contributor Author

Rebased onto main 75f3702aed, which includes #11157, so Depends on stays none. Review fixes are in 5584210c8f:

  • --cold-pipelines now clears an inherited APS5_HEADLESS_PIPELINE_CACHE on Windows and POSIX instead of only not setting it (@MarcZX10). New agc_driver_frame_replay_cold_pipelines runs the tool with the variable inherited and checks the cache is not loaded.
  • The new replay lambda in tests/FrameReplay.cpp builds its command the way feat(agc): capture and replay frames on Linux #11157 does: outer quotes only on Windows, so the redirect and the --repeat 3 case use the same quoting under sh (@oneandonlydean, @janzezno). I ran it on Windows only.
  • A reservation that fails in a later --repeat pass is reported and makes the replay exit nonzero without writing a pass report (@oneandonlydean). New agc_driver_frame_replay_reservations, _reservation_failure and _reservation_error.

Tested on Windows 11 Pro 10.0.26200, WinLibs GCC 15.2.0, Release, NVIDIA GeForce RTX 4070 (driver 610.88), with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation: ctest -R '^agc_(frame_capture|driver_frame_capture_eop|driver_frame_replay)' -V passes 11/11 on main 75f3702aed and 15/15 on this head; neither log has a VUID- or missing-layer message. Conventions pass. Tested is updated.

@MarcZX10 @oneandonlydean, could you take another look?

AI-assisted: yes (Claude Code)

@Tehshortbus

Copy link
Copy Markdown
Contributor

@Sam-mon7 #12318 (mine, a fix to how agc_frame_replay releases a parked REWIND) overlaps your stack in one place: like #11435 and #11436, it adds a test mode to the argument check in main() of core/libs/prx/libSceAgcDriver/tests/FrameReplay.cpp (L263–273 on main). Nothing else overlaps. In tools/FrameReplay.cpp it changes only the breaker's release of REWIND waits and how a memory group is restored, which neither of your PRs touches.

Proposed order: #11435, then #11436, then #12318. I'll declare Depends on: #11436 on #12318, rebase it once yours are merged, and add its rewind mode to your argument check then, so you don't have to change anything. Does that work for you?

AI-assisted: yes (Claude Code)

@Sam-mon7

Copy link
Copy Markdown
Contributor Author

@Tehshortbus yes, that order works: #11435, then #11436, then #12318 with Depends on: #11436. Thanks for taking the rebase and the rewind mode.

AI-assisted: yes (Claude Code)

@Sam-mon7

Copy link
Copy Markdown
Contributor Author

@oneandonlydean the Linux run you asked for:

  • Setup: Ubuntu 26.04 under WSL2, GCC 15.2.0, Release, Mesa llvmpipe. Same ctest -R '^agc_(frame_capture|driver_frame_capture_eop|driver_frame_replay)' -V with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation.
  • Result: main 2227f13661 13/13; this head merged into it 17/17. No VUID- or missing-layer lines.

So the new replay lambda and the --repeat 3 case work under sh. Tested is updated.

AI-assisted: yes (Claude Code)

@janzezno

Copy link
Copy Markdown
Contributor

RADV run of the stack on Linux hardware (native, not WSL), adding to the Linux run above:

  • Setup: Arch Linux (kernel 7.2.11), GCC 16.2.1, Release. AMD Radeon RX 7900 GRE, RADV from Mesa 26.2.5, pinned with VK_DRIVER_FILES; the log shows Selected GPU name=AMD Radeon RX 7900 GRE (RADV NAVI31). Same ctest -R 'frame_capture|frame_replay' -V with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, three runs per side.
  • Result: main 6793a72475 13/13 in all three runs. feat(agc): list a capture's shaders and submissions and trace replay serials #11436 210bd86b58 (which contains this PR's 5584210c8f) merged into it: 20/20 in all three runs. The 20 include the seven new tests: cold_pipelines, environment, reservation_error, reservation_failure, reservations, shader_output and submits. None skipped. No VUID- or missing-layer lines on either side.

@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 GPU run for the NVIDIA report's one new ID (VUID-VkDeviceCreateInfo-pNext-pNext in agc_driver_frame_replay_concurrent), which the last review left unverified. It comes from the bot's old validation layer, not from this PR.

  • The message names VkStructureType 1000574000 (VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR) and says "version 275 of the Vulkan header". So the bot runs Vulkan-ValidationLayers 1.3.275, Ubuntu 24.04's package.
  • The same report lists this ID under "already present on main" for 428 tests. It only counts as new here because, on main, agc_driver_frame_replay_concurrent logs no message at all.

Runs: 9392228b5c merged onto main 16345cad6a, RTX 3070 on 595.99.02 (the bot's driver). Ubuntu 26.04, GCC 15.2, Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1, -j1.

agc_driver_frame_replay_concurrent Result Validation messages
main, VVL 1.3.275 (the Ubuntu 24.04 .deb) pass 2/2, 0.04 s none
PR, VVL 1.3.275 pass 2/2, 1.0–1.3 s 1 pNext-pNext per run (unknown VkStructureType (1000574000)), same as the bot
PR, VVL 1.4.341 pass 3/3 none
PR, lavapipe (Mesa 26.0.3), VVL 1.4.341 pass none

#11436, #12567, #12568 and #12696 carry this PR's commits and got the same single ID in their NVIDIA reports, so the same applies to them.

GPUs tested: NVIDIA RTX 3070 (595.99.02), lavapipe (Mesa 26.0.3).

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

@janzezno

Copy link
Copy Markdown
Contributor

A Linux data point for the agc_driver_frame_replay_reservation_error hang in chitters2004's comment: it doesn't hang on Linux/RADV.

  • In my RADV run from 10-28 (feat(agc): list a capture's shaders and submissions and trace replay serials #11436 210bd86b58, which contains this PR's 5584210c8f, merged onto main 6793a72475, RX 7900 GRE, Mesa 26.2.5, validation on), the frame_capture|frame_replay set passed 20/20 three times. That set includes this test.
  • tools/FrameReplay.cpp is the same at 5584210c8f and at the current head 9392228b5c, so the std::_Exit(code) path at line 920 hasn't changed since that run.
  • This fits the cause found on Windows. On Linux, _Exit neither runs static destructors nor unloads the shared objects, so the Driver destructor and its stop() never run on that path.

So the shutdown-before-_Exit fix matters for Windows. I can rerun the set on RADV once it's pushed.

@chitters2004

Copy link
Copy Markdown
Contributor

@Sam-mon7, the _Exit fix is now in its own PR against main, #14100, so you don't need to change this for it. It merges cleanly with this head, and reservation_error no longer hangs or aborts at exit with it.

AI-assisted: yes (Claude Code)

@chitters2004

Copy link
Copy Markdown
Contributor

@Sam-mon7, @oneandonlydean said on #12567 (29 Oct, 30 Oct) that the default-output point would be taken up here, so I'm raising it in case it hasn't reached you. As I read the 30 Oct note, passes, kept_reservations and journal_s in the default JSON, and the blocked on text in progress and drain stderr, need to go behind an explicit option or have an output-format exception recorded. @oneandonlydean, please correct me if that's changed.

My reservation_error result above is from an RTX 3080; AMD hasn't been run on this commit.

AI-assisted: yes (Claude Code)

# Conflicts:
#	core/libs/prx/libSceAgcDriver/CMakeLists.txt
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

The typed reservation handling and preserved platform quoting address the earlier source asks, thanks. One outstanding output-contract point was explicitly deferred here in the replies on #12567 (issuecomment-6506212998 and issuecomment-6520918984): the default replay JSON still adds passes, kept_reservations and journal_s. At 68c782957f06ac85a41b6517f43d26d91ee91f05, these fields remain in the unconditional summary at tools/FrameReplay.cpp:869. Please put the added output behind an explicit option or link the owner's output-format exception; retain the previous default output otherwise.

The Windows error-exit issue is already isolated in #14100, which is still open. Keep that dependency and final-composition replay validation visible; no duplicate implementation is requested here. The reported Linux pass does not cover that Windows shutdown path.

@JJenkx

JJenkx commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

Independent Linux title-capture validation on AMD Radeon RX 6650 XT (RADV/Mesa 26.2.6). This directly reproduces the ten-second drain limit described here.

Exact comparison: clean main ba627802e2210187d417deb64c8f2fed8e33011f against that same main plus this PR head 68c782957f06ac85a41b6517f43d26d91ee91f05, integration 89ac26614affe3040ea6220958a97f4c11e44d71. The integration contains no extra source changes.

The private capture comes from Bugsnax PPSA01503 v02.000.000, the rainy cave entrance at 3840×2160: one complete frame, 1,226 in-frame calls and 1,872,682 prologue calls. Both tools replay the exact same immutable capture with --strict --no-synthesize --frames <output>.

Result main main + this PR
Exit 3 0
Completed frames 0 1
Unfinished submissions 1 0
Replay seconds 20.127 46.549
Failed / stale registrations 0 / 0 0 / 0
Skipped MiB / synthesized waits 0 / 0 0 / 0
Display buffers compared 0 3

All three reference/replay BMP pairs are byte-identical, independently checked with SHA-256, and the reference/replay cave images were visually reviewed. Main exits with serials 1/2; this PR keeps waiting while shaders/pipelines prepare and completes. This is tool-correctness evidence, not a native FPS gain.

A separate --repeat 3 diagnostic run also completes all three passes (76.613 / 50.239 / 6.754 seconds), with zero unfinished submissions, zero synthesized waits, and all final buffer pairs byte-identical. The aggregate reports two frames because it excludes the first pass. That run enables shader dumping, GPU profiling and APS5_NO_DRAW_RECIPE; its times are diagnostic, not comparable performance measurements. Its Vulkan loader log explicitly confirms insertion of the Khronos instance and device layers.

Focused gate on the same main/change sources: ctest --test-dir build -R '^agc_(frame_capture|driver_frame_capture_eop|driver_frame_replay)' -V with ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation: 13/13 main, 17/17 change, no skipped tests, no VUID- or missing-layer messages. These small fixtures do not establish physical-GPU coverage; the title-capture replays above do. Neither physical replay log contains VUID- or a missing-layer message. All protected capture/tool/library hashes remain unchanged, and every test process exited.

Limitations: only this frame/scene is qualified. The capture header warns about approximately 64 MiB of host-only multisample contents omitted from the snapshot; this particular frame still matches exactly, which does not waive that warning for other captures. No tutorial/bridge, full-game, PS5-equivalence, or audio claim.

Commands, full logs, JUnit, source/binary provenance, image hashes and reviewed previews, SHA-256 49dd934d23b09db817a5066d70f81ff679fdd71b9ad2eeb2a26ea32e014806eb; download and all 25 inner files verified. Raw game capture, shader requests/ISA/SPIRV, assets, saves and binaries remain private.

@TechLevelZero

Copy link
Copy Markdown
Contributor

❌ NVIDIA GPU test: failed

PR head 68c7829 merged onto main e6f5730 · tested 2026-11-01 14:34 UTC · 36 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,487 passed · 4 failed (0 new, 3 also fail on main, 1 unstable on main) · 45 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,536 of 3,148 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ❌ 1 new validation ID(s) 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, ⚠️ agc_driver_graphics_maps_fallback 31.8 s, ⚠️ agc_driver_graphics 30.4 s

New validation errors

This PR changes test files, so each test below was also run on main with only the PR's test changes applied; 0 there means the PR's other changes cause the error.

ID Test main e6f5730 main + this PR's test changes only PR PR, test re-run alone
VUID-VkDeviceCreateInfo-pNext-pNext agc_driver_frame_replay_concurrent 0 not compared: tests do not build on main 3 6 (in 2 runs)
agc_driver_frame_replay_concurrent: new validation messages
VUID-VkDeviceCreateInfo-pNext-pNext(ERROR / SPEC): msgNum: -1876993556 - Validation Error: [ VUID-VkDeviceCreateInfo-pNext-pNext ] | MessageID = 0x901f59ec | vkCreateDevice(): pCreateInfo->pNext chain includes a structure with unknown VkStructureType (1000574000). This error is based on the Valid Usage documentation for version 275 of the Vulkan header.  It is possible that you are using a struct from a private extension or an extension that was added to a later version of the Vulkan header, in which case the use of pCreateInfo->pNext is undefined and may not work correctly with validation ena
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 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
Validated but not compared (4, not in the main baseline's validation pass)
agc_driver_frame_replay_cold_pipelines
agc_driver_frame_replay_reservation_error
agc_driver_frame_replay_reservation_failure
agc_driver_frame_replay_reservations
Validation IDs already present on main (5 IDs in 484 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (484 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 476 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (45)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fps_limit: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_o
Reproduce
git fetch origin 68c782957f06ac85a41b6517f43d26d91ee91f05 e6f57307fa7f47165d7fc1bee945abdb2f6816e7
git checkout e6f57307fa7f47165d7fc1bee945abdb2f6816e7 && git merge --no-ff 68c782957f06ac85a41b6517f43d26d91ee91f05
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
# the failing tests, on this merge and on main:
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc_driver_frame_replay_concurrent)$' --parallel 1 -V

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.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 1, 2026
Sam-mon7 and others added 2 commits November 1, 2026 22:06
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iagnostics behind --diagnostics

The JSON line and the progress and drain messages print what they printed
before this PR unless --diagnostics is given. With it the JSON line adds
passes, kept_reservations and journal_s, the progress messages and the
drain give-up message add the waits the queues are blocked on, and the
drain reports the pending submissions every 10 s without a completion.
agc_driver_frame_replay checks that a plain replay prints none of the three
fields and that --repeat 3 --diagnostics lists three passes and takes its
frame count from passes 2 and 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Sam-mon7

Sam-mon7 commented Nov 1, 2026

Copy link
Copy Markdown
Contributor Author

Synced with main 0d5e03be8c (merge c10ff3e4cb, clean, on top of the 68c782957f merge) and addressed the output point in 20ccbe17c8:

Tested is updated.

AI-assisted: yes (Claude Code)

@chitters2004

chitters2004 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

@Sam-mon7 The windows job on 20ccbe17c8 compiles; it fails because agc_driver_frame_replay, _cold_pipelines, _reservation_error and _concurrent now run under the changed-tests gate on a runner with no Vulkan driver (vkCreateInstance: Vulkan result -9). #11436 fails the same way.

This commit makes them skip there, and is the change from 93123ef32c on #12696 with the two conflicts resolved: 9a317969f4. To take it:

git fetch https://github.com/chitters2004/AnyPS5.git fix/frame-replay-skip-without-vulkan
git cherry-pick FETCH_HEAD

Tested on Windows with an RTX 3080 at 9a317969f4: all 13 frame_replay tests pass with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1 and the validation layer, 0 VUID- lines. With VK_DRIVER_FILES and VK_ICD_FILENAMES pointing at a missing file, all four report Skipped.

AI-assisted: yes (Claude Code)

@TechLevelZero

Copy link
Copy Markdown
Contributor

❌ NVIDIA GPU test: failed

PR head 20ccbe1 merged onto main 93dbd0f · tested 2026-11-02 07:13 UTC · 27 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,497 passed · 6 failed (0 new, 3 also fail on main, 3 unstable on main) · 45 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,548 of 3,165 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ❌ 1 new validation ID(s) vs main (934 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_lookup_log_fits_build 83.9 s, ⚠️ agc_driver_graphics_maps_fallback 31.9 s, ⚠️ agc_driver_graphics 30.3 s

New validation errors

This PR changes test files, so each test below was also run on main with only the PR's test changes applied; 0 there means the PR's other changes cause the error.

ID Test main 93dbd0f main + this PR's test changes only PR PR, test re-run alone
VUID-VkDeviceCreateInfo-pNext-pNext agc_driver_frame_replay_concurrent 0 not compared: tests do not build on main 3 6 (in 2 runs)
agc_driver_frame_replay_concurrent: new validation messages
VUID-VkDeviceCreateInfo-pNext-pNext(ERROR / SPEC): msgNum: -1876993556 - Validation Error: [ VUID-VkDeviceCreateInfo-pNext-pNext ] | MessageID = 0x901f59ec | vkCreateDevice(): pCreateInfo->pNext chain includes a structure with unknown VkStructureType (1000574000). This error is based on the Valid Usage documentation for version 275 of the Vulkan header.  It is possible that you are using a struct from a private extension or an extension that was added to a later version of the Vulkan header, in which case the use of pCreateInfo->pNext is undefined and may not work correctly with validation ena
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 6 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 7 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (2, not in the main baseline's validation pass)
agc_driver_frame_replay_cold_pipelines
agc_driver_frame_replay_reservation_error
Validation IDs already present on main (5 IDs in 484 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (484 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 476 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (45)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fps_limit: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_o
Reproduce
git fetch origin 20ccbe17c8026d38acb17d28e042f32c4f6a245b 93dbd0f82aea684e95f15f06e7d42c0064af18cf
git checkout 93dbd0f82aea684e95f15f06e7d42c0064af18cf && git merge --no-ff 20ccbe17c8026d38acb17d28e042f32c4f6a245b
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
# the failing tests, on this merge and on main:
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc_driver_frame_replay_concurrent)$' --parallel 1 -V

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.

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

chitters2004 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

@Sam-mon7 @oneandonlydean This PR now conflicts with main in one docs/dev/BUILD.md sentence and one VulkanDevice.cpp line, and the windows job still needs the skip commit from my earlier note. 00ca5db4f6 has both, so the stack doesn't have to wait on either: 20ccbe17c8, then 9a317969f4, then main a4eca2a056 merged in.

It fast-forwards this PR's branch, with no rebase or force-push. Anyone with push access to the branch can take it:

git fetch https://github.com/chitters2004/AnyPS5.git sync/11435
git push https://github.com/Sam-mon7/AnyPS5.git FETCH_HEAD:refs/heads/feat/frame-replay-full-titles

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head ce3b9a8 merged onto main b11c7bf · tested 2026-11-04 18:01 UTC · 22 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,838 passed · 7 failed (0 new, 6 also fail on main, 1 unstable on main) · 60 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,905 of 3,894 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (985 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ public_headers 77.6 s, ⚠️ agc_driver_image_sample_unnormalized 33.7 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 (6, not counted against this PR)
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_driver_submit_progress
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (8 IDs in 551 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (551 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 543 more
VUID-vkCmdCopyImage-srcImage-01548 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_srgb8_color_target
VUID-VkSamplerCreateInfo-addressModeU-01079 (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeU-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeV-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeW-parameter (1 test): agc_driver_image_gather_volume
Skipped (60)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_idle_publish_wait: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a forced watch of the import reads its submissions as CPU stores
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_storage_pending_key_refresh: skipped, refreshes over a pending key store are not testable here
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platf
Reproduce
git fetch origin ce3b9a8bf66f1b90d41c80438fd72191837e1ebd b11c7bf84f5d2f636ff60166cc3371bd071e24d5
git checkout b11c7bf84f5d2f636ff60166cc3371bd071e24d5 && git merge --no-ff ce3b9a8bf66f1b90d41c80438fd72191837e1ebd
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.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

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

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

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

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* build docs needs rebase Conflicts with main, rebase needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants