mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-28 10:59:16 -04:00
9805a00a7e
With lines batched, 8K widescreen still switched to the wide surface and back for every textured or flat batch that reaches the margins (~29 per frame at 21:9 in an R4 race; 32:9 flushes ~4x as many textured batches). At 18x those surfaces are 10080x9216 and 15372x9216, and each switch ends a render pass: with the mirror drawn into the hr surface instead (no switch, gl_ws_ablate 3) 32:9 at 8K ran at 57 guest frames/s instead of 12. In windowed mode a draw's native-wide mirror now rides in its window queue entry (target surface, x shift, backdrop stretch) and is replayed in the queue's flush, in order, one pass per wide surface (hiw_replay_wide). The queue's sync points already cover what the mirror samples (the raw mirror) and the stencil rebuild; every other write to a wide surface (the clears, the full-screen overlay rect, reallocation) and every read of one (present, capture, dumps) now flushes the queue first. Outside windowed mode, and with the mirror ablated, the immediate mirror runs as before. - gl_scale_invariance_test: the window runs' native-wide surfaces (the scene's and the new lines runs') stay byte-identical to the full-VRAM runs, and the lines runs check that the mirrors were queued. Mutations fail it: no queueing (the queue check), a wrong x shift or no replay (the wide digests). - R4, same setup as the previous commit: 21:9 at 8K 34.2-37.7 -> 56.1-56.6 guest frames/s (4:3 at 8K: 59.4), 32:9 12.6-13.8 -> 45.1-45.9; mirror passes per frame 29 -> 0.5. With the debug server's per-frame readback on (the default debug build): 21:9 43.7, 32:9 40.0. - test_gl_internal_scale_guards pins the queued path, the replay state and the sync points. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>