From 3e5e519d10ed8727943544a12a2649c8388f0a73 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sun, 27 Sep 2020 21:45:02 +0100 Subject: [PATCH] Implement dirty updating on Banshee 16bpp tiled modes --- src/vid_voodoo_banshee.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/vid_voodoo_banshee.c b/src/vid_voodoo_banshee.c index 1062e56..144c7f0 100644 --- a/src/vid_voodoo_banshee.c +++ b/src/vid_voodoo_banshee.c @@ -292,25 +292,34 @@ static void banshee_render_16bpp_tiled(svga_t *svga) int offset = 32; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset]; uint32_t addr = banshee->desktop_addr + (banshee->desktop_y & 31) * 128 + ((banshee->desktop_y >> 5) * banshee->desktop_stride_tiled); - - if (svga->firstline_draw == 2000) - svga->firstline_draw = svga->displine; - svga->lastline_draw = svga->displine; + int drawn = 0; for (x = 0; x <= svga->hdisp; x += 64) { - int xx; - - for (xx = 0; xx < 64; xx += 2) + if (svga->hwcursor_on || svga->overlay_on) + svga->changedvram[addr >> 12] = 2; + if (svga->changedvram[addr >> 12] || svga->fullchange) { - uint32_t dat = *(uint32_t *)(&svga->vram[(addr + (xx << 1)) & svga->vram_display_mask]); - *p++ = video_16to32[dat & 0xffff]; - *p++ = video_16to32[dat >> 16]; + uint16_t *vram_p = (uint16_t *)&svga->vram[addr & svga->vram_display_mask]; + int xx; + + for (xx = 0; xx < 64; xx++) + *p++ = video_16to32[*vram_p++]; + + drawn = 1; } - + else + p += 64; addr += 128*32; } + if (drawn) + { + if (svga->firstline_draw == 2000) + svga->firstline_draw = svga->displine; + svga->lastline_draw = svga->displine; + } + banshee->desktop_y++; }