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=f9ac0f30f431939998989a1760e7f72242b2a60a;hb=HEAD;hpb=cb245e568086e132cd73ae52620cabe314cdade6 diff --git a/plugins/gpulib/vout_pl.c b/plugins/gpulib/vout_pl.c index f9ac0f30..65e3de53 100644 --- a/plugins/gpulib/vout_pl.c +++ b/plugins/gpulib/vout_pl.c @@ -29,11 +29,14 @@ static void check_mode_change(int force) { int w = gpu.screen.hres; int h = gpu.screen.vres; - int w_out = w; - int h_out = h; + 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; + w = w_out = (gpu.status & PSX_GPU_STATUS_RGB24) ? 2048/3 : 1024; + h = h_out = 512; #endif gpu.state.enhancement_active = gpu.get_enhancement_bufer != NULL && gpu.state.enhancement_enable @@ -43,6 +46,20 @@ static void check_mode_change(int force) 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; + } + + gpu.state.downscale_active = + gpu.get_downscale_buffer != NULL && gpu.state.downscale_enable + && (w >= 512 || h >= 256); + + if (gpu.state.downscale_active) { + w_out = w < 512 ? w : 320; + h_out = h < 256 ? h : h / 2; + } // width|rgb24 change? if (force || (gpu.status ^ gpu.state.status_vo_old) & ((7<<16)|(1<<21)) @@ -52,12 +69,12 @@ static void check_mode_change(int force) gpu.state.w_out_old = w_out; gpu.state.h_out_old = h_out; - cbs->pl_vout_set_mode(w_out, h_out, w, h, - (gpu.status & PSX_GPU_STATUS_RGB24) ? 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 vout_update(void) { int bpp = (gpu.status & PSX_GPU_STATUS_RGB24) ? 24 : 16; uint8_t *vram = (uint8_t *)gpu.vram; @@ -69,25 +86,32 @@ void vout_update(void) int h = gpu.screen.h; int vram_h = 512; int src_x2 = 0; + int offset; #ifdef RAW_FB_DISPLAY - w = 1024, h = 512, x = src_x = y = src_y = 0; + w = (gpu.status & PSX_GPU_STATUS_RGB24) ? 2048/3 : 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) - return; + return 0; check_mode_change(0); if (gpu.state.enhancement_active) { if (!gpu.state.enhancement_was_active) - return; // buffer not ready yet + return 0; // buffer not ready yet vram = gpu.get_enhancement_bufer(&src_x, &src_y, &w, &h, &vram_h); + if (vram == NULL) + return 0; x *= 2; y *= 2; src_x2 *= 2; } + if (gpu.state.downscale_active) + vram = (void *)gpu.get_downscale_buffer(&src_x, &src_y, &w, &h, &vram_h); + if (src_y + h > vram_h) { if (src_y + h - vram_h > h / 2) { // wrap @@ -99,12 +123,13 @@ void vout_update(void) h = vram_h - src_y; } - vram += (src_y * 1024 + src_x) * 2; - vram += src_x2 * bpp / 8; + offset = (src_y * 1024 + src_x) * 2; + offset += src_x2 * bpp / 8; - cbs->pl_vout_flip(vram, 1024, !!(gpu.status & PSX_GPU_STATUS_RGB24), + cbs->pl_vout_flip(vram, offset, !!(gpu.status & PSX_GPU_STATUS_RGB24), x, y, w, h, gpu.state.dims_changed); gpu.state.dims_changed = 0; + return 1; } void vout_blank(void) @@ -117,7 +142,7 @@ void vout_blank(void) w *= 2; h *= 2; } - cbs->pl_vout_flip(NULL, 1024, !!(gpu.status & PSX_GPU_STATUS_RGB24), 0, 0, w, h, 0); + cbs->pl_vout_flip(NULL, 0, !!(gpu.status & PSX_GPU_STATUS_RGB24), 0, 0, w, h, 0); } long GPUopen(unsigned long *disp, char *cap, char *cfg)