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_out *= 2;
h_out *= 2;
}
+ 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.reg ^ old_status) & ((7<<16)|(1<<21)) || h != old_h)
+ if (force || (gpu.status ^ old_status) & ((7<<16)|(1<<21)) || h != old_h)
{
- old_status = gpu.status.reg;
+ old_status = gpu.status;
old_h = h;
- cbs->pl_vout_set_mode(w_out, h_out, w, h, gpu.status.rgb24 ? 24 : 16);
+ cbs->pl_vout_set_mode(w_out, h_out, w, h,
+ (gpu.status & PSX_GPU_STATUS_RGB24) ? 24 : 16);
}
}
void vout_update(void)
{
- int x = gpu.screen.x & ~1; // alignment needed by blitter
+ int x = gpu.screen.x;
int y = gpu.screen.y;
int w = gpu.screen.w;
int h = gpu.screen.h;
if (gpu.state.enhancement_active)
vram = gpu.get_enhancement_bufer(&x, &y, &w, &h, &vram_h);
+ if (gpu.state.downscale_active)
+ vram = gpu.get_downscale_buffer(&x, &y, &w, &h, &vram_h);
+
if (y + h > vram_h) {
if (y + h - vram_h > h / 2) {
// wrap
vram += y * 1024 + x;
- cbs->pl_vout_flip(vram, 1024, gpu.status.rgb24, w, h);
+ cbs->pl_vout_flip(vram, 1024, gpu.status & PSX_GPU_STATUS_RGB24, w, h);
}
void vout_blank(void)
{
int w = gpu.screen.hres;
int h = gpu.screen.h;
+
+ check_mode_change(0);
if (gpu.state.enhancement_active) {
w *= 2;
h *= 2;
}
- check_mode_change(0);
- cbs->pl_vout_flip(NULL, 1024, gpu.status.rgb24, w, h);
+ cbs->pl_vout_flip(NULL, 1024, gpu.status & PSX_GPU_STATUS_RGB24, w, h);
}
long GPUopen(void **unused)