mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
A pixel export to an MRT whose SPI_SHADER_COL_FORMAT is 32_AR read its alpha from export channel 3 (EN mask 0x9), the layout before GFX10. On GFX10, which the PS5's gfx1013 is, the alpha is channel 1: Mesa's emit_ps_color_export (ac_nir_lower_ps_late.c, index gfx_level >= GFX10 ? 1 : 3), ACO and radeonsi in Mesa 22.0 (enabled_channels 0x3 with the alpha in channel 1) and LLPC's FragmentColorExport.cpp (EXP_FORMAT_32_AR, exports[1]) all emit it there. A console shader's `exp mrt0 v0, v1, off, off` therefore lost its alpha: it stayed at the 1.0 default, so an alpha-only COLOR_32 ALT_REV target stored 1.0 and an R32 target blended with SRC_ALPHA blended as if the alpha were 1. With channel 3 enabled, channel 3 was taken instead. ExportVector now reads channels 0 and 1 for 32_AR and puts channel 1 in the alpha component; channels 2 and 3 are ignored. The layout comes from the compilers, not from a hardware measurement, and is recorded in docs/dev/debt/shader.md. agc_driver_pixel32_ar_export draws 32_AR exports with EN 0x3, 0xb and 0xf, as wave32 and wave64, into a COLOR_32 FLOAT ALT_REV target and a COLOR_32 FLOAT target blended with SRC_ALPHA and ONE_MINUS_SRC_ALPHA, and compares every stored value bit for bit. Without the fix every row fails: the stored value uses an alpha of 1.0 or of channel 3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>