Added Mach64 polygon command.
This commit is contained in:
parent
37a6f796de
commit
24e6c2555e
1 changed files with 87 additions and 29 deletions
|
|
@ -138,6 +138,7 @@ typedef struct mach64_t
|
||||||
int clr_cmp_src;
|
int clr_cmp_src;
|
||||||
|
|
||||||
int err;
|
int err;
|
||||||
|
int poly_draw;
|
||||||
} accel;
|
} accel;
|
||||||
} mach64_t;
|
} mach64_t;
|
||||||
|
|
||||||
|
|
@ -186,13 +187,20 @@ enum
|
||||||
DP_BYTE_PIX_ORDER = (1 << 24)
|
DP_BYTE_PIX_ORDER = (1 << 24)
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mach64_width[8] = {0, 0, 0, 1, 1, 2, 2, 0};
|
#define WIDTH_1BIT 3
|
||||||
|
|
||||||
|
static int mach64_width[8] = {WIDTH_1BIT, 0, 0, 1, 1, 2, 2, 0};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
DST_X_TILE = 0x08,
|
DST_X_DIR = 0x01,
|
||||||
DST_Y_TILE = 0x10,
|
DST_Y_DIR = 0x02,
|
||||||
DST_24_ROT_EN = 0x80
|
DST_Y_MAJOR = 0x04,
|
||||||
|
DST_X_TILE = 0x08,
|
||||||
|
DST_Y_TILE = 0x10,
|
||||||
|
DST_LAST_PEL = 0x20,
|
||||||
|
DST_POLYGON_EN = 0x40,
|
||||||
|
DST_24_ROT_EN = 0x80
|
||||||
};
|
};
|
||||||
|
|
||||||
void mach64_write(uint32_t addr, uint8_t val, void *priv);
|
void mach64_write(uint32_t addr, uint8_t val, void *priv);
|
||||||
|
|
@ -509,13 +517,20 @@ void mach64_start_fill(mach64_t *mach64)
|
||||||
mach64->accel.dst_x *= mach64_inc[mach64->accel.dst_pix_width];
|
mach64->accel.dst_x *= mach64_inc[mach64->accel.dst_pix_width];
|
||||||
mach64->accel.dst_pitch *= mach64_inc[mach64->accel.dst_pix_width];*/
|
mach64->accel.dst_pitch *= mach64_inc[mach64->accel.dst_pix_width];*/
|
||||||
|
|
||||||
mach64->accel.src_offset >>= mach64->accel.src_size;
|
if (mach64->accel.src_size == WIDTH_1BIT)
|
||||||
mach64->accel.dst_offset >>= mach64->accel.dst_size;
|
mach64->accel.src_offset <<= 3;
|
||||||
|
else
|
||||||
|
mach64->accel.src_offset >>= mach64->accel.src_size;
|
||||||
|
|
||||||
|
if (mach64->accel.dst_size == WIDTH_1BIT)
|
||||||
|
mach64->accel.dst_offset <<= 3;
|
||||||
|
else
|
||||||
|
mach64->accel.dst_offset >>= mach64->accel.dst_size;
|
||||||
|
|
||||||
/* if (mach64->accel.source_fg == SRC_BLITSRC || mach64->accel.source_bg == SRC_BLITSRC)
|
/* if (mach64->accel.source_fg == SRC_BLITSRC || mach64->accel.source_bg == SRC_BLITSRC)
|
||||||
{*/
|
{*/
|
||||||
mach64->accel.xinc = (mach64->dst_cntl & 1) ? 1 : -1;
|
mach64->accel.xinc = (mach64->dst_cntl & DST_X_DIR) ? 1 : -1;
|
||||||
mach64->accel.yinc = (mach64->dst_cntl & 2) ? 1 : -1;
|
mach64->accel.yinc = (mach64->dst_cntl & DST_Y_DIR) ? 1 : -1;
|
||||||
/* }
|
/* }
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -554,6 +569,8 @@ void mach64_start_fill(mach64_t *mach64)
|
||||||
mach64->accel.clr_cmp_fn = mach64->clr_cmp_cntl & 7;
|
mach64->accel.clr_cmp_fn = mach64->clr_cmp_cntl & 7;
|
||||||
mach64->accel.clr_cmp_src = mach64->clr_cmp_cntl & (1 << 24);
|
mach64->accel.clr_cmp_src = mach64->clr_cmp_cntl & (1 << 24);
|
||||||
|
|
||||||
|
mach64->accel.poly_draw = 0;
|
||||||
|
|
||||||
mach64->accel.busy = 1;
|
mach64->accel.busy = 1;
|
||||||
#ifdef MACH64_DEBUG
|
#ifdef MACH64_DEBUG
|
||||||
pclog("mach64_start_fill : dst %i, %i src %i, %i size %i, %i src pitch %i offset %X dst pitch %i offset %X scissor %i %i %i %i src_fg %i mix %02X %02X\n", mach64->accel.dst_x_start, mach64->accel.dst_y_start, mach64->accel.src_x_start, mach64->accel.src_y_start, mach64->accel.dst_width, mach64->accel.dst_height, mach64->accel.src_pitch, mach64->accel.src_offset, mach64->accel.dst_pitch, mach64->accel.dst_offset, mach64->accel.sc_left, mach64->accel.sc_right, mach64->accel.sc_top, mach64->accel.sc_bottom, mach64->accel.source_fg, mach64->accel.mix_fg, mach64->accel.mix_bg);
|
pclog("mach64_start_fill : dst %i, %i src %i, %i size %i, %i src pitch %i offset %X dst pitch %i offset %X scissor %i %i %i %i src_fg %i mix %02X %02X\n", mach64->accel.dst_x_start, mach64->accel.dst_y_start, mach64->accel.src_x_start, mach64->accel.src_y_start, mach64->accel.dst_width, mach64->accel.dst_height, mach64->accel.src_pitch, mach64->accel.src_offset, mach64->accel.dst_pitch, mach64->accel.dst_offset, mach64->accel.sc_left, mach64->accel.sc_right, mach64->accel.sc_top, mach64->accel.sc_bottom, mach64->accel.source_fg, mach64->accel.mix_fg, mach64->accel.mix_bg);
|
||||||
|
|
@ -591,8 +608,15 @@ void mach64_start_line(mach64_t *mach64)
|
||||||
mach64->accel.dst_size = mach64_width[mach64->accel.dst_pix_width];
|
mach64->accel.dst_size = mach64_width[mach64->accel.dst_pix_width];
|
||||||
mach64->accel.src_size = mach64_width[mach64->accel.src_pix_width];
|
mach64->accel.src_size = mach64_width[mach64->accel.src_pix_width];
|
||||||
|
|
||||||
mach64->accel.src_offset >>= mach64->accel.src_size;
|
if (mach64->accel.src_size == WIDTH_1BIT)
|
||||||
mach64->accel.dst_offset >>= mach64->accel.dst_size;
|
mach64->accel.src_offset <<= 3;
|
||||||
|
else
|
||||||
|
mach64->accel.src_offset >>= mach64->accel.src_size;
|
||||||
|
|
||||||
|
if (mach64->accel.dst_size == WIDTH_1BIT)
|
||||||
|
mach64->accel.dst_offset <<= 3;
|
||||||
|
else
|
||||||
|
mach64->accel.dst_offset >>= mach64->accel.dst_size;
|
||||||
|
|
||||||
/* mach64->accel.src_pitch *= mach64_inc[mach64->accel.src_pix_width];
|
/* mach64->accel.src_pitch *= mach64_inc[mach64->accel.src_pix_width];
|
||||||
mach64->accel.dst_pitch *= mach64_inc[mach64->accel.dst_pix_width];*/
|
mach64->accel.dst_pitch *= mach64_inc[mach64->accel.dst_pix_width];*/
|
||||||
|
|
@ -633,7 +657,8 @@ void mach64_start_line(mach64_t *mach64)
|
||||||
|
|
||||||
#define READ(addr, dat, width) if (width == 0) dat = svga->vram[((addr)) & mach64->vram_mask]; \
|
#define READ(addr, dat, width) if (width == 0) dat = svga->vram[((addr)) & mach64->vram_mask]; \
|
||||||
else if (width == 1) dat = *(uint16_t *)&svga->vram[((addr) << 1) & mach64->vram_mask]; \
|
else if (width == 1) dat = *(uint16_t *)&svga->vram[((addr) << 1) & mach64->vram_mask]; \
|
||||||
else dat = *(uint32_t *)&svga->vram[((addr) << 2) & mach64->vram_mask];
|
else if (width == 2) dat = *(uint32_t *)&svga->vram[((addr) << 2) & mach64->vram_mask]; \
|
||||||
|
else dat = (svga->vram[((addr) >> 3) & mach64->vram_mask] >> ((addr) & 7)) & 1;
|
||||||
|
|
||||||
#define MIX switch (mix ? mach64->accel.mix_fg : mach64->accel.mix_bg) \
|
#define MIX switch (mix ? mach64->accel.mix_fg : mach64->accel.mix_bg) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -665,10 +690,18 @@ void mach64_start_line(mach64_t *mach64)
|
||||||
*(uint16_t *)&svga->vram[((addr) << 1) & mach64->vram_mask] = dest_dat; \
|
*(uint16_t *)&svga->vram[((addr) << 1) & mach64->vram_mask] = dest_dat; \
|
||||||
svga->changedvram[(((addr) << 1) & mach64->vram_mask) >> 12] = changeframecount; \
|
svga->changedvram[(((addr) << 1) & mach64->vram_mask) >> 12] = changeframecount; \
|
||||||
} \
|
} \
|
||||||
else \
|
else if (width == 2) \
|
||||||
{ \
|
{ \
|
||||||
*(uint32_t *)&svga->vram[((addr) << 2) & mach64->vram_mask] = dest_dat; \
|
*(uint32_t *)&svga->vram[((addr) << 2) & mach64->vram_mask] = dest_dat; \
|
||||||
svga->changedvram[(((addr) << 2) & mach64->vram_mask) >> 12] = changeframecount; \
|
svga->changedvram[(((addr) << 2) & mach64->vram_mask) >> 12] = changeframecount; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
if (dest_dat & 1) \
|
||||||
|
svga->vram[((addr) >> 3) & mach64->vram_mask] |= 1 << ((addr) & 7); \
|
||||||
|
else \
|
||||||
|
svga->vram[((addr) >> 3) & mach64->vram_mask] &= ~(1 << ((addr) & 7)); \
|
||||||
|
svga->changedvram[(((addr) >> 3) & mach64->vram_mask) >> 12] = changeframecount; \
|
||||||
}
|
}
|
||||||
|
|
||||||
void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
|
|
@ -762,26 +795,35 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
src_dat = 0;
|
src_dat = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (mach64->dst_cntl & DST_POLYGON_EN)
|
||||||
READ(mach64->accel.dst_offset + (dst_y * mach64->accel.dst_pitch) + dst_x, dest_dat, mach64->accel.dst_size);
|
|
||||||
|
|
||||||
switch (mach64->accel.clr_cmp_fn)
|
|
||||||
{
|
{
|
||||||
case 1: /*TRUE*/
|
int poly_src;
|
||||||
cmp_clr = 1;
|
READ(mach64->accel.src_offset + (src_y * mach64->accel.src_pitch) + src_x, poly_src, mach64->accel.src_size);
|
||||||
break;
|
if (poly_src)
|
||||||
case 4: /*DST_CLR != CLR_CMP_CLR*/
|
mach64->accel.poly_draw = !mach64->accel.poly_draw;
|
||||||
cmp_clr = (((mach64->accel.clr_cmp_src) ? src_dat : dest_dat) & mach64->accel.clr_cmp_mask) != mach64->accel.clr_cmp_clr;
|
|
||||||
break;
|
|
||||||
case 5: /*DST_CLR == CLR_CMP_CLR*/
|
|
||||||
cmp_clr = (((mach64->accel.clr_cmp_src) ? src_dat : dest_dat) & mach64->accel.clr_cmp_mask) == mach64->accel.clr_cmp_clr;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (!(mach64->dst_cntl & DST_POLYGON_EN) || mach64->accel.poly_draw)
|
||||||
if (!cmp_clr)
|
{
|
||||||
MIX
|
READ(mach64->accel.dst_offset + (dst_y * mach64->accel.dst_pitch) + dst_x, dest_dat, mach64->accel.dst_size);
|
||||||
|
|
||||||
WRITE(mach64->accel.dst_offset + (dst_y * mach64->accel.dst_pitch) + dst_x, mach64->accel.dst_size);
|
switch (mach64->accel.clr_cmp_fn)
|
||||||
|
{
|
||||||
|
case 1: /*TRUE*/
|
||||||
|
cmp_clr = 1;
|
||||||
|
break;
|
||||||
|
case 4: /*DST_CLR != CLR_CMP_CLR*/
|
||||||
|
cmp_clr = (((mach64->accel.clr_cmp_src) ? src_dat : dest_dat) & mach64->accel.clr_cmp_mask) != mach64->accel.clr_cmp_clr;
|
||||||
|
break;
|
||||||
|
case 5: /*DST_CLR == CLR_CMP_CLR*/
|
||||||
|
cmp_clr = (((mach64->accel.clr_cmp_src) ? src_dat : dest_dat) & mach64->accel.clr_cmp_mask) == mach64->accel.clr_cmp_clr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cmp_clr)
|
||||||
|
MIX
|
||||||
|
|
||||||
|
WRITE(mach64->accel.dst_offset + (dst_y * mach64->accel.dst_pitch) + dst_x, mach64->accel.dst_size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mach64->dst_cntl & DST_24_ROT_EN)
|
if (mach64->dst_cntl & DST_24_ROT_EN)
|
||||||
|
|
@ -830,6 +872,8 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
mach64->accel.src_y_count = mach64->accel.src_height1;
|
mach64->accel.src_y_count = mach64->accel.src_height1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mach64->accel.poly_draw = 0;
|
||||||
|
|
||||||
mach64->accel.dst_height--;
|
mach64->accel.dst_height--;
|
||||||
|
|
||||||
if (mach64->accel.dst_height <= 0)
|
if (mach64->accel.dst_height <= 0)
|
||||||
|
|
@ -857,6 +901,7 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
uint32_t src_dat, dest_dat;
|
uint32_t src_dat, dest_dat;
|
||||||
uint32_t host_dat;
|
uint32_t host_dat;
|
||||||
int mix;
|
int mix;
|
||||||
|
int draw_pixel = !(mach64->dst_cntl & DST_POLYGON_EN);
|
||||||
|
|
||||||
if (mach64->accel.source_host)
|
if (mach64->accel.source_host)
|
||||||
{
|
{
|
||||||
|
|
@ -894,8 +939,21 @@ void mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mach64->dst_cntl & DST_POLYGON_EN)
|
||||||
|
{
|
||||||
|
if (mach64->dst_cntl & DST_Y_MAJOR)
|
||||||
|
draw_pixel = 1;
|
||||||
|
else if ((mach64->dst_cntl & DST_X_DIR) && mach64->accel.err < (mach64->dst_bres_dec + mach64->dst_bres_inc)) /*X+*/
|
||||||
|
draw_pixel = 1;
|
||||||
|
else if (!(mach64->dst_cntl & DST_X_DIR) && mach64->accel.err >= 0) /*X-*/
|
||||||
|
draw_pixel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mach64->accel.x_count == 1 && !(mach64->dst_cntl & DST_LAST_PEL))
|
||||||
|
draw_pixel = 0;
|
||||||
|
|
||||||
if (mach64->accel.dst_x >= mach64->accel.sc_left && mach64->accel.dst_x <= mach64->accel.sc_right &&
|
if (mach64->accel.dst_x >= mach64->accel.sc_left && mach64->accel.dst_x <= mach64->accel.sc_right &&
|
||||||
mach64->accel.dst_y >= mach64->accel.sc_top && mach64->accel.dst_y <= mach64->accel.sc_bottom)
|
mach64->accel.dst_y >= mach64->accel.sc_top && mach64->accel.dst_y <= mach64->accel.sc_bottom && draw_pixel)
|
||||||
{
|
{
|
||||||
switch (mix ? mach64->accel.source_fg : mach64->accel.source_bg)
|
switch (mix ? mach64->accel.source_fg : mach64->accel.source_bg)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue