mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 10:19:47 -04:00
0631538407
Full rewrite of the GL backend around a single authoritative hr VRAM FBO (RGBA8 + stencil mask-bit mirror, internal scale from [video] supersampling): GPU fills/copies/draws rasterize into it, CPU uploads batch through a pending-rect quad blit, a PACK pass re-encodes dirty regions into the native R16UI raw mirror for texture sampling and readback, and gpu.c routes GPUREAD/mask-check/peek reads through the facade so the CPU array syncs before any CPU-side read. Texture sampling adopts the Beetle-PSX model (structure only, studied from beetle-psx-libretro): - Per-primitive uv sampling bounds, clamped in the fragment shader when no texture window is active. Filtered neighbours and S>1 interpolation overshoot can never read outside the prim's own texture rect. Bounds back off the exclusive max edge for axis-aligned (2D) uv mappings and widen to the full page when the uv range crosses a 256 wrap boundary. - Bilinear takes the NEAREST texel as base (cutout + STP authority), neighbours toward the sub-texel offset, with per-texel opacity weights and renormalised colour. The old "-0.5 then floor" base sampled one texel OUTSIDE the prim on top/left edges; where that neighbour was empty VRAM (e.g. tiled menu backgrounds with u0=0) the whole edge column/row discarded — the vertical line on Tomba's title and the cross seams on the memory-card screens. The software renderer's bilinear gets the same reformulation so GL and SW render filtered output identically; the SW nearest path (shipping default) is untouched. Also: always-on coherency event ring (flushes, fills, copies, draw bboxes, packs, readbacks, presents, probe perturbations, with rects + frame numbers) queryable via the debug server, and gl_vram_diff now forces a full pack so it reads FBO truth even where the raw-mirror invariant is broken. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>