mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 10:19:47 -04:00
f8a29e8a97
Adds the DuckStation-style widescreen hack as a config option, implemented in the runtime (no regen needed): - gte.cpp: gte_set_display_aspect(num, den). RTPS/RTPT scale the IR1*h/sz screen-X term by (4*den)/(3*num) around the game's own OFX projection centre (identity at 4:3). Games cull against the SXY values they read back from us, so post-projection screen- bounds culls stay aligned with the visible frame. - present: GL letterbox_rect generalised to the configured aspect (gl_renderer_set_display_aspect); SDL_Renderer path gets an aspect-derived logical size + dst rect. Window opens at the configured aspect (clamp_window_4x3 -> clamp_window_aspect). - config: [video] aspect_ratio = W:H (4:3 default, 16:9, up to 32:9) in game.toml, settings.toml (load+save), launcher seed. World geometry keeps correct proportions on the stretched present; screen-space 2D (HUD, FMV, sprite quad widths) stretches — the known limitation of the squash tier. EXPERIMENTAL. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
85 lines
3.6 KiB
C
85 lines
3.6 KiB
C
#ifndef PSX_GPU_GL_RENDERER_H
|
|
#define PSX_GPU_GL_RENDERER_H
|
|
|
|
/* GL backend context + present entry points, called from main.cpp's window
|
|
* setup and present path when [video] renderer = "opengl". The backend's
|
|
* rasterization vtable is obtained separately via gl_backend_get()
|
|
* (gpu_render.h). SDL_Window is forward-declared (SDL typedefs it from this
|
|
* same struct tag) so this header needs no SDL include. */
|
|
|
|
#include <stdint.h>
|
|
|
|
struct SDL_Window;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Create the GL context on a window made with SDL_WINDOW_OPENGL.
|
|
* Returns 1 on success, 0 to fall back to the SDL_Renderer present path. */
|
|
int gl_renderer_init_context(struct SDL_Window *win);
|
|
|
|
/* Present an ARGB8888 image (BGRA byte order) as a letterboxed quad + swap.
|
|
* Used for 24-bit (FMV) frames and the PSX_GL_FORCE_CPU_PRESENT diagnostic. */
|
|
void gl_renderer_present(const uint32_t *pixels, int src_w, int src_h, int linear);
|
|
|
|
/* Clear to black + swap (display-disabled frame). */
|
|
void gl_renderer_present_blank(void);
|
|
|
|
/* Sync the authoritative FBO down to CPU VRAM if the GPU side is ahead (else
|
|
* a no-op). The 24-bit (FMV) present path, screenshots, and the debug server
|
|
* call this before reading CPU VRAM. */
|
|
void gl_renderer_sync_cpu(void);
|
|
|
|
/* THE present path for 15-bit frames: blit the display region straight from
|
|
* the authoritative VRAM FBO into a letterboxed rect (no readback).
|
|
* Deterministic — used for every 15-bit frame. linear = filter on scale. */
|
|
void gl_renderer_present_vram(int disp_x, int disp_y, int w, int h, int linear);
|
|
|
|
/* Display aspect for the present letterbox (default 4:3). A wide aspect
|
|
* stretches the 4:3 frame; pair with gte_set_display_aspect (cpu_state.h)
|
|
* for the widescreen field-of-view hack. */
|
|
void gl_renderer_set_display_aspect(int num, int den);
|
|
|
|
void gl_renderer_shutdown(void);
|
|
|
|
/* Diagnostics (debug server): read GPU-side VRAM without touching the CPU
|
|
* array; report coherency flags + dirty rects. fbo_peek returns 0 when the
|
|
* GL pipeline is inactive. */
|
|
int gl_renderer_fbo_peek(int x, int y, int w, int h, uint16_t *out);
|
|
void gl_renderer_diag(int *gpu_dirty, int pending[5], int pack[5]);
|
|
|
|
/* Always-on coherency event ring (debug server "gl_coh_ring"): every upload
|
|
* flush, fill, copy, draw bbox, pack, full readback, present, and probe
|
|
* perturbation, with rect + frame. An op that flushes internally records its
|
|
* own event AFTER the FLUSH it caused (the event after a FLUSH = trigger). */
|
|
enum {
|
|
GL_COH_FLUSH = 1, /* CPU->FBO upload flush (pending box) */
|
|
GL_COH_FILL = 2, /* GP0(02) fill rect */
|
|
GL_COH_COPY_SRC = 3, /* GP0(80) copy, source rect */
|
|
GL_COH_COPY = 4, /* GP0(80) copy, dest rect */
|
|
GL_COH_DRAW = 5, /* drawn prim bbox (clipped to draw area) */
|
|
GL_COH_PACK = 6, /* hr FBO -> raw mirror pack (dirty box) */
|
|
GL_COH_ENSURE = 7, /* full FBO -> CPU VRAM readback */
|
|
GL_COH_PRESENT = 8, /* 15-bit present blit (display rect) */
|
|
GL_COH_UPLOAD = 9, /* bulk CPU->VRAM transfer_in dest rect */
|
|
GL_COH_PEEK = 10, /* gl_fbo_peek probe (perturbs: flushes) */
|
|
GL_COH_DIFF = 11, /* gl_vram_diff probe (perturbs: flushes) */
|
|
};
|
|
|
|
typedef struct {
|
|
uint32_t frame;
|
|
uint8_t kind;
|
|
int16_t x0, y0, x1, y1; /* native VRAM coords, inclusive */
|
|
} GlCohEvent;
|
|
|
|
uint64_t gl_renderer_coh_total(void);
|
|
/* Fetch event by absolute sequence number; 0 if evicted or out of range. */
|
|
int gl_renderer_coh_get(uint64_t seq, GlCohEvent *out);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PSX_GPU_GL_RENDERER_H */
|