Skip to content

main: PPSA01746, PPSA01530 and PPSA03001 still stop at the storage-image write-back throw after #5657 #5693

Closed

Description

@xXPBSXx

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

Related: #5024, #5596, #5657.

AI-assisted (Claude Code).

Activity

  1. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    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: main 31bfc4e8693d86318824d83c47cfa418703a7cc8, which contains #5657 (db4fd5f29), no other PR, no stub. ninja -j 8 libs exit code 0 with a full library rebuild; title executable app.exe dated 2026-10-14 07:48:26, relinked by another session with the relinker built from e46c69505 (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).

  2. oneandonlydean commented on Oct 14, 2026

    @oneandonlydean
    Collaborator

    Your debug line (gen=0 orig=0 on 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).

  3. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    Correction to my comment above: PPSA26223 is not Palworld. The param.json of that title folder (titleId PPSA26223, read with K:\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.err lines 124 and 159, main 31bfc4e8693d86318824d83c47cfa418703a7cc8, compute shader 0x107a90c000.

    AI-assisted (Claude Code).

  4. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    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:

    • the log has 8 lines [gpu] storage image 0x...: guest memory changed while GPU results were pending; keeping the CPU's blocks (lines 102-109 of PPSA01746_rW/run_113600.err, 744 lines counted with Python), and no line containing storing storage;
    • the title then stops at line 115-118:
    [videoout] presentation failed: buffer descriptor uses an unsupported type
    terminate called after throwing an instance of 'std::runtime_error'
      what():  buffer descriptor uses an unsupported type
    FATAL: abort() (SIGABRT)
    

    The same message exists twice on main: ResourceMaterializer.cpp:590 (decoded.Type() != 0u) and ShaderResources.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 the ResourceMaterializer.cpp:590 side, see the earlier notes.)

    Tested

    Windows 10 (19045), MinGW-w64 GCC 15.2, Release, NVIDIA GeForce RTX 4080 SUPER. Merge tree d92cb157aa0cf704cd0db43070694810a778accb = main 0b97f8b9f5ef774700e59d46da8a8d19a03380cf + #5679 (f05086278db6d0059e392d57572d86c0df14e9a5) + #5707 (3eb19d9f2375f26948f63417eb195e7cf0454a40). ninja -j 8 libs exit code 0 (script times 11:34:04 to 11:35:34), 128 .prx (libSceAgcDriver.prx 11:35:33); nid_patcher dated 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 executable PPSA01746_rW/app.exe, a hardlink of PPSA01746_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).

  5. oneandonlydean commented on Oct 14, 2026

    @oneandonlydean
    Collaborator

    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:590 or ShaderResources.cpp:2901) would help. #5760 covers the rest of this throw (a write-back done on the GPU over unwatched memory); #5761 is main with #5671, #5679, #5707 and #5760 applied (branch oneandonlydean:test/storage-writeback-1014, full build green) if you can rerun PPSA01530 and PPSA03001 on it.

  6. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    Results for PR #5761 (head 25cc5e6d2a776ed6f7ec3c0ec2c21cc59553727d) and the answer to "which of the two buffer descriptor uses an unsupported type throws fires".

    #5761, Sifu (PPSA03001) and Puyo Puyo Tetris 2 (PPSA01530)

    • Sifu: no storing storage image results pending ... throw, no what(), no FATAL in PPSA03001_rX/run_125133.err (61 lines, counted with Python). The log has 8 storage image ...: guest memory changed while GPU results were pending; keeping the CPU's blocks lines 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.
    • Puyo: no write-back throw either; the run stops at what(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type (PPSA01530_rX/run_124852.err line 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.err line 10, 491 lines). So for Puyo it is ResourceMaterializer.cpp:590 (decoded.Type() != 0u), not ShaderResources.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.err lines 125-128, 761 lines). On main + #5679 + #5707 the earlier Kena run stopped at buffer 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.

    • Test build: storage-image write-back fixes combined (do not merge) #5761 runs: tree = head 25cc5e6d2 exactly (no merge), ninja -j 8 libs exit 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).
    • Puyo call-site run: main 9a3e2ac4daf8fea81914ceb27d35afc9ece87569 + the local error-text change, ninja -j 8 libs exit 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).
    • Title executables are hardlinks of the _rH relinked 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).

  7. MarcZX10 commented on Oct 14, 2026

    @MarcZX10
    Contributor

    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's decoded.Type() != 0 check, 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 on main, a current-main Puyo run should show whether this stop is covered before opening a separate fix.

  8. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    Thanks, MarcZX100. By the code #5828 does not cover the Puyo Puyo Tetris 2 (PPSA01530) stop:

    • fix(agc): treat a TYPE 1 T# in a read-only static image slot as null #5828 adds nonImageDescriptor(descriptor) (rawImageType(descriptor) <= 1, bits 31:28 of T# dword 3) in materializeSnapshot, i.e. it nulls a static image slot whose T# has type 0 or 1.
    • The Puyo stop is in materializeTables, the loop over plan.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 shader 0x1417c4300 (PPSA01530_rX/run_143236.err line 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.
    • The slot's dwords: not yet backed by a log line of the cited run. A diagnostic run that prints slot and dwords before the throw (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).

  9. xXPBSXx commented on Oct 14, 2026

    @xXPBSXx
    ContributorAuthor

    Follow-up with the measured words and a run on main + #5828 (Puyo Puyo Tetris 2, PPSA01530).

    • The slot's dwords, printed by a local diagnostic line in front of the throw (not part of any PR) on Test build: storage-image write-back fixes combined (do not merge) #5761's head 25cc5e6d2: [diag-v] RM:590 slot 0 of 1 shader 1417c4300 dwords 02100b00 c3c00000 010dc1df 91b00fac (PPSA01530_rX/run_155458.err line 9, followed by what(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type at line 11). Dword 3 = 0x91B00FAC: bits 31:30 = 2 (the buffer TYPE field that Type() != 0u rejects), bits 31:28 = 9, which is not 0 or 1, so nonImageDescriptor in 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.
    • Run on main 28b6f1987917e59f3a7bbcad4d0acb8b0f58b519 + fix(agc): treat a TYPE 1 T# in a read-only static image slot as null #5828 head 8176ed51357a903642efb1d1ccda15294d558e67 (merge tree 72f7785c1f3b09a672c9423f65d754440ed88046): Puyo still stops with what(): compute shader 0x1417c4300: buffer descriptor uses an unsupported type (PPSA01530_rX/run_160202.err line 48, 48 lines in the file). ninja -j 8 libs exit 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).

  10. oneandonlydean commented on Oct 14, 2026

    @oneandonlydean
    Collaborator

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions