diff --git a/src/vid_voodoo_banshee.c b/src/vid_voodoo_banshee.c index c6df176..06773d7 100644 --- a/src/vid_voodoo_banshee.c +++ b/src/vid_voodoo_banshee.c @@ -1929,14 +1929,16 @@ static void banshee_overlay_draw(svga_t *svga, int displine) if (svga->render == svga_render_null && !svga->changedvram[src_addr >> 12] && !svga->changedvram[src_addr2 >> 12] && - !svga->fullchange && !voodoo->dirty_line[voodoo->overlay.src_y >> 20] && + !svga->fullchange && + ((voodoo->overlay.src_y >> 20) < 2048 && !voodoo->dirty_line[voodoo->overlay.src_y >> 20]) && !(banshee->vidProcCfg & VIDPROCCFG_V_SCALE_ENABLE)) { voodoo->overlay.src_y += (1 << 20); return; } - voodoo->dirty_line[voodoo->overlay.src_y >> 20] = 0; + if ((voodoo->overlay.src_y >> 20) < 2048) + voodoo->dirty_line[voodoo->overlay.src_y >> 20] = 0; // pclog("displine=%i addr=%08x %08x %08x %08x\n", displine, svga->overlay_latch.addr, src_addr, voodoo->overlay.vidOverlayDvdy, *(uint32_t *)src); // if (src_addr >= 0x800000) // fatal("overlay out of range!\n"); @@ -2214,7 +2216,7 @@ void banshee_set_overlay_addr(void *p, uint32_t addr) banshee->svga.overlay.addr = banshee->voodoo->leftOverlayBuf & 0xfffffff; banshee->svga.overlay_latch.addr = banshee->voodoo->leftOverlayBuf & 0xfffffff; - memset(voodoo->dirty_line, 1, 1024); + memset(voodoo->dirty_line, 1, sizeof(voodoo->dirty_line)); } static void banshee_vsync_callback(svga_t *svga) @@ -2231,7 +2233,7 @@ static void banshee_vsync_callback(svga_t *svga) voodoo->swap_pending = 0; thread_unlock_mutex(voodoo->swap_mutex); - memset(voodoo->dirty_line, 1, 1024); + memset(voodoo->dirty_line, 1, sizeof(voodoo->dirty_line)); voodoo->retrace_count = 0; banshee_set_overlay_addr(banshee, voodoo->swap_offset); thread_set_event(voodoo->wake_fifo_thread); diff --git a/src/vid_voodoo_common.h b/src/vid_voodoo_common.h index 14f775f..9fb9c05 100644 --- a/src/vid_voodoo_common.h +++ b/src/vid_voodoo_common.h @@ -438,7 +438,7 @@ typedef struct voodoo_t rgb_t clutData256[256]; uint32_t video_16to32[0x10000]; - uint8_t dirty_line[1024]; + uint8_t dirty_line[2048]; int dirty_line_low, dirty_line_high; int fb_write_buffer, fb_draw_buffer; diff --git a/src/vid_voodoo_fb.c b/src/vid_voodoo_fb.c index b3d3918..cbf8c17 100644 --- a/src/vid_voodoo_fb.c +++ b/src/vid_voodoo_fb.c @@ -195,7 +195,7 @@ void voodoo_fb_writew(uint32_t addr, uint16_t val, void *p) } - if (voodoo->fb_write_offset == voodoo->params.front_offset) + if (voodoo->fb_write_offset == voodoo->params.front_offset && y < 2048) voodoo->dirty_line[y] = 1; if (voodoo->col_tiled) @@ -355,7 +355,7 @@ void voodoo_fb_writel(uint32_t addr, uint32_t val, void *p) y >>= 1; } - if (voodoo->fb_write_offset == voodoo->params.front_offset) + if (voodoo->fb_write_offset == voodoo->params.front_offset && y < 2048) voodoo->dirty_line[y] = 1; if (voodoo->col_tiled) diff --git a/src/vid_voodoo_fifo.c b/src/vid_voodoo_fifo.c index 1c807d4..472df3f 100644 --- a/src/vid_voodoo_fifo.c +++ b/src/vid_voodoo_fifo.c @@ -95,7 +95,7 @@ void voodoo_wait_for_swap_complete(voodoo_t *voodoo) if ((voodoo->swap_pending && voodoo->flush) || FIFO_FULL) { /*Main thread is waiting for FIFO to empty, so skip vsync wait and just swap*/ - memset(voodoo->dirty_line, 1, 1024); + memset(voodoo->dirty_line, 1, sizeof(voodoo->dirty_line)); voodoo->front_offset = voodoo->params.front_offset; if (voodoo->swap_count > 0) voodoo->swap_count--; diff --git a/src/vid_voodoo_reg.c b/src/vid_voodoo_reg.c index 82f4bac..d413130 100644 --- a/src/vid_voodoo_reg.c +++ b/src/vid_voodoo_reg.c @@ -102,7 +102,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) voodoo_wait_for_render_thread_idle(voodoo); if (!(val & 1)) { - memset(voodoo->dirty_line, 1, 1024); + memset(voodoo->dirty_line, 1, sizeof(voodoo->dirty_line)); voodoo->front_offset = voodoo->params.front_offset; thread_lock_mutex(voodoo->swap_mutex); if (voodoo->swap_count > 0) diff --git a/src/vid_voodoo_render.c b/src/vid_voodoo_render.c index 3648c78..4815db9 100644 --- a/src/vid_voodoo_render.c +++ b/src/vid_voodoo_render.c @@ -1363,8 +1363,9 @@ skip_pixel: voodoo->texel_count[odd_even] += state->texel_count; voodoo->fbiPixelsIn += state->pixel_count; - if (voodoo->params.draw_offset == voodoo->params.front_offset) + if (voodoo->params.draw_offset == voodoo->params.front_offset && (real_y >> 1) < 2048) voodoo->dirty_line[real_y >> 1] = 1; + next_line: if (SLI_ENABLED) {