Fixed ViRGE blitter memory masking when only 2MB video memory available.
This commit is contained in:
parent
977b798eda
commit
cb4c92c0f2
1 changed files with 17 additions and 15 deletions
|
|
@ -1826,20 +1826,20 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
|
||||||
switch (bpp) \
|
switch (bpp) \
|
||||||
{ \
|
{ \
|
||||||
case 0: /*8 bpp*/ \
|
case 0: /*8 bpp*/ \
|
||||||
val = vram[addr & 0x3fffff]; \
|
val = vram[addr & svga->vram_mask]; \
|
||||||
break; \
|
break; \
|
||||||
case 1: /*16 bpp*/ \
|
case 1: /*16 bpp*/ \
|
||||||
val = *(uint16_t *)&vram[addr & 0x3fffff]; \
|
val = *(uint16_t *)&vram[addr & svga->vram_mask]; \
|
||||||
break; \
|
break; \
|
||||||
case 2: /*24 bpp*/ \
|
case 2: /*24 bpp*/ \
|
||||||
val = (*(uint32_t *)&vram[addr & 0x3fffff]) & 0xffffff; \
|
val = (*(uint32_t *)&vram[addr & svga->vram_mask]) & 0xffffff; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define Z_READ(addr) *(uint16_t *)&vram[addr & 0x3fffff]
|
#define Z_READ(addr) *(uint16_t *)&vram[addr & svga->vram_mask]
|
||||||
|
|
||||||
#define Z_WRITE(addr, val) if (!(s3d_tri->cmd_set & CMD_SET_ZB_MODE)) *(uint16_t *)&vram[addr & 0x3fffff] = val
|
#define Z_WRITE(addr, val) if (!(s3d_tri->cmd_set & CMD_SET_ZB_MODE)) *(uint16_t *)&vram[addr & svga->vram_mask] = val
|
||||||
|
|
||||||
#define CLIP(x, y) \
|
#define CLIP(x, y) \
|
||||||
do \
|
do \
|
||||||
|
|
@ -1899,23 +1899,24 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p)
|
||||||
switch (bpp) \
|
switch (bpp) \
|
||||||
{ \
|
{ \
|
||||||
case 0: /*8 bpp*/ \
|
case 0: /*8 bpp*/ \
|
||||||
vram[addr & 0x3fffff] = val; \
|
vram[addr & svga->vram_mask] = val; \
|
||||||
virge->svga.changedvram[(addr & 0x3fffff) >> 12] = changeframecount; \
|
virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = changeframecount; \
|
||||||
break; \
|
break; \
|
||||||
case 1: /*16 bpp*/ \
|
case 1: /*16 bpp*/ \
|
||||||
*(uint16_t *)&vram[addr & 0x3fffff] = val; \
|
*(uint16_t *)&vram[addr & svga->vram_mask] = val; \
|
||||||
virge->svga.changedvram[(addr & 0x3fffff) >> 12] = changeframecount; \
|
virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = changeframecount; \
|
||||||
break; \
|
break; \
|
||||||
case 2: /*24 bpp*/ \
|
case 2: /*24 bpp*/ \
|
||||||
*(uint32_t *)&vram[addr & 0x3fffff] = (val & 0xffffff) | \
|
*(uint32_t *)&vram[addr & svga->vram_mask] = (val & 0xffffff) | \
|
||||||
(vram[(addr + 3) & 0x3fffff] << 24); \
|
(vram[(addr + 3) & svga->vram_mask] << 24); \
|
||||||
virge->svga.changedvram[(addr & 0x3fffff) >> 12] = changeframecount; \
|
virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = changeframecount; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
|
static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat)
|
||||||
{
|
{
|
||||||
|
svga_t *svga = &virge->svga;
|
||||||
uint8_t *vram = virge->svga.vram;
|
uint8_t *vram = virge->svga.vram;
|
||||||
uint32_t mono_pattern[64];
|
uint32_t mono_pattern[64];
|
||||||
int count_mask;
|
int count_mask;
|
||||||
|
|
@ -2930,6 +2931,7 @@ static void dest_pixel_lit_texture_modulate(s3d_state_t *state)
|
||||||
|
|
||||||
static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int32_t dx2)
|
static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int32_t dx2)
|
||||||
{
|
{
|
||||||
|
svga_t *svga = &virge->svga;
|
||||||
uint8_t *vram = virge->svga.vram;
|
uint8_t *vram = virge->svga.vram;
|
||||||
|
|
||||||
int x_dir = s3d_tri->tlr ? 1 : -1;
|
int x_dir = s3d_tri->tlr ? 1 : -1;
|
||||||
|
|
@ -3061,7 +3063,7 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virge->svga.changedvram[(dest_offset & 0x3fffff) >> 12] = changeframecount;
|
virge->svga.changedvram[(dest_offset & svga->vram_mask) >> 12] = changeframecount;
|
||||||
|
|
||||||
dest_addr = dest_offset + (x * (bpp + 1));
|
dest_addr = dest_offset + (x * (bpp + 1));
|
||||||
z_addr = z_offset + (x << 1);
|
z_addr = z_offset + (x << 1);
|
||||||
|
|
@ -3095,11 +3097,11 @@ static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int3
|
||||||
/*Not implemented yet*/
|
/*Not implemented yet*/
|
||||||
break;
|
break;
|
||||||
case 1: /*16 bpp*/
|
case 1: /*16 bpp*/
|
||||||
src_col = *(uint16_t *)&vram[dest_addr & 0x3fffff];
|
src_col = *(uint16_t *)&vram[dest_addr & svga->vram_mask];
|
||||||
RGB15_TO_24(src_col, src_r, src_g, src_b);
|
RGB15_TO_24(src_col, src_r, src_g, src_b);
|
||||||
break;
|
break;
|
||||||
case 2: /*24 bpp*/
|
case 2: /*24 bpp*/
|
||||||
src_col = (*(uint32_t *)&vram[dest_addr & 0x3fffff]) & 0xffffff;
|
src_col = (*(uint32_t *)&vram[dest_addr & svga->vram_mask]) & 0xffffff;
|
||||||
RGB24_TO_24(src_col, src_r, src_g, src_b);
|
RGB24_TO_24(src_col, src_r, src_g, src_b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue