Mask ViRGE source colour to current destination colour depth. Fixes chroma transparency in Beasts and Bumpkins.
This commit is contained in:
parent
ae52810cc8
commit
f0b213fef0
1 changed files with 10 additions and 3 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue