Skip to content

GTA V (PPSA04264) stops before the menu: color export format 4 into an unsigned integer target is unsupported #11513

Closed

Description

@tibzejoker

What happens

Grand Theft Auto V stops before its main menu on current main, every run:

[videoout] presentation failed: AGC graphics: color export format 4 into an unsigned integer target is unsupported
terminate called after throwing an instance of 'std::runtime_error'
  what():  AGC graphics: color export format 4 into an unsigned integer target is unsupported

The check was added by #9789 (State.cpp, ColorExportPacking::Uint). Before it, this draw ran.

Title, test or build step

PPSA04264 01.005.000 (Grand Theft Auto V)

AnyPS5 commit

main 48c160c58b, no pull requests on top. Last good: main 5b5d24cb22. Between the two, #9789 is the only change to Graphics/src/State.cpp.

System

Windows 11 Pro 26200, RTX 4090 (NVIDIA 616.92), WinLibs GCC 15.2.0 r7, Release.

Steps to reproduce

  1. Build main (relinker + libs), relink with relinker --windows --to-intel --registry.
  2. Start the title with an empty ANYPS5_SHADER_CACHE_DIR and no other APS5_* variables.
  3. It stops during the start-up loading, before the main menu, in 2 of 2 runs (and the same in 3 more runs with trace or capture variables).

Log

The same run with the message extended locally, printing the registers of the rejected slot:

color export format 4 into an unsigned integer target is unsupported [slot 0 export index 0 CB_COLOR_INFO 0x00050408 SPI_SHADER_COL_FORMAT 0x00000004 CB_TARGET_MASK 0x0000000f]

CB_COLOR_INFO 0x00050408: FORMAT 2 (COLOR_16), NUMBER_TYPE 4 (UINT), BLEND_BYPASS and ROUND_MODE set. The pixel shader exports SPI_SHADER_FP16_ABGR (4) into a one-channel R16_UINT target, all four mask bits set.

What was checked

@rooklz FYI, since the check comes from #9789.

Activity

  1. MarcZX10 commented on Oct 26, 2026

    @MarcZX10
    Contributor

    I checked the original #9789 change: its tests explicitly reject FP16_ABGR exports into a UINT16 target, and its debt note says the console's 8-/16-bit UINT conversion behavior was not measured. This report confirms a title reaches that guard, but the expected stored value is still unknown. Before changing the guard, the needed evidence is a PS5 capture of this export/target pair (or an authoritative hardware reference for how the CB writes it); otherwise accepting the path could replace a clear refusal with incorrect output.

  2. simon-moulin commented on Oct 26, 2026

    @simon-moulin

    A second title stops on this check: Minecraft (PPSA17221 01.044.000), at start-up, before any menu.

    Build

    main 88795ed44 with #9656 (head a1d33614a) merged on top for an unrelated title. No other change. #9656 only touches libSceVoice.

    System

    Windows 11 Pro 26200, AMD Radeon RX 7800 XT (AMD proprietary driver 26.10.1, LLPC), Intel Core i5-14600KF, WinLibs GCC 15.2.0 r7, Release.

    Steps

    1. tools/audit_dump.py <app0> --relinker build/core/relinker/relinker.exe --libs build/core/libs/libs --windows: 0 absent imports.
    2. relinker --windows --registry --module-dir . eboot.elf eboot.exe on the unwrapped eboot.bin, with the five .prx beside it and sce_module/ converted.
    3. Run with APS5_DRAW_PIPELINE=1 APS5_PIPELINED_DRAWS=256 APS5_PIPELINE_DISPATCH=1 APS5_MIMALLOC=1, empty shader caches.

    Log

    terminate called after throwing an instance of 'std::runtime_error'
      what():  AGC graphics: color export format 4 into an unsigned integer target is unsupported
    [gpu] driver failure: AGC graphics: color exporFATAL: abort() (SIGABRT) on thread 50068
    

    The abort comes from the VideoOut presentation thread (libSceVideoOut.prx frames in the crash report).

    What was checked

    AI-assisted: yes (Claude Code). The runs, log lines and commands above were made on this machine.

  3. XatiX commented on Oct 26, 2026

    @XatiX

    A third title stops on this check: Builder's Journey (PPSA05496 03.002.583), when the ray-tracing option is toggled in the in-game options menu. I don't know whether it was switched on or off. In its default mode the title runs (#11308, #11574).

    Build

    • main f95acfc94 plus fix(agc): select the first level of a single-level depth view #11098 (head f1fb9d6ea), which the title needs to get past "depth view mip 1 on a surface without mips".
    • Disclosure: this run also had a local experiment enabled (APS5_EXPERIMENT_NO_ENTRY_EPOCH=1). It stops a satisfied-at-entry WAIT_REG_MEM from advancing the collect epoch. It doesn't touch the color-export decode in State.cpp. I haven't yet reproduced the stop without it.

    System

    Windows 11 (build 26300), Ryzen 7 9800X3D, NVIDIA GeForce RTX 5080 with driver 617.42, 3840x2160 output.

    Steps

    1. Convert eboot.bin, Media/Modules, Media/Plugins and sce_module with relinker --windows --registry --sce-module-path app0 --module-dir Media\Modules --module-dir Media\Plugins. The Unity modules were first unwrapped with tools/unwrap_self.py.
    2. Start the title, press Cross at the title screen, open the options menu and toggle the ray-tracing setting.

    Result

    Exit code 0xc0000409:

    [gpu] driver failure: terminate called after throwing an instance of 'std::runtime_error'
      what():  AGC graphics: color export format 4 into an unsigned integer target is unsupported
    FATAL: abort() (SIGABRT) on thread 36620
    

    The [gpu] driver failure line is interleaved with the terminate output in the log, so it's reassembled above.

  4. XatiX commented on Oct 26, 2026

    @XatiX

    Reproduced without the experiment. A clean build of main f95acfc94 plus #11098 (merge commit 6649abca5) was run with no APS5_* variables set, and the ray-tracing option was toggled in the options menu. It stops the same way, with exit code 0xc0000409:

    terminate called after throwing an instance of 'std::runtime_error'
      what():  AGC graphics: color export format 4 into an unsigned integer target is unsupported
    FATAL: abort() (SIGABRT) on thread 31752
    
  5. MarcZX10 commented on Oct 27, 2026

    @MarcZX10
    Contributor

    Thanks for adding the Minecraft and clean Builder's Journey reproductions. The new reports establish that this guard is reached beyond GTA V, but they still do not show whether the rejected slots have the same target and export configuration. Could you capture the rejected slot's CB_COLOR_INFO, SPI_SHADER_COL_FORMAT, target format/sample count and write mask for Minecraft and Builder's Journey, as was done for GTA V? A console capture or other hardware evidence of the resulting 16-bit UINT write would settle whether the guard can be relaxed without substituting an incorrect value. Until then I would keep the refusal in place; the register values alone identify the case but do not determine the stored bits.

  6. pushkarreddyy commented on Oct 27, 2026

    @pushkarreddyy
    Contributor

    To help unblock the investigation across all three reporting titles (GTA V PPSA04264, Minecraft PPSA17221, and Builder's Journey PPSA05496), could anyone with an active hardware or test environment capture:

    1. Rejected Slot Register Dumps: The exact CB_COLOR_INFO, SPI_SHADER_COL_FORMAT, CB_TARGET_MASK, and target format/sample count at the point of refusal for Minecraft and Builder's Journey (matching the slot 0 format 4 dump reported for GTA V).
    2. Hardware CB Write Behavior: Any physical PS5 trace or hardware reference establishing whether the console CB writes the raw 16-bit half representation under BLEND_BYPASS into R16_UINT attachments, or performs bitfield conversion.

    Having the exact register state for the other two titles will confirm if all three share the identical FP16_ABGR -> R16_UINT slot 0 layout or exercise different channel masks/formats.

  7. Tamalero commented on Oct 29, 2026

    @Tamalero
    Contributor

    A fourth title stops on this check, with a different target than GTA V: Marvel's Guardians of the Galaxy (PPSA01748 01.006.000) aborts at start-up, before its first menu, on main 319621b. Its rejected slot is an 8-bit one-channel UINT target (R8_UINT) in slot 3 of a four-target pass, not slot 0 R16_UINT.

    The same message extended locally (not pushed) to print the slot:

    color export format 4 into an unsigned integer target is unsupported [slot 3 export index 3 CB_COLOR_INFO 0x00050404 SPI_SHADER_COL_FORMAT 0x00004444 CB_TARGET_MASK 0x0000111f CB_BLEND_CONTROL 0x60010141 VkFormat 13 samples 1 extent 1920x1080 write mask 0x1 blend 0]
    
    • CB_COLOR_INFO 0x00050404: FORMAT 1 (COLOR_8), NUMBER_TYPE 4 (UINT), the same BLEND_BYPASS and ROUND_MODE bits as GTA V's 0x00050408.
    • SPI_SHADER_COL_FORMAT 0x00004444: all four exports are FP16_ABGR.
    • CB_TARGET_MASK 0x0000111f: slot 0 writes RGBA, slots 1 to 3 only the first channel. Slot 3 maps to VK_FORMAT_R8_UINT with write mask R, one sample, 1920x1080, blending off.

    Control: the same main build with only b15a58d (#9789) reverted reaches the main menu (closed after 864 s, exit code 0). Before #9789, e13027a with #9694 and #10388 reached the menu in every run on 2026-10-23 to 10-28.

    Details

    Linux 7.3 (CachyOS), RTX 4090, NVIDIA 615.78.08, GCC 16.2.1, Release. Relinked with --to-intel. No APS5_* variables. It stops 65 s after launch with a warm shader cache (308 s cold), 2 of 2 runs on 319621b. I first filed this as #12639 without finding this issue; I've closed it as a duplicate.

    I don't have a console, so I can't say what the color block stores for an FP16_ABGR export into an 8-bit UINT target either.

    Tested and written by Claude (AI assistant) on a contributor's machine.

  8. pushkarreddyy commented on Oct 29, 2026

    @pushkarreddyy
    Contributor

    @Tamalero Thank you for capturing the detailed slot parameters and control run for Marvel's Guardians of the Galaxy (PPSA01748)!

    The register dump (CB_COLOR_INFO 0x00050404, SPI_SHADER_COL_FORMAT 0x00004444, CB_TARGET_MASK 0x0000111f) confirms slot 3 is an 8-bit single-channel UINT target (VK_FORMAT_R8_UINT) in a multi-target pass with FP16_ABGR export format, sharing the same BLEND_BYPASS and ROUND_MODE configuration as the GTA V capture. Having traces across multiple titles (GTA V, Minecraft, Builder's Journey, and Guardians of the Galaxy) helps clearly map out the hardware target/export combinations.

  9. Tamalero commented on Nov 1, 2026

    @Tamalero
    Contributor

    Hardware data for the open question (what the CB stores for an FP16_ABGR export into a UINT channel), measured on two Radeon PRO V620 (Navi21, RDNA2, gfx1030). This is desktop RDNA2, not a console.

    Method: RADV (Mesa 26.2.6) with one local change, an environment variable that overrides SPI_SHADER_COL_FORMAT for every color output. A fragment shader writes a uvec4 whose words hold float bits. With the override set to FP16_ABGR (4), ACO packs each pair with v_cvt_pkrtz_f16_f32 and exports with compr (checked in the ISA). So the CB receives exactly the halves listed below. For these targets RADV programs CB_COLOR_INFO with BLEND_BYPASS and ROUND_MODE set, as in the Guardians register dump above (0x00050404). It also sets SIMPLE_FLOAT, which the title's value does not.

    Result: each half is widened to a 32-bit float, those 32 bits are read as an unsigned integer, and the result is clamped to the channel. It is neither the half's 16-bit pattern nor a float-to-integer conversion of its value.

    half exported R32_UINT R16_UINT R8_UINT
    0x0000 (+0.0) 0x00000000 0x0000 0x00
    0x8000 (-0.0) 0x80000000 0xffff 0xff
    0x0001 (smallest subnormal) 0x33800000 0xffff 0xff
    0x3800 (0.5) 0x3f000000 0xffff 0xff
    0x3c00 (1.0) 0x3f800000 0xffff 0xff
    0xbc00 (-1.0) 0xbf800000 0xffff 0xff
    0x7bff (65504) 0x477fe000 0xffff 0xff
    0x7c00 (+inf) 0x7f800000 0xffff 0xff
    0xfc00 (-inf) 0xff800000 0xffff 0xff
    0x7c01 (NaN) 0x7fc02000 (quiet bit set) 0xffff 0xff
    • Other targets: R8G8_UINT, R8G8B8A8_UINT and R16G16B16A16_UINT follow the same rule per channel. Both GPUs gave identical results.
    • SINT targets: R8_SINT/R16_SINT give the signed counterpart: +0.0 → 0, a positive half → the maximum, any half with the sign bit set → the minimum.
    • So for the cases in this issue: GTA V's R16_UINT and Guardians' R8_UINT hold 0 where the shader exports +0.0, and 0xffff / 0xff everywhere else.

    Side result, for the existing raw 32-bit path: with the override set to 32_R (1), a 32-bit word into R8_UINT or R16_UINT keeps its low 8 or 16 bits (0x43808000 → 0x8000 in R16_UINT). It is truncated, not clamped. The debt entry lists this as unmeasured.

    I've opened #14243 with a defined path for FP16_ABGR into UINT targets that follows this.

    Tested and written by Claude (AI assistant) on a contributor's machine.

  10. added a commit that references this issue on Nov 1, 2026
    949abf8
  11. dantdmdarealguy commented on Nov 3, 2026

    @dantdmdarealguy
    Contributor

    Confirmed on Windows (RTX 5080, NVIDIA 32.0.16.1742): main 4f41f4c with #14243 takes GTA V PPSA04264 01.005.000 past this stop to the title screen, the menu and prologue gameplay, with no abort in 6000 s over two runs.

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