X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fgpulib%2Fvout_pl.c;h=a9437cb145cb5ba9f53589cead83a38e8657070c;hp=7b229dbb4db8febf31e2822a1a89905d72be8afe;hb=HEAD;hpb=c65553d0cafc353daad3fdcc0aab63bb8427a809 diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index 7b229dbb..80389a34 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -11,7 +11,6 @@ #include #include "gpu.h" -#include "cspace.h" #include "../../frontend/plugin_lib.h" static const struct rearmed_cbs *cbs; @@ -28,81 +27,116 @@ int vout_finish(void) static void check_mode_change(int force) { - static uint32_t old_status; - static int old_h; int w = gpu.screen.hres; - int h = gpu.screen.h; - + int h = gpu.screen.vres; + int w_out, h_out, bpp = 16; + + if (gpu.state.screen_centering_type == C_BORDERLESS) + h = gpu.screen.h; + w_out = w, h_out = h; +#ifdef RAW_FB_DISPLAY + w = w_out = 1024, h = h_out = 512; +#endif gpu.state.enhancement_active = gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable - && w <= 512 && h <= 256 && !gpu.status.rgb24; + && w <= 512 && h <= 256 && !(gpu.status & PSX_GPU_STATUS_RGB24); if (gpu.state.enhancement_active) { - w *= 2; - h *= 2; + w_out *= 2; + h_out *= 2; + } + if (gpu.status & PSX_GPU_STATUS_RGB24) { + // some asm relies on this alignment + w_out = (w_out + 7) & ~7; + bpp = 24; } // width|rgb24 change? - if (force || (gpu.status.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h) + if (force || (gpu.status ^ gpu.state.status_vo_old) & ((7<<16)|(1<<21)) + || w_out != gpu.state.w_out_old || h_out != gpu.state.h_out_old) { - old_status = gpu.status.reg; - old_h = h; + gpu.state.status_vo_old = gpu.status; + gpu.state.w_out_old = w_out; + gpu.state.h_out_old = h_out; - cbs->pl_vout_set_mode(w, h, - (gpu.status.rgb24 && !cbs->only_16bpp) ? 24 : 16); + if (w_out != 0 && h_out != 0) + cbs->pl_vout_set_mode(w_out, h_out, w, h, bpp); } } void vout_update(void) { - int x = gpu.screen.x & ~1; // alignment needed by blitter + int bpp = (gpu.status & PSX_GPU_STATUS_RGB24) ? 24 : 16; + uint8_t *vram = (uint8_t *)gpu.vram; + int src_x = gpu.screen.src_x; + int src_y = gpu.screen.src_y; + int x = gpu.screen.x; int y = gpu.screen.y; int w = gpu.screen.w; int h = gpu.screen.h; - uint16_t *vram = gpu.vram; int vram_h = 512; + int src_x2 = 0; + +#ifdef RAW_FB_DISPLAY + w = 1024, h = 512, x = src_x = y = src_y = 0; +#endif + if (x < 0) { w += x; src_x2 = -x; x = 0; } + if (y < 0) { h += y; src_y -= y; y = 0; } - if (w == 0 || h == 0) + if (w <= 0 || h <= 0) return; check_mode_change(0); - if (gpu.state.enhancement_active) - vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &vram_h); + if (gpu.state.enhancement_active) { + if (!gpu.state.enhancement_was_active) + return; // buffer not ready yet + vram = gpu.get_enhancement_bufer(&src_x, &src_y, &w, &h, &vram_h); + if (vram == NULL) + return; + x *= 2; y *= 2; + src_x2 *= 2; + } - if (y + h > vram_h) { - if (y + h - vram_h > h / 2) { + if (src_y + h > vram_h) { + if (src_y + h - vram_h > h / 2) { // wrap - h -= vram_h - y; - y = 0; + h -= vram_h - src_y; + src_y = 0; } else // clip - h = vram_h - y; + h = vram_h - src_y; } - vram += y * 1024 + x; + vram += (src_y * 1024 + src_x) * 2; + vram += src_x2 * bpp / 8; - cbs->pl_vout_flip(vram, 1024, gpu.status.rgb24, w, h); + cbs->pl_vout_flip(vram, 1024, !!(gpu.status & PSX_GPU_STATUS_RGB24), + x, y, w, h, gpu.state.dims_changed); + gpu.state.dims_changed = 0; } void vout_blank(void) { int w = gpu.screen.hres; - int h = gpu.screen.h; + int h = gpu.screen.vres; + + check_mode_change(0); if (gpu.state.enhancement_active) { w *= 2; h *= 2; } - cbs->pl_vout_flip(NULL, 1024, gpu.status.rgb24, w, h); + cbs->pl_vout_flip(NULL, 1024, !!(gpu.status & PSX_GPU_STATUS_RGB24), 0, 0, w, h, 0); } -long GPUopen(void **unused) +long GPUopen(unsigned long *disp, char *cap, char *cfg) { gpu.frameskip.active = 0; gpu.frameskip.frame_ready = 1; cbs->pl_vout_open(); check_mode_change(1); + vout_update(); return 0; }