voodoo.c, vooddefs.h: Added support for writes to trexInit1 register, to return TMU configuration data. [Peter Ferrie]

This commit is contained in:
Scott Stone 2014-09-09 07:44:33 +00:00
parent de2259e591
commit b906c7d7f4
2 changed files with 31 additions and 3 deletions

View File

@ -1346,6 +1346,7 @@ static const UINT8 dither_matrix_2x2[16] =
#define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */ #define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */
#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */ #define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */
#define TREXINIT_SEND_TMU_CONFIG(val) (((val) >> 18) & 1)
/************************************* /*************************************
@ -1724,6 +1725,9 @@ struct voodoo_state
int next_rasterizer; /* next rasterizer index */ int next_rasterizer; /* next rasterizer index */
raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */ raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */
raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */ raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */
bool send_config;
UINT32 tmu_config;
}; };
@ -3642,9 +3646,18 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co
/* result in texel */ \ /* result in texel */ \
/* note that they set LOD min to 8 to "disable" a TMU */ \ /* note that they set LOD min to 8 to "disable" a TMU */ \
if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8)) \ if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8)) \
{ \
if (!v->send_config) \
{ \
TEXTURE_PIPELINE(&v->tmu[0], x, dither4, TEXMODE0, texel, \ TEXTURE_PIPELINE(&v->tmu[0], x, dither4, TEXMODE0, texel, \
v->tmu[0].lookup, extra->lodbase0, \ v->tmu[0].lookup, extra->lodbase0, \
iters0, itert0, iterw0, texel); \ iters0, itert0, iterw0, texel); \
} \
else \
{ \
texel.u=v->tmu_config; \
} \
} \
\ \
/* colorpath pipeline selects source colors and does blending */ \ /* colorpath pipeline selects source colors and does blending */ \
CLAMPED_ARGB(iterr, iterg, iterb, itera, FBZCOLORPATH, iterargb); \ CLAMPED_ARGB(iterr, iterg, iterb, itera, FBZCOLORPATH, iterargb); \

View File

@ -2885,6 +2885,12 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data)
} }
break; break;
case trexInit1:
/* send tmu config data to the frame buffer */
v->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0);
goto default_case;
break;
/* these registers are referenced in the renderer; we must wait for pending work before changing */ /* these registers are referenced in the renderer; we must wait for pending work before changing */
case chromaRange: case chromaRange:
case chromaKey: case chromaKey:
@ -2901,6 +2907,7 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data)
/* by default, just feed the data to the chips */ /* by default, just feed the data to the chips */
default: default:
default_case:
if (chips & 1) v->reg[0x000 + regnum].u = data; if (chips & 1) v->reg[0x000 + regnum].u = data;
if (chips & 2) v->reg[0x100 + regnum].u = data; if (chips & 2) v->reg[0x100 + regnum].u = data;
if (chips & 4) v->reg[0x200 + regnum].u = data; if (chips & 4) v->reg[0x200 + regnum].u = data;
@ -4913,6 +4920,8 @@ void voodoo_device::common_start_voodoo(UINT8 type)
} }
} }
v->tmu_config = 0x11; // revision 1
/* configure type-specific values */ /* configure type-specific values */
switch (v->type) switch (v->type)
{ {
@ -4928,6 +4937,7 @@ void voodoo_device::common_start_voodoo(UINT8 type)
v->regnames = voodoo_reg_name; v->regnames = voodoo_reg_name;
v->alt_regmap = 0; v->alt_regmap = 0;
v->fbi.lfb_stride = 10; v->fbi.lfb_stride = 10;
v->tmu_config |= 0x800;
break; break;
case TYPE_VOODOO_BANSHEE: case TYPE_VOODOO_BANSHEE:
@ -4963,6 +4973,10 @@ void voodoo_device::common_start_voodoo(UINT8 type)
assert_always(v->screen != NULL, "Unable to find screen attached to voodoo"); assert_always(v->screen != NULL, "Unable to find screen attached to voodoo");
v->cpu = machine().device(m_cputag); v->cpu = machine().device(m_cputag);
assert_always(v->cpu != NULL, "Unable to find CPU attached to voodoo"); assert_always(v->cpu != NULL, "Unable to find CPU attached to voodoo");
if (m_tmumem1 != 0)
v->tmu_config |= 0xc0; // two TMUs
v->chipmask = 0x01; v->chipmask = 0x01;
v->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / v->freq; v->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / v->freq;
v->trigger = 51324 + v->index; v->trigger = 51324 + v->index;
@ -5007,6 +5021,7 @@ void voodoo_device::common_start_voodoo(UINT8 type)
{ {
init_tmu(v, &v->tmu[1], &v->reg[0x200], tmumem[1], m_tmumem1 << 20); init_tmu(v, &v->tmu[1], &v->reg[0x200], tmumem[1], m_tmumem1 << 20);
v->chipmask |= 0x04; v->chipmask |= 0x04;
v->tmu_config |= 0x40;
} }
/* initialize some registers */ /* initialize some registers */