mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
b85f10959b
2D-only-scene classifier (fixes room/fall/title-card stretch, Tomba): - Native-wide's 2D-backdrop stretch fires wholesale in scenes whose background phase never ends (room interiors, sky-only falls), stretching the whole frame. Such scenes now present native 4:3 from the faithful canonical buffer (gpu_ws_present_native_43). - The world signal is DEEP UNTAGGED POLYGON OVERHANG: polys whose raw SX extent crosses >=24px past the canonical window, >=4 per frame, sustained 2+ consecutive frames. Lineage of rejected signals (each defeated by a real scene, census-evidenced): shaded-prim presence (title-card letter tiles are gouraud), GTE projection volume (task-jingle projects world-scale counts; title screen idles at 1680 verts), any-poly overhang (card letters slide in from off-screen), shallow overhang (jingle sparkles poke <=20px). Outdoor terrain measures 55 deep-overhang polys/frame vs 0-1 for every observed 2D scene/effect. - Scoped to sprite-tag titles: full_2d (MMX6) and gte_game_mode (Ape) classification is unchanged. Native-wide present invariant: - A game frame that cannot present wide (compositor fallback) pillarboxes 4:3 instead of stretching the canonical read across the wide window (all backends; squash mode still stretches by design). HUD corner re-anchoring for sprite-tag titles ([widescreen] nw_hud_corners): - Poly/line prims never shift (they are the world / tagged billboards); rect-family prims shift only when UNTAGGED — the proven hud_sprt_squash discriminator — so enabling nw_hud_corners is safe without a packet arena range. Observability (always-on, institutional): - present_ring: per-present classification ring (path, present width, game_mode, native_43, wide fallback, tag age, gte_verts, ovh_prims) for every backend; TCP "present_ring". Answers "why did this frame stretch" after the fact. - gpu_state ws block gains last_3d_frame, gte_verts, last_world3d_frame, ovh_prims, last_ovh_frame; GTE vert counting is now always-on. Input injection drives the full pad model: - set_input/press now resolve pad type like real sampling: injected d-pad drops a hybrid pad to digital (movement works), optional lx/ly/rx/ry stick override (0..255), type via the coherent request channel. Previously buttons-only: menus reacted, walking never did. Savestate honesty: - savestate_request_save/load return staged/refused; the TCP handler reports ok:false instead of silently acking loads it cannot perform (LLE host-fiber runs). Torn-restore reliability audit remains open. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>