From ee7df0616823c2386d052bd96de55d4c96cfc388 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 2 Apr 2024 00:08:40 +0200 Subject: [PATCH] Voodoo: Honor monitor overscan. --- src/video/vid_svga.c | 2 ++ src/video/vid_voodoo_display.c | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 6e32bdc40..a8bf76505 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -90,6 +90,7 @@ svga_set_override(svga_t *svga, int val) svga->fullchange = svga->monitor->mon_changeframecount; svga->override = val; +#ifdef OVERRIDE_OVERSCAN if (!val) { /* Override turned off, restore overscan X and Y per the CRTC. */ svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1; @@ -104,6 +105,7 @@ svga_set_override(svga_t *svga, int val) } else svga->monitor->mon_overscan_x = svga->monitor->mon_overscan_y = 16; /* Override turned off, fix overcan X and Y to 16. */ +#endif } void diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index e6cf13674..d04376941 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -511,6 +511,8 @@ voodoo_callback(void *priv) { voodoo_t *voodoo = (voodoo_t *) priv; const monitor_t *monitor = &monitors[voodoo->monitor_index]; + int v_y_add = (monitor->mon_overscan_y >> 1); + int v_x_add = (monitor->mon_overscan_x >> 1); if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) { if (voodoo->line < voodoo->v_disp) { @@ -534,7 +536,7 @@ voodoo_callback(void *priv) } if (draw_voodoo->dirty_line[draw_line]) { - uint32_t *p = &monitor->target_buffer->line[voodoo->line + 8][8]; + uint32_t *p = &monitor->target_buffer->line[voodoo->line + v_y_add][v_x_add]; uint16_t *src = (uint16_t *) &draw_voodoo->fb_mem[draw_voodoo->front_offset + draw_line * draw_voodoo->row_width]; int x; @@ -548,8 +550,8 @@ voodoo_callback(void *priv) voodoo->dirty_line_high = voodoo->line; /* Draw left overscan. */ - for (x = 0; x < 8; x++) - monitor->target_buffer->line[voodoo->line + 8][x] = 0x00000000; + for (x = 0; x < v_x_add; x++) + monitor->target_buffer->line[voodoo->line + v_y_add][x] = 0x00000000; if (voodoo->scrfilter && voodoo->scrfilterEnabled) { uint8_t fil[4096 * 3]; /* interleaved 24-bit RGB */ @@ -570,8 +572,9 @@ voodoo_callback(void *priv) } /* Draw right overscan. */ - for (x = 0; x < 8; x++) - monitor->target_buffer->line[voodoo->line + 8][voodoo->h_disp + x + 8] = 0x00000000; + for (x = 0; x < v_x_add; x++) + monitor->target_buffer->line[voodoo->line + v_y_add][voodoo->h_disp + x + v_x_add] = + 0x00000000; } } }