mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-05 13:20:11 +00:00
PPSA21564's final composite renders into 4K 10-bit scanout buffers (COLOR_2_10_10_10 with the alternate swap, A2R10G10B10). No guest texture format matched that color format, so the target stayed non-resident: every frame's composite draw ran synchronously (about 11 ms, 143 per 10 s at the title) and the flip read the frame back through guest memory. The blue-low 10-bit color target now keeps its bits in the storage image of its surface's red-low 2-10-10-10 format, as B8G8R8A8 targets map to R8G8B8A8. Presenting it: DisplayTexelFormat names a display buffer's texel order as the guest-memory path reads it (R8G8B8A8 base: red low, else blue low; the 10-bit variant: A2B10G10R10 or A2R10G10B10). ResidentPresentPath blits a resident image only when it holds the display's 8-bit texel format (an exact copy). A 10-bit image (whose blit would round where the guest path drops the low two bits), the other 8-bit order or an sRGB type is converted instead: GpuColorTransfer::DetileImage copies the image's texels raw and runs the guest path's own conversion shader on them, so both paths present the same pixels. The image's write-back is unchanged: its results stay pending like any resident target's and are stored when a reader of the memory flushes them. Tests: agc_driver_recorder_tests checks the format decision for both 8-bit and both 10-bit orders, and converts an image in each order, comparing it with the CPU decode and the GPU detile of the same words in guest memory.