Increase size of Voodoo dirty_line array to 2048 lines, and add some
bounds checking before accessing. Fixes crash running 3DMark 2001 on Voodoo 3.
This commit is contained in:
parent
5c20fe7c57
commit
8cfb60608e
6 changed files with 13 additions and 10 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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--;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue