Added Mach64 polygon command.

This commit is contained in:
TomW 2015-11-20 20:59:12 +00:00
commit 24e6c2555e

View file

@ -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)
{ {