Skip to content

feat(agc): capture selected live storage images without writeback - #11363

Merged
oneandonlydean merged 2 commits into
boykopovar:mainfrom
JJenkx:feat/agc-selected-image-readback-20261026
Oct 28, 2026
Merged

oneandonlydean merged 2 commits into
boykopovar:mainfrom
JJenkx:feat/agc-selected-image-readback-20261026

Conversation

@JJenkx

@JJenkx JJenkx commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

What

APS5_DUMP_STORAGE currently relies on guest writeback, so a clean cached image can remain unavailable for inspection. Add opt-in APS5_DUMP_STORAGE_GATE=<path>: after the path exists, capture matching live images directly to host memory without changing guest bytes or dirty tracking. Preserve the existing dump behaviour when no gate is configured.

Capture is limited to eight addresses per process and 8 MiB of linear storage per image. Files retain the existing pitch/height/VkFormat header followed by first-mip pixels across layers. This is a debugging facility; GPU waits deliberately perturb timing, so captures are not performance evidence.

Tested

Based on main b27cc8416f8; tested implementation 61ba654e904; follow-up a208275b3ad only documents the test switch (no source/test changes). Built the graphics and layered-volume execution test targets in separate Release trees on the same Linux machine.

Ran agc_driver_graphics, agc_driver_layered_volume_draw, agc_driver_layered_volume_vertex_no_gpl and agc_driver_volume_direct_readback individually with ctest -V, three times per arm, with ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation. Main plus only the new test fixture/registration: existing checks 9/9 pass; new regression fails 3/3 with clean volume image was not exported by direct readback. Change: 12/12 pass. Eighteen actual Khronos layer insertions across both arms, no missing-layer messages, skips or VUID- errors.

The regression removes stale output, verifies the closed gate produces no file, then checks the exact header/payload length and every valid texel of a clean 48×16×4 image after opening the gate. Conventions and whitespace checks pass. pr_overlap.py reports no direct conflict; local composition with #6959 and #7310 is clean. Reviewed stale shared-file PR patches for changes to the dump selector/capture paths; none duplicate this facility. Windows and other GPUs not tested.

Paired logs, build receipts, test-only control patch and reproduction scripts. SHA-256: 983d12d4daecd548f4cc670954b9d771391e86b07fc32b97b28cd88d0ee7ff1a. No title data is included.

Independent Windows/NVIDIA validation (SeaSunPT): reported here for exact head a208275b3 integrated onto main cbaacd2910. Windows 11 Pro 26200, RTX 5070 Ti/610.88, GCC 15.2 Release, Khronos Vulkan SDK 1.4.363: candidate four focused tests and main three existing tests each passed three times, with no skips, missing-layer warnings or VUIDs. The contributor also reports 2451/2453 full-suite passes; agc_host_import_cut_lifetime (#10746) and agc_driver_depth_plane_partial_store (#10664) fail on main too. This is the contributor's run, not a new run on our paused Windows machine.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: AMD Radeon RX 6650 XT, RADV Mesa 26.2.4-arch1.1, Linux 7.2.9-arch1-1
  • AI-assisted: yes

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

Reviewed exact head a208275b3adf292654c1e4f96a29ed26ed381740.

The direct capture path is opt-in behind APS5_DUMP_STORAGE_GATE; the existing writeback dump remains the no-gate path. I found no blocking issue in the gate, live-image selection, copy/barrier sequence, or layered-volume regression wiring on this inspection. The conventions failure on the initial head was fixed by documenting APS5_TEST_DIRECT_READBACK; I independently ran python3 -I tools/check_conventions.py --base b27cc8416f820e40ce187f165d34138e24373dd7 --head a208275b3adf292654c1e4f96a29ed26ed381740 and it passes.

The author reports baseline/change Vulkan runs of 9/9 and 12/12 across three repetitions, with the validation layer loaded and no VUIDs. I did not independently execute those GPU tests. On the latest head, eligibility, conventions, labels and report checks pass; relinker and product test jobs are skipped by path policy.

@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 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 4448 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 4449 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6185 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6924 docs/dev/ENVIRONMENT.md
PR 6960 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6971 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7048 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7449 docs/dev/ENVIRONMENT.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 7642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 7922 docs/dev/ENVIRONMENT.md
PR 8004 docs/dev/ENVIRONMENT.md
PR 8484 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 8542 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8939 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8963 docs/dev/ENVIRONMENT.md
PR 9012 docs/dev/ENVIRONMENT.md
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9129 docs/dev/ENVIRONMENT.md
PR 9248 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 9335 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9345 docs/dev/ENVIRONMENT.md
PR 9356 core/libs/prx/libSceAgcDriver/tests/execution/LayeredVolumeDraw.cpp
docs/dev/ENVIRONMENT.md
PR 9387 core/libs/prx/libSceAgcDriver/tests/execution/LayeredVolumeDraw.cpp
docs/dev/ENVIRONMENT.md
PR 9431 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9432 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 9533 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9633 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9672 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9673 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9674 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9675 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9676 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 9700 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9717 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9742 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9748 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9749 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9790 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9842 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9852 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 9891 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9892 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9893 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9895 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 9897 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9898 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 9969 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10000 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10043 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10064 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10069 docs/dev/ENVIRONMENT.md
PR 10193 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/ENVIRONMENT.md
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10249 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10333 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10435 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 10442 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10489 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10498 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10678 docs/dev/ENVIRONMENT.md
PR 10757 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10846 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 10867 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 11351 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ENVIRONMENT.md
PR 11557 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 11920 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp

@SeaSunPT

Copy link
Copy Markdown
Contributor

A Windows/NVIDIA run, to go with the Linux/RADV one.

Windows 11 Pro 26200, Intel Core i5-14600K, NVIDIA GeForce RTX 5070 Ti (driver 610.88), WinLibs GCC 15.2.0 r7, Release. Head a208275b3 merged onto main cbaacd2910 (clean), compared with that main.

ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "^(agc_driver_graphics|agc_driver_layered_volume_draw|agc_driver_layered_volume_vertex_no_gpl|agc_driver_volume_direct_readback)$" -V, 3 runs each:

  • This PR: 4 of 4 pass every run, the new agc_driver_volume_direct_readback included, none skipped.
  • main: the 3 existing tests pass every run.
  • 0 VUID- lines and no missing-layer line in any log. The validation layer is Khronos vulkan-sdk-1.4.363.0, built from source with the same GCC (mimalloc off).

Full ctest -j 8 with ANYPS5_REQUIRE_VULKAN=1: 2451 of 2453 pass. The two failures, agc_host_import_cut_lifetime (#10746) and agc_driver_depth_plane_partial_store (#10664), fail on main on this machine too.

@oneandonlydean oneandonlydean self-assigned this Oct 26, 2026
@oneandonlydean
oneandonlydean merged commit b643e2a into boykopovar:main Oct 28, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants