mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
67da069f9c
The OpenGL textured program read the GP0(E2h) texture window from a uniform, so every window change ended the open textured batch (batch reason 5). Titles that tile far textures with per-primitive windows pay for that in draws: Ridge Racer Type 4's split screen changes the window about 515 times a game frame and drew about 180 batches, against 17 with batching on. On the native-wide path every batch that reaches the margins is drawn again into the wide surface; under heavy load on an M4, 2P with widescreen at Match display ran at 39-43 guest VBlanks/s and 1P at 50, against 50-58 and 57 with batching on. The window now rides in each textured vertex (a_twin, the E2h low 20 bits as one float) like texpage and CLUT already do, and the shader decodes it there; the uniform and the window-replay queue's copy of it are gone. With the default unchanged, batches still split at every window change, so every vertex carries the batch's window and the image is the same as before: the new test's oracle passes on the unmodified renderer too, with the same digests at 1x, 4x, 9x and in the windowed 9x/18x mode. [video] texture_window_batching = true (game.toml only, default off) lets primitives with different windows share a batch. The image is the same: an opaque batch draws its colour in one painter-ordered pass and semi-transparent primitives are still drawn one per batch. While mask checking is on the window stays a batch key, because an opaque batch fixes the stencil for its STP=1 texels after its colour pass. PSX_GL_TEXWIN_BATCH=0|1 overrides it for a run and the TCP command gl_texwin_batch switches it live. Software and Vulkan are unchanged. Tests: gl_scale_invariance_test gains mode "twin" (alternating windows over opaque, semi-transparent, set-mask, mask-check and bilinear prims, into the native-wide margins): off and on give the same native VRAM, frame at S and wide surface, on draws 17 batches instead of 46 and flushes only for the 5 mask-check window changes. Each run also checks an oracle that does not depend on the renderer: raw rects through all four windows into a 4-bit and a 15-bit page must give, pixel for pixel in the native VRAM and at the centre of each pixel at S, the texel the PS1 window rule picks from the VRAM as read back. A decode or packing error both settings share fails it (checked with (v_twin >> 11) and with off_y left out of the packed window). video_enhancement_settings_test checks the key's default and opt-in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>