Skip to content

fix(agc): drop stale depth planes a uniform fill overwrites - #10882

Merged
oneandonlydean merged 7 commits into
boykopovar:mainfrom
orezraey:fix/agc-depth-fill-discard
Nov 4, 2026
Merged

oneandonlydean merged 7 commits into
boykopovar:mainfrom
orezraey:fix/agc-depth-fill-discard

Conversation

@orezraey

@orezraey orezraey commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

What

A depth target drawn on the host leaves its plane stale: the results live in the host depth image and are stored to guest memory when something reads that memory. A uniform buffer fill over the whole plane (a depth clear done as a memory fill) is such a read: storeBufferFill calls StorageTexture::FlushPending, which calls FlushDepthPlanes, so the stale plane was stored in full, and the fill then overwrote every byte of it. DEATHLOOP (PPSA01670) clears two 3840x2160 D32 planes this way every frame, 32 MiB each.

  • DiscardFilledDepthPlanes (new, called by storeBufferFill for uniform fills before its flushes): a stale single-sample depth plane that the fill covers entirely, with a value NoteDepthMetadataFill would turn into a plane clear (a depth in 0..1, or a D16 pair; no HTILE fill over the target), drops its stale units instead of storing them and notes the plane clear itself (NotePlaneFill), so the host image is cleared to the filled value at its next use. Partial fills, fills of other values, planes that are syncing, and fills that a native multisample colour target absorbs (they never reach guest memory) are stored as before.
  • Rebuilding the stale-plane index keeps the ranges of pending stencil planes, as the rebuild in FlushDepthPlanes does, so a later read of a stencil plane still stores it after a fill discards a depth plane. agc_driver_depth_plane_fill_discard covers a stencil-only surface beside the discarded plane and a surface with both planes stale.
  • It notes the clear itself because the pipelined DMA fill path (enqueueDmaPacket) does not reach preparePacketMemory, so NoteDepthMetadataFill is not called for those fills.
  • planeFillDepth is the plane test both NoteDepthMetadataFill and the drop use, so they cannot disagree.
  • A fill that touches no stale plane returns after the existing overlapsStalePlane check, without the surfaces lock.
  • agc_driver_depth_plane_fill_discard: a stale 384x200 Z_X plane is kept by a shorter fill, a fill starting past it, a fill of -1.0 and a NaN fill; a fill of 1.0 around it drops it with no store counted, and a draw at 0.5 then passes LESS (the plane was cleared to 1.0) with no NoteDepthMetadataFill call; an exact fill drops it once; a fill of 0.0 makes the same draw fail LESS. It then calls Driver::storeBufferFill itself (through DriverTestAccess) with a fill of 0.75 over a stale plane: no store is counted, the plane holds 0.75, a draw at 0.5 passes LESS and a later read stores nothing. With the storeBufferFill call removed, that part fails with "the driver's fill of 0.75 over the whole stale plane stored the plane first".

This PR makes no frame-time claim; see the captures below.

Tested

Windows 11 Pro 26200, AMD Ryzen 7 9700X, NVIDIA GeForce RTX 5070 Ti (driver 616.64), WinLibs GCC, Release. Head 591da8f4df, which contains main e67cc81869.

  • ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "depth|fill|storage|stencil" -V, 3 runs at 591da8f4df and 1 at e67cc81869: 99 of 102 pass each time on the head and 98 of 101 on main, 0 VUID- and no missing-layer message in any log. The extra test is agc_driver_depth_plane_fill_discard. The 3 not counted were not built for those runs (agc_driver_stencil_plane_memory, guest_np_cpp_web_api_title_cloud_storage, guest_system_service_usb_storage); agc_driver_stencil_plane_memory was then built and passes 3 of 3 on the head with the same variables, 0 VUID-.
  • The stencil regression fails without the new line in DiscardFilledDepthPlanes: the stencil-only case with "a read of a stencil-only surface's plane stored nothing after another surface's depth plane was discarded", and, with that case removed, the same-surface case with "a read of the stencil plane stored nothing after its surface's depth plane was discarded".
  • tools/check_conventions.py --base origin/main: passes.
  • Linux (WSL, no Vulkan device): agc_driver_depth_plane_fill_discard_tests builds at 591da8f4df; the test skips 3 of 3 runs and fails with ANYPS5_REQUIRE_VULKAN=1, so its GPU paths did not run on Linux here.

Earlier results at aa144ce8f5 on main 6c7a3256f2:

  • ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "depth|fill|storage" -V, 3 runs at aa144ce8f5: 80 of 81 pass each time, 0 VUID-, no missing-layer message. The failure is agc_driver_depth_plane_partial_store ("repeated lookups of the first layer of an unchanged array proved no refresh"), which fails the same way on main (c8d34aa8f4: 79 of 80, 0 VUID-). The extra test is agc_driver_depth_plane_fill_discard.
  • Full ctest at aa144ce8f5: 2305 tests; the failures are agc_driver_depth_plane_partial_store, agc_host_import_cut_lifetime (both fail the same way on main here) and select_tests (a temp-directory symlink error in tools/tests/test_select_tests.py).
  • tools/check_conventions.py --base origin/main: passes.

DEATHLOOP (PPSA01670), the beach at the start of the game (sprint and dodge tutorial), same machine and scripted input. main cannot reach this scene yet, so both builds are main + #10414 + #10507 + #10743 + a port of #6192, without (base d26dce2835) and with (change 88b55a05ee) this PR's first three commits. The last commit (aa144ce8f5) only keeps planes under fills that a multisample colour target absorbs, which DEATHLOOP's depth clears are not; it was not re-captured. Captures as the Performance report form says: APS5_TRACE_SECONDS=840:60 only, log not redirected, runs alternating base and change. The traces and the summary lines are assets of this release on my fork.

Run Build Presents in 60 s Frame p50 / p90 / p99 / max ms GPU busy per present ms Trace
1 base 337 178.0 / 183.9 / 190.8 / 196.8 53.3 run1
2 change 347 172.5 / 181.1 / 190.3 / 192.9 51.2 run2
3 base 344 174.3 / 179.0 / 187.5 / 191.0 53.3 run3
4 change 337 177.4 / 185.8 / 195.7 / 205.1 51.6 run4
5 base 337 177.9 / 183.2 / 190.1 / 193.7 53.0 run5
6 change 324 185.4 / 189.8 / 196.5 / 200.8 51.7 run6

The frame time does not change beyond run-to-run noise: this scene is CPU-bound. GPU busy per present is 1.3 to 2.1 ms lower in each change run than in the base runs.

Behaviour count, from separate runs with APS5_PROFILE_DRAW=1 (not the captures above): the [storage] lines report depth plane store write-backs of about 111 to 128 GiB per 330 s run on the title menus with the base build and none with the change. With temporary caller logging added locally (not in this PR), every one of those stores came from storeBufferFill (reason buffer fill) over the two 0x1fe0000-byte planes. The menus look the same with both builds.

aps5-summary.jsonl lines of the six runs, in run order
{"commit":"d26dce2835cb","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":8614,"ms":60107.959},"presents":337,"frame_ms":{"p50":177.951,"p90":183.858,"p99":190.768,"max":196.822},"gpu_busy_ms_per_present":53.271,"worker_busy_pct":{"queue worker 0x0":99.227,"queue worker 0x20":97.824,"queue worker 0x28":97.385,"queue worker 0x38":99.93,"queue worker 0x30":99.658,"queue worker 0x40":99.965,"queue worker 0x48":99.983},"top_phases_ms_per_frame":{"Driver.Packet":1236.547,"Driver.Packet.memory_wait":1043.837,"Graphics.Draw":149.059,"Driver.Packet.draw":148.059,"Driver.Draw":147.73,"Graphics.Draw.draw_and_resource_release":141.774,"Driver.Draw.draw_enqueued":99.446,"Driver.Draw.shader_compile_and_link":28.86},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":13.279,"events_lost":934051,"totals_full":false},"draw committer":{"events_full_after_s":39.377,"events_lost":137976,"totals_full":false}},"trace":"aps5-trace-d26dce2835cb-41848.json.gz"}
{"commit":"88b55a05ee74","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":9199,"ms":60122.777},"presents":347,"frame_ms":{"p50":172.474,"p90":181.063,"p99":190.306,"max":192.882},"gpu_busy_ms_per_present":51.182,"worker_busy_pct":{"queue worker 0x0":99.212,"queue worker 0x20":98.54,"queue worker 0x30":99.712,"queue worker 0x28":98.068,"queue worker 0x38":99.936,"queue worker 0x48":99.984,"queue worker 0x40":99.968},"top_phases_ms_per_frame":{"Driver.Packet":1203.588,"Driver.Packet.memory_wait":1017.453,"Graphics.Draw":145.698,"Driver.Packet.draw":145.165,"Driver.Draw":144.824,"Graphics.Draw.draw_and_resource_release":138.468,"Driver.Draw.draw_enqueued":96.263,"Driver.Draw.shader_compile_and_link":29.646},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":12.576,"events_lost":993452,"totals_full":false},"draw committer":{"events_full_after_s":38.232,"events_lost":150555,"totals_full":false}},"trace":"aps5-trace-88b55a05ee74-40768.json.gz"}
{"commit":"d26dce2835cb","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":8973,"ms":60076.746},"presents":344,"frame_ms":{"p50":174.347,"p90":179.013,"p99":187.476,"max":191.038},"gpu_busy_ms_per_present":53.288,"worker_busy_pct":{"queue worker 0x0":99.205,"queue worker 0x28":97.381,"queue worker 0x30":99.651,"queue worker 0x20":97.842,"queue worker 0x40":99.965,"queue worker 0x48":99.982,"queue worker 0x38":99.908},"top_phases_ms_per_frame":{"Driver.Packet":1210.601,"Driver.Packet.memory_wait":1021.711,"Graphics.Draw":144.854,"Driver.Packet.draw":144.266,"Driver.Draw":143.92,"Graphics.Draw.draw_and_resource_release":137.657,"Driver.Draw.draw_enqueued":94.934,"Driver.Draw.shader_compile_and_link":29.998},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":12.617,"events_lost":985100,"totals_full":false},"draw committer":{"events_full_after_s":38.303,"events_lost":147991,"totals_full":false}},"trace":"aps5-trace-d26dce2835cb-24240.json.gz"}
{"commit":"88b55a05ee74","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":8658,"ms":60020.4},"presents":337,"frame_ms":{"p50":177.364,"p90":185.819,"p99":195.727,"max":205.069},"gpu_busy_ms_per_present":51.611,"worker_busy_pct":{"queue worker 0x0":99.214,"queue worker 0x20":98.56,"queue worker 0x28":98.183,"queue worker 0x30":99.688,"queue worker 0x40":99.963,"queue worker 0x48":99.995,"queue worker 0x38":99.935},"top_phases_ms_per_frame":{"Driver.Packet":1237.63,"Driver.Packet.memory_wait":1047.644,"Graphics.Draw":150.447,"Driver.Packet.draw":149.521,"Driver.Draw":149.177,"Graphics.Draw.draw_and_resource_release":143.101,"Driver.Draw.draw_enqueued":100.166,"Driver.Draw.shader_compile_and_link":29.485},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":12.776,"events_lost":962266,"totals_full":false},"draw committer":{"events_full_after_s":39.102,"events_lost":139913,"totals_full":false}},"trace":"aps5-trace-88b55a05ee74-41120.json.gz"}
{"commit":"d26dce2835cb","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":8701,"ms":60020.229},"presents":337,"frame_ms":{"p50":177.932,"p90":183.159,"p99":190.053,"max":193.682},"gpu_busy_ms_per_present":52.968,"worker_busy_pct":{"queue worker 0x0":99.224,"queue worker 0x28":97.481,"queue worker 0x20":97.968,"queue worker 0x38":99.933,"queue worker 0x30":99.664,"queue worker 0x40":99.964,"queue worker 0x48":99.983},"top_phases_ms_per_frame":{"Driver.Packet":1234.919,"Driver.Packet.memory_wait":1042.455,"Graphics.Draw":148.961,"Driver.Packet.draw":148.098,"Driver.Draw":147.758,"Graphics.Draw.draw_and_resource_release":141.741,"Driver.Draw.draw_enqueued":99.759,"Driver.Draw.shader_compile_and_link":28.798},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":13.197,"events_lost":939608,"totals_full":false},"draw committer":{"events_full_after_s":39.461,"events_lost":136938,"totals_full":false}},"trace":"aps5-trace-d26dce2835cb-37056.json.gz"}
{"commit":"88b55a05ee74","dirty":false,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"840:60"},"gpu":"NVIDIA GeForce RTX 5070 Ti","driver":"NVIDIA 616.64","os":"Windows 10.0.26200","cpu":"AMD Ryzen 7 9700X 8-Core Processor","cpu_threads":16,"memory_mib":31801,"title_id":"PPSA01670","title":"DEATHLOOP","content_version":"01.405.000","resolution":"3840x2160","window":{"spec":"seconds 840:60","first_present":8698,"ms":60148.507},"presents":324,"frame_ms":{"p50":185.446,"p90":189.83,"p99":196.519,"max":200.793},"gpu_busy_ms_per_present":51.722,"worker_busy_pct":{"queue worker 0x0":99.243,"queue worker 0x20":98.622,"queue worker 0x30":99.682,"queue worker 0x28":98.245,"queue worker 0x38":99.934,"queue worker 0x40":99.966,"queue worker 0x48":99.984},"top_phases_ms_per_frame":{"Driver.Packet":1290.156,"Driver.Packet.memory_wait":1092.058,"Graphics.Draw":157.561,"Driver.Packet.draw":156.59,"Driver.Draw":156.24,"Graphics.Draw.draw_and_resource_release":150.091,"Driver.Draw.draw_enqueued":107.474,"Driver.Draw.shader_compile_and_link":29.295},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":13.388,"events_lost":901172,"totals_full":false},"draw committer":{"events_full_after_s":40.808,"events_lost":124625,"totals_full":false}},"trace":"aps5-trace-88b55a05ee74-34860.json.gz"}

Checklist

orezraey and others added 3 commits October 25, 2026 03:57
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pipelined DMA fill never reaches NoteDepthMetadataFill, so dropping
the stale plane there left the old depth in the host image. The drop
now records the plane clear itself, shares the plane-fill test with
NoteDepthMetadataFill, and skips fills that miss every stale plane.

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

Copy link
Copy Markdown
Contributor Author

@EagleBearerYS: #9533, #9717 and #9742 change the lines next to this PR's in Graphics/include/DepthSurface.hpp (the declarations after NoteDepthMetadataFill) and Graphics/src/DepthSurface.cpp (around NoteDepthMetadataFill). They do not implement the same thing: this PR drops a stale single-sample depth plane that a uniform fill covers, and yours handle native multisample D32S8 targets. #9533 also makes the pipelined DMA fill pass noteMetadata = true, which this PR does not rely on: its drop notes the plane clear itself. I propose yours land first; I will then refresh this PR over them, keeping both behaviours. Depends on lists them (merge order only).

@EagleBearerYS

Copy link
Copy Markdown
Contributor

@orezraey thanks, agreed: #9533, #9717 and #9742 first, then #10882 over them (merge order only). We'll note it on ours.

@github-actions

github-actions Bot commented Oct 25, 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/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 6808 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 7256 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 7449 core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 7642 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 9508 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 9895 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 9950 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 10193 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 10249 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 10492 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 10497 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 11444 core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 11551 core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 11998 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 13486 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 13863 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 13920 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 13928 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 13929 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 14084 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 14344 core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 15015 core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 15059 core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
PR 15136 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Memory/BufferFill.cpp

@github-actions github-actions Bot added the agc libSceAgc* label Oct 25, 2026
@orezraey

Copy link
Copy Markdown
Contributor Author

I checked the 21 pull requests the overlap bot could not compare (they conflict with main) by reading their diffs of BufferFill.cpp, DepthSurface.hpp and DepthSurface.cpp. None of them edits the lines this PR changes: the uniform move in storeBufferFill, the NoteDepthMetadataFill depth-plane branch, the new planeFillDepth helper or the new DiscardFilledDepthPlanes. The only textual contact is #1368 (@TibixDev), which adds NoteDepthSurfaceWrite right after NoteDepthMetadataFill, where this PR adds DiscardFilledDepthPlanes; that is an adjacent insertion, and whichever lands second keeps both functions. #10435 and #9895 touch HtileMetadataBytes, layeredDepthStorage, mirrorable and DepthSurfaceTexture, which this PR leaves alone, so I added no new merge order beyond #9533, #9717 and #9742.

@MarcZX10

Copy link
Copy Markdown
Contributor

Thanks for checking the uncomparable PRs. I verified #1368 is still open; it adds NoteDepthSurfaceWrite immediately after NoteDepthMetadataFill, adjacent to this PR’s new declaration. Since the repository overlap rule asks authors to agree on the order for overlapping insertions, could you record #1368’s author agreement and include that order/dependency in the checklist (alongside the existing #9533/#9717/#9742 stack)? The current head is cleanly mergeable with its recorded base; rebase after the agreed prerequisite stack lands.

@orezraey

Copy link
Copy Markdown
Contributor Author

@TibixDev: #1368 adds NoteDepthSurfaceWrite right after NoteDepthMetadataFill in Graphics/include/DepthSurface.hpp and Graphics/src/DepthSurface.cpp, and this PR adds DiscardFilledDepthPlanes at the same place, so the two insertions touch. They do not implement the same thing: this PR drops a stale single-sample depth plane that a uniform buffer fill covers. I propose #1368 lands first; I will then refresh this PR over it, keeping both functions. Depends on now lists #1368 with #9533, #9717 and #9742 (merge order only). Does that order work for you?

@Exorion1er

Copy link
Copy Markdown

Validated e4c2098b48 integrated onto main 2816bd275 (tree b76819dcc5) on Fedora 44, RX 9070 XT / RADV Mesa 26.2.3, GCC 16.2.1 Release.

Focused ctest -R '^agc_.*(depth|fill|storage)' -V with required Vulkan, AnyPS5/Mesa shader caches disabled and Khronos validation:

  • main: 73 passed, 2 skipped, 0 failed;
  • PR: 74 passed, the same 2 skipped, 0 failed, including agc_driver_depth_plane_fill_discard;
  • zero validation errors/VUIDs on both; layer insertion and the RX 9070 XT are confirmed in the logs.

The skips concern imports that cannot retain guest write watching. Disabling nonempty depth-plane discards makes the new regression fail at the full-plane discard assertion; restoring the implementation passes and reproduces byte-identical candidate binaries.

No title/performance run or prerequisite-stack integration tested. AI-assisted validation, measured on this machine.

A uniform fill that a multisample colour target absorbs never reaches
guest memory, so the depth plane it covers keeps its stale results.
The test now also drives storeBufferFill itself.

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

ycbuzi commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

A Windows run of this head with the Radeon iGPU and two NVIDIA cards: Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release. aa144ce8f5 merged onto main d9f5bf4d91 with no conflicts. The set is the new test plus every agc_driver_depth_plane* test (8). One GPU at a time with ANYPS5_GPU, plus ANYPS5_REQUIRE_VULKAN=1 and ANYPS5_NO_SHADER_CACHE=1, run with ctest -V --repeat until-fail:2. Each log's Selected GPU line names the device.

device result
GeForce RTX 4070 SUPER (0x2783), NVIDIA 616.92 7 of 8 pass, both runs
GeForce GTX 1650 SUPER (0x2187), NVIDIA 616.92 7 of 8 pass, both runs
AMD Radeon(TM) Graphics (1002:164e, RDNA2 iGPU), AMD 32.0.21030.2001 7 of 8 pass, both runs
  • agc_driver_depth_plane_fill_discard passes on all three.
  • The one failure is agc_driver_depth_plane_partial_store on every device: repeated lookups of the first layer of an unchanged array proved no refresh. That's AGC: imported depth-plane partial-store test fails refresh-proof assertion on Windows (NVIDIA and AMD) #10664. On main 14c99b52ac, from a separate full build here, it fails the same way on the 1650 and the Radeon, and _unimported passes, as in your 5070 Ti run.
  • No negative control: the new test calls Graphics::DiscardFilledDepthPlanes, so it doesn't build with main's sources.

AI-assisted: yes (Claude Code)

@TechLevelZero

TechLevelZero commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head aa144ce merged onto main 3741ca9 · tested 2026-11-01 10:46 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,427 passed · 3 failed (0 new, 3 also fail on main) · 44 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,474 of 3,121 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (930 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 55.9 s, ⚠️ agc_driver_graphics_maps_fallback 31.0 s
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 (1, not in the main baseline's validation pass)
agc_driver_depth_plane_fill_discard
Validation IDs already present on main (5 IDs in 480 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (480 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 472 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 (44)
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_fresh: 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_f
Reproduce
git fetch origin aa144ce8f5c3411d5f56cf54335e5d3bc18b052c 3741ca9327246d0df81638726a986cef862b6db5
git checkout 3741ca9327246d0df81638726a986cef862b6db5 && git merge --no-ff aa144ce8f5c3411d5f56cf54335e5d3bc18b052c
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.

@orezraey

Copy link
Copy Markdown
Contributor Author

@JAB-dev #13021 and #13023 conflict with this PR in Graphics/include/DepthSurface.hpp and Graphics/src/DepthSurface.cpp: each adds a declaration and a function on the same lines where this PR adds DiscardFilledDepthPlanes. The changes are independent, so I propose yours land first; I will merge main into this branch afterwards and keep both. I added them to Depends on (merge order only).

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@orezraey I found a current-main interaction in the new stale-range rebuild. DiscardFilledDepthPlanes collects only surfaces with AnyStale() and puts only their depth-plane ranges into remaining, then replaces stalePlanes().ranges with it. Current main also uses that index for stencilStale ranges: the existing flush rebuild preserves those separately before checking depth staleness.

After a uniform fill discards one depth plane, this new rebuild can remove an unrelated pending stencil plane from the index while its stencilStale flag remains set. A later read of that stencil range can then return early from FlushDepthPlanes because overlapsStalePlane no longer finds it.

Could you preserve pending stencil ranges when rebuilding the index and add a regression with a stale depth plane plus a separate pending stencil plane? Discard the depth plane, then read the stencil allocation and verify its GPU data is published. Please cover a stencil-only stale surface too. This is a source-path finding in the clean merge with main a644edf30c; I have not reproduced it on a GPU.

orezraey and others added 2 commits November 1, 2026 07:58
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@orezraey

orezraey commented Nov 1, 2026

Copy link
Copy Markdown
Contributor Author

@oneandonlydean You're right: the rebuild in DiscardFilledDepthPlanes dropped pending stencil ranges. 591da8f now keeps them, as the rebuild in FlushDepthPlanes does, and also merges current main (e67cc81869).

agc_driver_depth_plane_fill_discard now covers a stencil-only surface beside the discarded plane and a surface with both planes stale: after the discard the stencil plane is untouched, and a read publishes the GPU value. Without the new line, both cases fail on my RTX 5070 Ti with the read storing nothing. The test passes 3 of 3 runs with validation layers, with no VUID-; on Linux here it only builds and skips, because WSL has no Vulkan device. Tested in the body has the full results.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 591da8f merged onto main f2d874c · tested 2026-11-01 22:57 UTC · 31 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,446 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,499 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 (937 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.4 s, ⚠️ agc_driver_graphics 30.7 s
Intermittent validation messages (1, seen once in the parallel run, not reproduced when the test was re-run alone 2 times; not counted against this PR)
agc_driver_depth_clear_hle: VUID-vkCmdCopyBuffer-commonparent (6x)
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_depth_clear_hle: failed in 1 of the last 10 main runs
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress: failed in 5 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
Validated but not compared (1, not in the main baseline's validation pass)
agc_driver_depth_plane_fill_discard
Validation IDs already present on main (5 IDs in 483 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (483 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 475 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 591da8f4dfbc4fdaa3cc5618d638a9ae75c04e97 f2d874c1fdccf781c0fa5d86619bb5dd8894b958
git checkout f2d874c1fdccf781c0fa5d86619bb5dd8894b958 && git merge --no-ff 591da8f4dfbc4fdaa3cc5618d638a9ae75c04e97
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.

# Conflicts:
#	core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
#	core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 2, 2026
@TechLevelZero

TechLevelZero commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 4aaafb9 merged onto main 1c8c0ef · tested 2026-11-04 05:18 UTC · 24 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,711 passed · 6 failed (0 new, 3 also fail on main, 3 unstable on main) · 50 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,767 of 3,842 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 (945 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 (3, 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_submit_progress: failed in 5 of the last 10 main runs
agc_submit_progress_no_timeline: 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
Validated but not compared (1, not in the main baseline's validation pass)
agc_driver_depth_plane_fill_discard
Validation IDs already present on main (8 IDs in 527 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (527 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 519 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-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 (50)
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_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
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
vide
Reproduce
git fetch origin 4aaafb972c8571a7a773979867a64cc08def8f68 1c8c0efc8c41314402e6966da5bef6ea3d639d10
git checkout 1c8c0efc8c41314402e6966da5bef6ea3d639d10 && git merge --no-ff 4aaafb972c8571a7a773979867a64cc08def8f68
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 4aaafb9 merged onto main a4eca2a · tested 2026-11-02 20:57 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,600 passed · 11 failed (0 new, 10 also fail on main, 1 unstable on main) · 53 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,664 of 3,591 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 (968 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.2 s, ⚠️ agc_driver_graphics 95.5 s, ⚠️ agc_driver_image_sample_unnormalized 38.0 s, ⚠️ public_headers 37.4 s, ⚠️ agc_driver_lazy_resolved_abi_switch_set 35.6 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 4 of the last 6 main runs
Failing on main too (10, not counted against this PR)
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_idle_publish_wait
agc_submit_progress
agc_submit_progress_no_timeline
guest_socket_options_multicast
Validated but not compared (1, not in the main baseline's validation pass)
agc_driver_depth_plane_fill_discard
Validation IDs already present on main (4 IDs in 510 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (510 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 502 more
VUID-vkCmdCopyImage-srcImage-01548 (6 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (6 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, 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 (53)
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_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_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
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_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_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 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: DisplayWind
Reproduce
git fetch origin 4aaafb972c8571a7a773979867a64cc08def8f68 a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8
git checkout a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8 && git merge --no-ff 4aaafb972c8571a7a773979867a64cc08def8f68
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.

@oneandonlydean
oneandonlydean merged commit 068e711 into boykopovar:main Nov 4, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc*

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants