Fixed X and Y offsets on the Voodoo Banshee/3 16bpp tiled renderer, hardware cursor, and overlay.

This commit is contained in:
OBattler
2020-11-18 04:06:44 +01:00
parent e091c9e8f0
commit ab34733d65

View File

@@ -363,11 +363,13 @@ static void banshee_render_16bpp_tiled(svga_t *svga)
{ {
banshee_t *banshee = (banshee_t *)svga->p; banshee_t *banshee = (banshee_t *)svga->p;
int x; int x;
int offset = 32; uint32_t *p = &((uint32_t *)buffer32->line[svga->displine + svga->y_add])[svga->x_add];
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
uint32_t addr; uint32_t addr;
int drawn = 0; int drawn = 0;
if ((svga->displine + svga->y_add) < 0)
return;
if (banshee->vidProcCfg & VIDPROCCFG_HALF_MODE) if (banshee->vidProcCfg & VIDPROCCFG_HALF_MODE)
addr = banshee->desktop_addr + ((banshee->desktop_y >> 1) & 31) * 128 + ((banshee->desktop_y >> 6) * banshee->desktop_stride_tiled); addr = banshee->desktop_addr + ((banshee->desktop_y >> 1) & 31) * 128 + ((banshee->desktop_y >> 6) * banshee->desktop_stride_tiled);
else else
@@ -1605,7 +1607,7 @@ void banshee_hwcursor_draw(svga_t *svga, int displine)
for (xx = 0; xx < 8; xx++) for (xx = 0; xx < 8; xx++)
{ {
if (plane0[x >> 3] & (1 << 7)) if (plane0[x >> 3] & (1 << 7))
((uint32_t *)buffer32->line[displine])[x_off + xx] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; ((uint32_t *)buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0;
plane0[x >> 3] <<= 1; plane0[x >> 3] <<= 1;
plane1[x >> 3] <<= 1; plane1[x >> 3] <<= 1;
@@ -1625,9 +1627,9 @@ void banshee_hwcursor_draw(svga_t *svga, int displine)
for (xx = 0; xx < 8; xx++) for (xx = 0; xx < 8; xx++)
{ {
if (!(plane0[x >> 3] & (1 << 7))) if (!(plane0[x >> 3] & (1 << 7)))
((uint32_t *)buffer32->line[displine])[x_off + xx] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; ((uint32_t *)buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0;
else if (plane1[x >> 3] & (1 << 7)) else if (plane1[x >> 3] & (1 << 7))
((uint32_t *)buffer32->line[displine])[x_off + xx] ^= 0xffffff; ((uint32_t *)buffer32->line[displine])[x_off + xx + svga->x_add] ^= 0xffffff;
plane0[x >> 3] <<= 1; plane0[x >> 3] <<= 1;
plane1[x >> 3] <<= 1; plane1[x >> 3] <<= 1;
@@ -1961,7 +1963,7 @@ static void banshee_overlay_draw(svga_t *svga, int displine)
// pclog("displine=%i addr=%08x %08x %08x %08x\n", displine, svga->overlay_latch.addr, src_addr, voodoo->overlay.vidOverlayDvdy, *(uint32_t *)src); // 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) // if (src_addr >= 0x800000)
// fatal("overlay out of range!\n"); // fatal("overlay out of range!\n");
p = &((uint32_t *)buffer32->line[displine])[svga->overlay_latch.x + 32]; p = &((uint32_t *)buffer32->line[displine])[svga->overlay_latch.x + svga->x_add];
if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled)
skip_filtering = ((banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_MASK) != VIDPROCCFG_FILTER_MODE_BILINEAR && skip_filtering = ((banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_MASK) != VIDPROCCFG_FILTER_MODE_BILINEAR &&