Repository navigation
main: PPSA01746, PPSA01530 and PPSA03001 still stop at the storage-image write-back throw after #5657 #5693
Description
What
On Windows main after #5657, three titles stop with the same message:
[videoout] presentation failed: AGC graphics: storing storage image results pending over memory outside the write watch without the guest bytes saved before them is not implemented
terminate called after throwing an instance of 'std::runtime_error'
The throw is Require(!unsavedOutsideWatch, ...) in Texture.cpp (two places; introduced as a deliberate refusal in e544993, #5024; the case #5657 handles is a range that leaves the write watch while results are pending).
| Title | main (tested) | Log line | Log |
|---|---|---|---|
| Kena: Bridge of Spirits (PPSA01746) | 6546a33944f690a7ae5b3cb60a2fbf325264e085 |
109-112 | PPSA01746_rS/run_081410.err |
| Puyo Puyo Tetris 2 (PPSA01530) | cd936f6373214102c774a53d32a724b5b30f3590 |
9-12 | PPSA01530_rS/run_081930.err |
| Sifu (PPSA03001) | a94675fb17dd5b7775cd2960200a25bba41ab29f |
44, 82 | PPSA03001_rS/run_082530.err |
One run each; the throw ended the run in all three.
A debug print of the refusal on top of #5657 (Kena, PPSA01746_rC/run_065827.err line 112, a separate run on main 90d0cb481 with the #5657 head e56a7c235): tracked=0 base=138366484480 (0x2037490000) guestBytes=196608 trackedLayers=3 watched=0 L0{gen=0 orig=0 cmp=0} L1{gen=0 orig=0 cmp=0} L2{gen=0 orig=0 cmp=0}. So here the three 64 KiB units of the image were never write-watched, have no write generation and no saved guest bytes; this is the "units without a write generation" case that the debt entry of #5657 lists. That diagnostic run used a partial libs set (only libSceAgcDriver.prx rebuilt on the tree of main 90d0cb481 plus the #5657 head; the other 127 .prx from the 2026-10-14 06:23 build of main f919033ac) and the Kena executable relinked on 2026-10-12 06:06 with an older relinker (relink command not recorded). Why layerOriginal is false before the write-back is not established. One more Kena run with a pending-trace did not reach the throw within 5 minutes, so it depends on the run.
Tested
Windows 10 (19045), MinGW-w64 GCC 15.2, Release, NVIDIA GeForce RTX 4080 SUPER. For each title: ninja -j 8 libs exit code 0, 128 .prx (libSceAgcDriver.prx rebuilt for that run, libkernel/libc rebuilt, oldest .prx dated 2026-10-13 09:50, which ninja libs did not rebuild), nid_patcher 2026-10-14 08:00:09; run with run_title.ps1, one game at a time. Title executables: relinked by B with the relinker built from e46c69505 (relinker.exe dated 2026-10-14 07:21:30, K:\AnyPS5\tmp\relink_all_H.log), command per title relink_title.ps1 -Id <PPSA> -ElfDir 'K:\AnyPS5\tmp\elfH\<PPSA>' -ModuleDir @() -Suffix H -Repo 'K:\AnyPS5\wt-audit'; app.exe dated 07:29:50 (Kena), 07:28:41 (Puyo Puyo Tetris 2), 07:34:51 (Sifu) on 2026-10-14.
Not tested: Linux, other GPUs, other titles, a second run per title.
Behind the throw (local experiment, not a fix)
With both Require calls removed locally (main 52283005901c186b43152b195a4a9d99a5b3734d, same libs procedure and executables), the next stops are: Kena runtime image descriptor is invalid (ResourceMaterializer.cpp:496, run_083039.err lines 124-126), Puyo Puyo Tetris 2 compute shader 0x1417c4300: buffer descriptor uses an unsupported type, Sifu the Unreal watchdog GameThread timed out waiting for RenderThread after 120.00 secs (PPSA03001_rT/run_084033.out lines 5923-5926). This tells what follows the throw; it is not proposed as a fix, since the throw protects CPU writes (#5024).
AI-assisted (Claude Code).
Activity
xXPBSXx commentedon Oct 14, 2026
A fourth title stops at the same throw on
main: Palworld (PPSA26223), Windows 10 (19045), RTX 4080 SUPER, one run.PPSA26223_rU/run_100351.err(160 lines, counted with Python), lines 124 and 159:what(): compute shader 0x107a90c000: AGC graphics: storing storage image results pending over memory outside the write watch without the guest bytes saved before them is not implemented. Here the trigger is a compute shader (the other three titles stop in a graphics path).Tree:
main31bfc4e8693d86318824d83c47cfa418703a7cc8, which contains #5657 (db4fd5f29), no other PR, no stub.ninja -j 8 libsexit code 0 with a full library rebuild; title executableapp.exedated 2026-10-14 07:48:26, relinked by another session with the relinker built frome46c69505(relink_all_H.log);run_title.ps1, one game at a time; script start 10:03:49, end 10:05:05 local time.Not tested: a second run, Linux, other GPUs.
AI-assisted (Claude Code).
oneandonlydean commentedon Oct 14, 2026
Your debug line (
gen=0 orig=0on all three units) is the case #5679 handles: units with no write generation. Could you try Kena on current main with #5679 and #5707 applied? #5707 covers the other way the saved bytes went missing (a fill or copy dropping them for units it never touched).xXPBSXx commentedon Oct 14, 2026
Correction to my comment above: PPSA26223 is not Palworld. The
param.jsonof that title folder (titleIdPPSA26223, read withK:\AnyPS5\Games\list_titles.py) names it The Mound: Omen of Cthulhu. I took the name from a wrong note. The log lines, the tree and the result in that comment are unchanged:PPSA26223_rU/run_100351.errlines 124 and 159,main31bfc4e8693d86318824d83c47cfa418703a7cc8, compute shader0x107a90c000.AI-assisted (Claude Code).
xXPBSXx commentedon Oct 14, 2026
Thanks, I tested Kena: Bridge of Spirits (PPSA01746) with #5679 and #5707 merged into current
main.Result (one run)
The write-back throw is gone. The run no longer stops at
storing storage image results pending over memory outside the write watch ... is not implemented. Instead:[gpu] storage image 0x...: guest memory changed while GPU results were pending; keeping the CPU's blocks(lines 102-109 ofPPSA01746_rW/run_113600.err, 744 lines counted with Python), and no line containingstoring storage;The same message exists twice on
main:ResourceMaterializer.cpp:590(decoded.Type() != 0u) andShaderResources.cpp:2901(Require(descriptor.Type() == 0u, ...)). The text does not say which one fired; I did not capture that. (PPSA01530 hits the same message on theResourceMaterializer.cpp:590side, see the earlier notes.)Tested
Windows 10 (19045), MinGW-w64 GCC 15.2, Release, NVIDIA GeForce RTX 4080 SUPER. Merge tree
d92cb157aa0cf704cd0db43070694810a778accb=main0b97f8b9f5ef774700e59d46da8a8d19a03380cf+ #5679 (f05086278db6d0059e392d57572d86c0df14e9a5) + #5707 (3eb19d9f2375f26948f63417eb195e7cf0454a40).ninja -j 8 libsexit code 0 (script times 11:34:04 to 11:35:34), 128.prx(libSceAgcDriver.prx 11:35:33);nid_patcherdated 08:00:09.run_title.ps1, one game at a time, 280 s requested; script times 11:35:56 to 11:50:23 (includes the wait for the run mutex). One run only. Title executablePPSA01746_rW/app.exe, a hardlink ofPPSA01746_rH/app.exe(dated 07:29:50); the relinker commit and relink command for it are not recorded in my notes.Not tested: Linux, other GPUs, a second run, #5679 or #5707 alone, a picture of the title.
AI-assisted (Claude Code).
oneandonlydean commentedon Oct 14, 2026
Thanks @xXPBSXx, that's the confirmation we needed: #5679 and #5707 are going in. The next stop,
buffer descriptor uses an unsupported type, is a separate one; a new issue with which of the two sites fires (ResourceMaterializer.cpp:590orShaderResources.cpp:2901) would help. #5760 covers the rest of this throw (a write-back done on the GPU over unwatched memory); #5761 ismainwith #5671, #5679, #5707 and #5760 applied (branchoneandonlydean:test/storage-writeback-1014, full build green) if you can rerun PPSA01530 and PPSA03001 on it.xXPBSXx commentedon Oct 14, 2026
Results for PR #5761 (head
25cc5e6d2a776ed6f7ec3c0ec2c21cc59553727d) and the answer to "which of the twobuffer descriptor uses an unsupported typethrows fires".#5761, Sifu (PPSA03001) and Puyo Puyo Tetris 2 (PPSA01530)
storing storage image results pending ...throw, nowhat(), no FATAL inPPSA03001_rX/run_125133.err(61 lines, counted with Python). The log has 8storage image ...: guest memory changed while GPU results were pending; keeping the CPU's blockslines and, at line 60,[gpu] deferred write-back failed: AGC graphics: rect-list requires finite nondegenerate axis-aligned positions with equal positive W(a message, not an abort). The run ended without an abort line; I did not check the picture.what(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type(PPSA01530_rX/run_124852.errline 48, 49 lines).Which throw fires (Puyo)
I added a local print-free change that only appends the call site to the two error texts (not part of any PR) and ran Puyo on current
main:what(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type [DIAG ResourceMaterializer.cpp:590](PPSA01530_rX/run_143236.errline 10, 491 lines). So for Puyo it isResourceMaterializer.cpp:590(decoded.Type() != 0u), notShaderResources.cpp:2901.For Kena (PPSA01746) on #5761 the same local change was in the tree, but the run did not reach this message: it stopped at
AGC graphics: shader buffer exceeds descriptor range limit(ShaderResources.cpp:2908;PPSA01746_rX/run_125836.errlines 125-128, 761 lines). Onmain+ #5679 + #5707 the earlier Kena run stopped atbuffer descriptor uses an unsupported type; which of the two sites fired there was not recorded.Public AMD register definitions list only TYPE 0 as a valid buffer resource (1..3 reserved) and use bits 31:28 as the image type for T#s (see the sources in
win_drafts_B\quelle_v_sharp_type.md, by session B). That points at a descriptor read from the wrong place rather than a new buffer mode, but this is an inference from public GFX7/GFX10 headers; PS5-specific layouts are not verified.Tested
Windows 10 (19045), MinGW-w64 GCC 15.2, Release, NVIDIA GeForce RTX 4080 SUPER.
25cc5e6d2exactly (no merge),ninja -j 8 libsexit 0,run_title.ps1, one game at a time, 240 s requested, one run each. Puyo script times 12:48:51-12:49:22, Sifu 12:51:32-12:55:39, Kena 12:58:28-13:00:59 (Kena with the local error-text change).main9a3e2ac4daf8fea81914ceb27d35afc9ece87569+ the local error-text change,ninja -j 8 libsexit 0 (14:29:17 to 14:32:28), 120 s requested, script times 14:32:35 to 14:50:31 (includes the wait for the run mutex)._rHrelinked executables; the relinker commit and command for them are not recorded in my notes.Not tested: Linux, other GPUs, a second run, a picture of any title.
AI-assisted (Claude Code).
MarcZX10 commentedon Oct 14, 2026
The Puyo follow-up may overlap the new PR #5828. That PR handles a static image slot whose T# has type 0 or 1, and its regression uses an S# followed by a V#; it changes
ResourceMaterializer.cpp. Your Puyo trace identifies that file'sdecoded.Type() != 0check, but does not yet show whether the descriptor is the same type/slot shape, so I would treat the overlap as possible rather than confirmed. Once #5828 is onmain, a current-main Puyo run should show whether this stop is covered before opening a separate fix.xXPBSXx commentedon Oct 14, 2026
Thanks, MarcZX100. By the code #5828 does not cover the Puyo Puyo Tetris 2 (PPSA01530) stop:
nonImageDescriptor(descriptor)(rawImageType(descriptor) <= 1, bits 31:28 of T# dword 3) inmaterializeSnapshot, i.e. it nulls a static image slot whose T# has type 0 or 1.materializeTables, the loop overplan.info.buffers(ResourceMaterializer.cpp:590,decoded.Type() != 0u, bits 31:30 of the buffer descriptor's dword 3). The slot is a buffer slot of compute shader0x1417c4300(PPSA01530_rX/run_143236.errline 10, call site printed by a local text change), not an image slot, and fix(agc): treat a TYPE 1 T# in a read-only static image slot as null #5828 does not touch that loop.diag2, Puyo) is queued; I will add the printed words and the log line, so no value is claimed here.A run on
main+ #5828 will confirm or refute this; I will post the result when the run is done.AI-assisted (Claude Code).
xXPBSXx commentedon Oct 14, 2026
Follow-up with the measured words and a run on
main+ #5828 (Puyo Puyo Tetris 2, PPSA01530).25cc5e6d2:[diag-v] RM:590 slot 0 of 1 shader 1417c4300 dwords 02100b00 c3c00000 010dc1df 91b00fac(PPSA01530_rX/run_155458.errline 9, followed bywhat(): compute shader 0x1417c4300: buffer descriptor uses an unsupported typeat line 11). Dword 3 =0x91B00FAC: bits 31:30 = 2 (the buffer TYPE field thatType() != 0urejects), bits 31:28 = 9, which is not 0 or 1, sononImageDescriptorin fix(agc): treat a TYPE 1 T# in a read-only static image slot as null #5828 would not null these words even if they sat in an image slot.main28b6f1987917e59f3a7bbcad4d0acb8b0f58b519+ fix(agc): treat a TYPE 1 T# in a read-only static image slot as null #5828 head8176ed51357a903642efb1d1ccda15294d558e67(merge tree72f7785c1f3b09a672c9423f65d754440ed88046): Puyo still stops withwhat(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type(PPSA01530_rX/run_160202.errline 48, 48 lines in the file).ninja -j 8 libsexit 0 (15:55:27 to 16:01:45),run_title.ps1, 120 s requested, script times 16:02:00 to 16:07:05 (includes the wait for the run mutex); one run; RTX 4080 SUPER, Windows 10 (19045), MinGW-w64 GCC 15.2, Release.So #5828 does not cover this stop. Not tested: Linux, other GPUs, a second run, a picture.
AI-assisted (Claude Code).
oneandonlydean commentedon Oct 14, 2026
Fixed by #5679, #5707 and #5760 (merged): Kena and Sifu no longer stop on this throw. Puyo Puyo Tetris 2's next stop (
buffer descriptor uses an unsupported type) is tracked in #3709.