Skip to content

fix(agc): keep a settled import compared while a storage image overlaps it - #7476

Merged
oneandonlydean merged 2 commits into
boykopovar:mainfrom
EagleBearerYS:fix/agc-settle-rewatch-live-images
Oct 18, 2026
Merged

oneandonlydean merged 2 commits into
boykopovar:mainfrom
EagleBearerYS:fix/agc-settle-rewatch-live-images

Conversation

@EagleBearerYS

@EagleBearerYS EagleBearerYS commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

What

A regression from our #6678. On Windows, a storage image can lose its GPU results when the 64 KiB block under it returns to the write watch, not only split a render pass.

How it happens (main 3de84fa):

  1. Since perf(agc): settle Windows imports under 1 MiB without waiting #6678, a Windows host import under 1 MiB is compared until its deferred settle read completes. Then a lookup returns its 64 KiB blocks to the write watch, and GuestMemory::Rewatch stamps every block as a CPU store (GuestMemory.cpp:1325-1340).
  2. The return waited only while storage results were already pending over the import (StorageTexture::AnyPendingOverlaps, GuestBufferMemory.cpp:1064).
  3. A storage image's first upload takes its generation (Texture.cpp:2176) and then imports its block (Texture.cpp:2253). A recorded draw marks its targets pending only once it is recorded (Draw.cpp:1574), and the settle is polled at the import lookups in between (GuestBufferMemory.cpp:1396, 3004). So the stamp can land after the image's generation and before its results are pending.
  4. The image's next refresh then takes the stamp for a CPU store over its results (Texture.cpp:1927-1934), drops them (1963-1965) and uploads the guest bytes again (1997). It prints:
    [gpu] storage image 0x…: guest memory changed while GPU results were pending; keeping the CPU's blocks
    

Where it showed: thuanquang bisected agc_driver_address_passes failing on an RX 6700 XT to #6678 (#7414). On an RTX 3070, main 3de84fa fails it 3 of 3 runs, "2 address-based draws, 2 began a pass, 0 continued one", with the line above, and passes 3 of 3 with APS5_NO_DEFERRED_SETTLES=1. In that test both draws render the same pixels, so only the pass count shows the loss.

The change:

  • A settled import that a live storage image overlaps now stays compared, as every import under 1 MiB was before perf(agc): settle Windows imports under 1 MiB without waiting #6678 (StorageTexture::AnyLiveOverlaps). Imports with no image over them still return to the write watch.
  • Keeping the import compared, rather than waiting for the image to go, checks each settled import against the live images once instead of at every poll.
  • The [buffers] profile line counts the imports kept compared.
  • ARCHITECTURE.md and the libSceAgcDriver debt entry say so.

What it leaves as it is:

  • Images made over an import that was already compared: their generation is 0, since CollectWrites returns 0 outside the watch, so the drop rule never applied to them.
  • Imports of 1 MiB or more, which are settled inside their window, and Linux, where Rewatch does nothing.

Related: #7414

Tested

  • An RTX 3070 Laptop GPU, Windows 11, NVIDIA 617.42 (VK_LOADER_DRIVERS_SELECT='*nv*', one device):

    • Red: with only rewatchSettledImports back as on main (the test, AnyLiveOverlaps and the counter kept), agc_import_settle_storage_image fails 3 of 3 runs: "(i) the refresh after the image's GPU results dropped 16384 of 16384 texels: the import's return to the write watch stamped its block as a CPU store after the image took its generation".
    • Green: with the fix, 13 tests pass in each of 3 full runs: the new test ("the image's import stayed compared after its settle read (0 back in the write watch, 1 kept compared); … lost 0 of 16384 texels"), agc_driver_address_passes and agc_driver_address_passes_targets_split, perf(agc): settle Windows imports under 1 MiB without waiting #6678's agc_import_settle_deferred, agc_import_settle_deferred_other_family, agc_import_settle_first_use and agc_import_settle_retire, agc_import_watch, agc_import_watch_other_family, agc_write_tracking, agc_storage_cpu_snapshot, agc_host_import_retire and agc_driver_host_import_windows.
    • agc_driver_address_passes passes with deferred settles on.
  • An RTX 5070 Ti, Windows 11 Pro 26200, NVIDIA 617.42, run by Scramblrrrr on their integration tree 8e0bd2c with this PR's 3ea0be6 merged in, ANYPS5_REQUIRE_VULKAN=1 (comment):

    • with only rewatchSettledImports back as on their tree, agc_import_settle_storage_image fails: 1 import back in the watch, 0 kept compared, 16384 of 16384 texels lost;
    • with the fix, 14 import, watch and address-pass tests pass with none skipped, and so do 65 tests in all, among them the new test and the shader memory, image table, relocation, storage ordering, depth dispatch and HDR tests.
  • NVIDIA GeForce RTX 2060 and GTX 1650 (driver 32.0.16.1088) and Intel UHD Graphics 770 (32.0.101.6129), Windows 11, run by jacob6769 with this PR's code changes on main 9caecfd (its docs left out), WinLibs GCC 15.2.0, Release, ANYPS5_REQUIRE_VULKAN=1 (comment). agc_driver_address_passes, 40 runs per cell:

    GPU main main + test(agc): measure address passes over settled host imports #7414 main + this PR
    RTX 2060 6 and 15 of 40 failed (two series) 0 of 40 0 of 40
    GTX 1650 15 of 40 failed 0 of 40 0 of 40
    UHD Graphics 770 0 of 40 0 of 40 0 of 40
    • On the two NVIDIA GPUs the failure is intermittent, with the same two lines and the pending-results line before them, so a 3-run check can pass by chance. With this PR, agc_import_settle_storage_image passes 10 of 10 on both, and the ten agc_import_* and address-pass tests pass on each.
    • On the Intel GPU every agc_import_settle_* test skips, the new one included.
  • GitHub's Linux (lavapipe, Mesa 25.2.8) and Windows runners (verify run): both build, and libc and libkernel pass on both. The new test is registered only on Windows, where GitHub's runner has no Vulkan device, so it skips there.

  • Windows, the full CI build (fork Build): 1469 of 1469 tests pass, the new one skipping, and check_skips passes.

  • Linux, a run that mirrors CI's Linux job (a cloud machine, Ubuntu 24.04, GCC 13.3, Mesa lavapipe 25.2.8 with LLVM 20.1.2): main 3de84fa and this branch have the same 1,437 tests, with no status changes. The 5 failures on both are that machine's IPv6 tests. One of the branch's two full runs also failed guest_avplayer, which doesn't link the AGC driver; it passed in the other run and in 20 of 20 reruns. agc_import_watch, agc_driver_address_passes and agc_driver_address_passes_targets_split pass 20 of 20 runs each.

  • New test, agc_import_settle_storage_image (Windows with a GPU): an image whose first upload imports its 64 KiB block waits for the import's settle read, is cleared to red on the GPU, then refreshed and stored. Every texel must be red, and the import must have stayed compared. On the old code the refresh drops the clear.

  • Not tested: a title; AMD hardware; the settle path on Intel, where its tests skip.

Checklist

  • Based on main 3de84fa; no other open PR implements the same functions. Overlaps (git merge-tree with each PR merged into main cb1d6e5), both in docs, in adjacent lines where both sides stay:
  • 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 (none added)
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 3070 Laptop GPU (driver 617.42), Windows 11; Mesa lavapipe 25.2.8 (llvmpipe, LLVM 20.1.2), Linux (GitHub's runner and a cloud machine)
  • AI-assisted: yes

…ps it

Since boykopovar#6678, a Windows host import under 1 MiB returns to the write watch
once its deferred settle read has completed, and GuestMemory::Rewatch
stamps every block of it as a CPU store. The return waited only while
storage results were pending over the import. A storage image can take
its generation before the stamp and have results pending only after it:
an image's first upload takes its generation and then imports its block,
a recorded draw marks its targets pending once it is recorded, and the
settle is polled at the import lookups between the two. The image's
next refresh then takes the stamp for a CPU store over its results,
drops them and uploads the guest bytes again, so the GPU's output is
lost. On an RTX 3070 this also splits the first two draws of
agc_driver_address_passes into two passes.

A settled import that a live storage image overlaps now stays compared,
as every import under 1 MiB was before boykopovar#6678. Imports with no image over
them still return to the write watch. Keeping the import compared, rather
than waiting for the image to go, checks each settled import against the
live images once instead of at every poll. The [buffers] line counts the
imports kept compared.

agc_import_settle_storage_image makes an image whose first upload imports
its block, waits for the settle read, clears the image on the GPU, then
refreshes and stores it. On the old code the refresh drops the clear.
ARCHITECTURE.md and the libSceAgcDriver debt entry now say that a
settled Windows import under 1 MiB returns to the write watch only when
no storage image overlaps it, and why.
@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

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

Pull request Conflicting files (lines on main) Same exports Same new files
PR 6763 docs/dev/ARCHITECTURE.md L113-114
PR 7432 docs/dev/debt/libSceAgcDriver.md L84-85
PR 7505 docs/dev/debt/libSceAgcDriver.md L84-86

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 1191 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 1324 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 1341 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4448 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4449 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 4650 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 4891 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 5058 docs/dev/debt/libSceAgcDriver.md
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5372 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 5426 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5499 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 5609 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 5958 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5998 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 5999 docs/dev/debt/libSceAgcDriver.md
PR 6044 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
PR 6054 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6082 core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6176 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6177 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 6185 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6194 docs/dev/debt/libSceAgcDriver.md
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6222 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6259 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6292 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6320 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6360 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6373 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6414 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6472 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6490 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6499 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6503 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/ARCHITECTURE.md
PR 6529 docs/dev/debt/libSceAgcDriver.md
PR 6535 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6539 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6548 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6553 core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6563 docs/dev/debt/libSceAgcDriver.md
PR 6615 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
PR 6727 docs/dev/debt/libSceAgcDriver.md
PR 6747 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6783 docs/dev/debt/libSceAgcDriver.md
PR 6786 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6788 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/libSceAgcDriver.md
PR 6867 docs/dev/debt/libSceAgcDriver.md
PR 6868 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6905 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6931 docs/dev/ARCHITECTURE.md
PR 6946 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6947 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/ARCHITECTURE.md
docs/dev/debt/libSceAgcDriver.md
PR 6955 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 6971 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
PR 6977 core/libs/prx/libSceAgcDriver/Graphics/include/Texture.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/Texture.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7201 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 7223 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7250 docs/dev/debt/libSceAgcDriver.md
PR 7292 core/libs/prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 7332 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
docs/dev/debt/libSceAgcDriver.md

@Scramblrrrr

Copy link
Copy Markdown
Contributor

I am preparing a Windows/RTX 5070 Ti (617.42) cross-test of 3ea0be6 on our pinned 007 integration c872fab (base main e5c2b3c plus the public shared-table/resource stack). Current title logs contain the pending-GPU-results/CPU-blocks diagnostic, but I am not attributing each occurrence to this race without the synthetic check. I will first run the new regression and the import/watch/address-pass controls, then report title rendering and counters separately. No duplicate fix from me. A separate opt-in wave64 trial is active now, so no builds or GPU tests will overlap it. AI-assisted: Codex.

@Scramblrrrr

Copy link
Copy Markdown
Contributor

Windows cross-test of #7476 head 3ea0be6 on integration 8e0bd2c (pushed codex/first-light-oct18-current), RTX 5070 Ti / NVIDIA 617.42, Windows 11 Pro 26200: all 14 targeted import/watch/address-pass controls passed, 7.51 s, zero skips, ANYPS5_REQUIRE_VULKAN=1. With only rewatchSettledImports restored to the integration parent, the unchanged new agc_import_settle_storage_image fails in 0.42 s: 1 back in the watch / 0 kept compared, 16384 of 16384 texels lost. The restored fix then passes the broader 65-control set in 28.84 s, zero skips, including the new regression, shader memory, image tables, relocation, storage ordering, depth dispatch and HDR.

Qualification: my first post-negative restore preserved an older file timestamp, so Ninja reused the negative object and that intermediate run still failed. I corrected the timestamp, verified GuestBufferMemory.cpp was compiled again, and obtained the final 65/65 result above. This was a local build-state error, not a claimed source regression. No game was running during builds/native checks.

Source merged cleanly; two documentation conflicts were resolved preserving our existing draw-input/store-range notes and this PR's live-image-overlap wording. Matched patched modules are now staged for the title cross-test; no title rendering/FPS result yet. Prior baseline and wave trial each contain eight pending-results/CPU-blocks diagnostics, but I have not attributed those occurrences to this race. Raw title data stays local. AI-assisted: Codex.

@jacob6769

Copy link
Copy Markdown

Cross-test of 3ea0be6's code changes (docs left out, they conflict on main 9caecfd) on older NVIDIA GPUs and on Intel. Windows 11, WinLibs GCC 15.2.0 Release, ANYPS5_GPU selects the device, ANYPS5_REQUIRE_VULKAN=1.

agc_driver_address_passes, 40 runs per cell:

GPU (driver) main main + #7414 main + this PR
NVIDIA GeForce RTX 2060 (32.0.16.1088) 6/40 and 15/40 failed 0/40 0/40
NVIDIA GeForce GTX 1650 (32.0.16.1088) 15/40 failed 0/40 0/40
Intel UHD Graphics 770 (32.0.101.6129) 0/40 0/40 0/40

On these Turing GPUs the failure is intermittent, with the same two lines and the pending-results/CPU-blocks line before them, so a 3-run check can pass by chance; with this PR it passed every run. agc_import_settle_storage_image passed 10 of 10 on both NVIDIA GPUs, and the ten agc_import_* and address-pass controls passed on each. On the Intel GPU every agc_import_settle_* test, the new one included, reports a skip, which fits main never failing there.

AI-assisted: Claude.

@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@jacob6769 thank you for 40 runs per cell on three GPUs: that's what shows an intermittent failure a 3-run check can miss, and it's now in the description. One note for anyone applying it the same way: the PR merges cleanly as a branch, and only its debt-file hunk fails as a patch on main 9caecfd, because #7271 and #5390 changed the lines around it in docs/dev/debt/libSceAgcDriver.md after this branch's base.

@oneandonlydean
oneandonlydean merged commit 7a2e4a4 into boykopovar:main Oct 18, 2026
13 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