Skip to content

AGC: five homebrew titles stop on 'last provoking vertex with explicit per-vertex flat interpolation is unsupported' #3581

Closed

Description

@reyani-dev

Five catalog titles stop in the same pipeline check on main (Windows 11, WinLibs GCC 15.2.0 r7, RTX 4070, main a11c8f7, catalog builds with eboot.bin and sce_module/libc.prx unwrapped, 60 s each):

[videoout] presentation failed: AGC graphics: last provoking vertex with explicit per-vertex flat interpolation is unsupported
terminate called after throwing an instance of 'std::runtime_error'
Title Where the line is
SymphonyStation5 (PPSA17641) the title's own log under download0/
VITA5 (PPSA39410) same
Homebrew UI Lab (PPSA99050) download0/hui/dev/app.log
Surround Sound Studio (PPSA99051) the title's own log under download0/
Stremio Plus (PPSA74126) console. It needs getsid (#3493) to load; with that it reaches this check

The four titles that log to their own file look silent from the console: only Transferring control to ELF entry point and exit 0xc0000409. That's likely why this stop hasn't been reported, so whoever runs the catalog may want to check download0/**/*.log too.

The check is ValidateProvokingVertex (Graphics/src/Pipeline.cpp:104, from 3a8cf3a): the pipeline uses the last provoking vertex (PA_SU_SC_MODE_CNTL bit), and a fragment shader reads a flat parameter through the explicit per-vertex path. Under VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, per-vertex index 0 is no longer the provoking vertex. A flat attribute read through the per-vertex path would need the index of the provoking vertex instead (the last vertex of the primitive: 2 for triangles, 1 for lines), so the program would depend on the pipeline's provoking mode and topology. I haven't looked at whether these titles' shaders read the flat parameters through P0/v_interp_mov or another way.

Found with Claude Code.

Activity

  1. orishamir commented on Oct 11, 2026

    @orishamir
    Contributor

    This is the open question of #1413, and there is a fix for the case these titles use that isn't upstream yet: AlxcBTW#12. With it, ProsperoStore (PPSA99000), one more title that stops here, gets past this check and renders its UI.

    Why these titles reach it. They draw through ps5-opengl (ProsperoStore pins its SDK in tools/fetch-opengl-sdk.sh). In ps5-opengl main 00ea837b:

    • toolchain/opengnm-psbc-ps5.patch runs lower_flat_input_vertex on every PS5 fragment shader (:3576). Under GL's default convention it turns each flat input load into load_input_vertex(1) (:938-960), which ACO emits as v_interp_mov_f32 ..., p10 (see v_interp_mov P10/P20 of a FLAT_SHADE input without pass-through: deltas or raw vertices? #1413).
    • src/gallium/ps5/ps5_screen.c:2244 sets PA_SU_SC_MODE_CNTL.PROVOKING_VTX_LAST when flatshade_first is clear, which is also GL's default.

    AnyPS5 marks a flat input read through P10 or P20 as per-vertex (ShaderInfoCollector.cpp, mode < 2u) and maps bit 19 to Vulkan's last-vertex mode (#2322), so ValidateProvokingVertex refuses the first pipeline whose fragment shader has a flat varying.

    The open question is what P10 of a FLAT_SHADE input without pass-through returns. CouchRiv measured 0 on gfx1036; ps5-opengl, which reads every flat input this way, passes the GL 4.6 CTS on a PS5 (both on #1413). AlxcBTW#12 (c18298c3) takes the PS5 side for exactly this case: P10 of such an input under the last provoking vertex returns the provoking vertex's value. P20, and P10 under the first provoking vertex, still throw.

    Run with it. #12 cherry-picks onto main a11c8f7 with one conflict, in TechnicalDebt.md. ProsperoStore 1.000.050 (catalog build), Windows 11, RTX 4080, Release, with #3512 for its earlier v_fma_mix stop:

    On #1413 AlxcBTW reported the same for Homebrew UI Lab and VITA5 with #12, and the ps5-opengl showcase (PPSA99005) gets past it too. ProsperoTV (PPSA99003) reaches this line once its poll stop (#3521) is fixed.

    @AlxcBTW, #12 is still only on your fork. Would you open it here, as you did #3546? It is the change maintainers would need to accept or reject on the PS5 evidence above.

    AI-assisted: yes (Claude Code Opus 5.5 xhigh)

  2. orishamir commented on Oct 11, 2026

    @orishamir
    Contributor

    The other titles of this issue, with and without AlxcBTW#12. Both runs use the same tree: main a11c8f7 + #3512 + getsid from #3493 (for Stremio Plus) + screamm's feat/libkernel-poll-files for #3521 (for ProsperoTV). The only difference is #12's core/ diff. Catalog builds, Windows 11, RTX 4080, Release, 45 s each. The screens come from frames saved with APS5_DUMP_FRAMES.

    Title without #12 with #12
    Homebrew UI Lab (PPSA99050) stops at this line runs 45 s; full home screen (cards, text, buttons)
    VITA5 (PPSA39410) stops at this line runs 45 s; "Dock your PS Vita" screen
    SymphonyStation5 (PPSA17641) stops at this line runs 45 s; its Navidrome login form
    ProsperoTV (PPSA99003) stops at this line runs 45 s; full UI, "The channel list could not be loaded" (offline)
    Stremio Plus (PPSA74126) stops at this line runs 45 s; draws its own "App storage is unavailable" screen (lstat /data gives ENOENT here)
    Surround Sound Studio (PPSA99051) stops at this line past this check, then sceAudioOutSysGetHdmiMonitorInfo not implemented after 16 s, before its first frame

    So all six titles, and ProsperoStore above, use the case #12 covers. None hits the throws #12 keeps (P20, or P10 under the first provoking vertex).

    @babyhuey, Surround Sound Studio's next stop is the throwing export from #2887. #2887 says the title doesn't call it during start-up, but once this check passes it does.

    AI-assisted: yes (Claude Code Opus 5.5 xhigh)

  3. AlxcBTW commented on Oct 11, 2026

    @AlxcBTW
    Contributor

    @orishamir thanks, that's a clear table: all seven titles hit the one case #12 covers, and none reaches the throws it keeps.

    I'll open AlxcBTW#12 as an upstream PR, rebased onto current main, as soon as #3546 is merged. Until then I can only have one PR open. If someone wants to carry it sooner, c18298c is ready.

    The open question stays the one on #1413: CouchRiv measured 0 on gfx1036. ps5-opengl reading every flat input through P10 and passing the GL 4.6 CTS on a PS5 is the only PS5-side evidence. #12 follows the PS5 side for exactly that case and keeps the other cases as throws.

    AI-assisted: yes (Claude Code)

  4. Lorkydey commented on Oct 11, 2026

    @Lorkydey
    Contributor

    PShare (PPSA99773, release 1.0) is another title that gets past this check with AlxcBTW#12. Thanks AlxcBTW for the patch.

    Tested on Windows 11, Ryzen 5 3600, GTX 1660 SUPER (driver 555.85), WinLibs GCC 15.2, Release. Both sides use main a11c8f7 + #3606 (187fd85, needed for getlogin_r) + #3855 (36d37a0, fixes the earlier UTC-to-local stack overwrite). Same relinked executable and runtime libraries; only libSceAgcDriver.prx changes for the comparison. Each run uses a fresh shader-cache directory.

    • Without AlxcBTW's patch: aborts before the first captured frame with [videoout] presentation failed: AGC graphics: last provoking vertex with explicit per-vertex flat interpolation is unsupported.
    • With c18298c3: gets past that guard and renders. GPU frame dumps show the splash/logo animation, then the Captures screen with its sidebar, filter tabs, text and icons. The screen says "PShare can't see your captures"; no captures were supplied to this test installation.
    • Next stop: both patched runs abort after roughly 11-12 seconds with the error below. This is the same FLOAT_MODE 204 (0xcc) case covered by fix(shader): round v_fma_mixlo_f16 and v_fma_mixhi_f16 in every f16 rounding mode #3512; I have not applied that PR in these runs.
    ShaderRecompiler::Recompile: v_fma_mixlo/mixhi_f16 at pc 348 in FLOAT_MODE 204 (f16 denormals not kept or rounding not to nearest even) is not implemented
    

    The first comparison used APS5_DUMP_FRAMES=8; a second patched run used APS5_DUMP_FRAMES=8 APS5_DUMP_FRAMES_EVERY=30 APS5_DUMP_SCALE=1 APS5_DUMP_SHADERS=1, which captured the splash and main UI at 1920x1080 and saved the next failing shader request. Logs are in the title's download0/pshare/dev/app.log.

    Validation: the targeted build succeeds, and agc_driver_graphics (including the patch's P10 case), agc_shader_disk_cache, and the existing agc_driver_provoking_vertex pixel tests pass 3/3, with ANYPS5_REQUIRE_VULKAN=1. The latter pixel test covers GLSL/guest P0, not a new P10 pixel oracle. The captured next shader also reproduces the FLOAT_MODE error with agc_shader_replay without running the title. The full test suite was not run.

    This confirms progress through PShare's rendering path on this Windows GPU, not the unresolved PS5 hardware semantics in #1413. I have not validated interaction/uploading or compared pixels against a console capture.

    AI-assisted: yes (Codex).

  5. AlxcBTW commented on Oct 11, 2026

    @AlxcBTW
    Contributor

    @Lorkydey thanks, that makes PShare the eighth title through this check with AlxcBTW#12. It goes into the PR's title list, and the PR opens as soon as #3546 is merged.

    AI-assisted: yes (Claude Code)

  6. AlxcBTW commented on Oct 11, 2026

    @AlxcBTW
    Contributor

    AlxcBTW#12 is now upstream as #4030, rebased onto main a11c8f7. The titles list covers @orishamir's table, @Lorkydey's PShare and @AchrafReyani's merge map. It still covers only the P10 case; P20 stays a throw (see #1413).

    AI-assisted: yes (Claude Code)

  7. orishamir commented on Oct 12, 2026

    @orishamir
    Contributor

    With #4030 merged, the titles of this issue no longer reach this line on main. Windows 11, RTX 4080 (driver 616.56), WinLibs GCC 15.2.0 r7, Release, plain main 2a5eca1 with no other PRs and no extra relinker options, catalog builds, 60 s each with APS5_DUMP_FRAMES=4 (one frame every 300 presents). Before #4030, the eight titles other than ProsperoTV stopped at this line on Windows main 0ef9dc9 earlier today, six of them also on 3d8ffeb (#4030 (comment)).

    Title main 2a5eca1
    ProsperoStore (PPSA99000) runs 60 s; Discover page, "The catalog is on its way" (offline)
    Homebrew UI Lab (PPSA99050) runs 60 s; full home screen
    VITA5 (PPSA39410) runs 60 s; "Dock your PS Vita" screen
    SymphonyStation5 (PPSA17641) runs 60 s; its login form
    Surround Sound Studio (PPSA99051) runs 60 s; its Passthrough page. Its earlier next stop is gone too: GetHdmiMonitorInfo rc=0x00000000 in its log
    Forwarder Manager (PPSA99930) runs 60 s; draws "No access to /data/homebrew"
    Stremio Plus (PPSA74126) runs 60 s; draws "App storage is unavailable"
    PS5 OpenGL Showcase (PPSA99005) runs 60 s; draws its text overlay (3840x2160, 19-23 FPS by its own counter) over a black scene. Its download0/ps5-opengl.log has 988 [ps5-gallium] draw-rejected status=-12 mode=4 lines with counts around 1.0e9 and 3.2e9; not looked into
    ProsperoTV (PPSA99003) still stops first at poll: descriptor 4 is not a socket after 10 s (#3521); babyhuey's run with #3649 on main d592d54: #3649 (comment)

    None of the logs contains the line of this issue. Each run logs once shader library prebuild skipped: AGC graphics: v_interp_mov p10 of a flat input with the first provoking vertex is not measured (the case #4030 keeps as a throw, caught by the prebuild); the titles' draws then go through.

    AI-assisted: yes (Claude Code Opus 5.5 xhigh)

  8. oneandonlydean commented on Oct 13, 2026

    @oneandonlydean
    Collaborator

    Closing: fixed by #4030. The nine titles listed here no longer reach last provoking vertex with explicit per-vertex flat interpolation is unsupported on main (orishamir's run above). The P20 case stays in #1413.

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