Mask ViRGE source colour to current destination colour depth. Fixes chroma transparency in Beasts and Bumpkins.

This commit is contained in:
SarahW 2017-11-26 17:46:21 +00:00
commit f0b213fef0

View file

@ -1923,6 +1923,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
int x_mul; int x_mul;
int cpu_dat_shift; int cpu_dat_shift;
uint32_t *pattern_data; uint32_t *pattern_data;
uint32_t src_fg_clr, src_bg_clr;
switch (virge->s3d.cmd_set & CMD_SET_FORMAT_MASK) switch (virge->s3d.cmd_set & CMD_SET_FORMAT_MASK)
{ {
@ -1931,12 +1932,16 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
x_mul = 1; x_mul = 1;
cpu_dat_shift = 8; cpu_dat_shift = 8;
pattern_data = virge->s3d.pattern_8; pattern_data = virge->s3d.pattern_8;
src_fg_clr = virge->s3d.src_fg_clr & 0xff;
src_bg_clr = virge->s3d.src_bg_clr & 0xff;
break; break;
case CMD_SET_FORMAT_16: case CMD_SET_FORMAT_16:
bpp = 1; bpp = 1;
x_mul = 2; x_mul = 2;
cpu_dat_shift = 16; cpu_dat_shift = 16;
pattern_data = virge->s3d.pattern_16; pattern_data = virge->s3d.pattern_16;
src_fg_clr = virge->s3d.src_fg_clr & 0xffff;
src_bg_clr = virge->s3d.src_bg_clr & 0xffff;
break; break;
case CMD_SET_FORMAT_24: case CMD_SET_FORMAT_24:
default: default:
@ -1944,6 +1949,8 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
x_mul = 3; x_mul = 3;
cpu_dat_shift = 24; cpu_dat_shift = 24;
pattern_data = virge->s3d.pattern_32; pattern_data = virge->s3d.pattern_32;
src_fg_clr = virge->s3d.src_fg_clr;
src_bg_clr = virge->s3d.src_bg_clr;
break; break;
} }
if (virge->s3d.cmd_set & CMD_SET_MP) if (virge->s3d.cmd_set & CMD_SET_MP)
@ -2026,7 +2033,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
case 0: case 0:
case CMD_SET_MS: case CMD_SET_MS:
READ(src_addr, source); READ(src_addr, source);
if ((virge->s3d.cmd_set & CMD_SET_TP) && source == virge->s3d.src_fg_clr) if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr)
update = 0; update = 0;
break; break;
case CMD_SET_IDS: case CMD_SET_IDS:
@ -2057,11 +2064,11 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
count = 0; count = 0;
} }
} }
if ((virge->s3d.cmd_set & CMD_SET_TP) && source == virge->s3d.src_fg_clr) if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr)
update = 0; update = 0;
break; break;
case CMD_SET_IDS | CMD_SET_MS: case CMD_SET_IDS | CMD_SET_MS:
source = (cpu_dat & (1 << 31)) ? virge->s3d.src_fg_clr : virge->s3d.src_bg_clr; source = (cpu_dat & (1 << 31)) ? src_fg_clr : src_bg_clr;
if ((virge->s3d.cmd_set & CMD_SET_TP) && !(cpu_dat & (1 << 31))) if ((virge->s3d.cmd_set & CMD_SET_TP) && !(cpu_dat & (1 << 31)))
update = 0; update = 0;
cpu_dat <<= 1; cpu_dat <<= 1;