Removing texture_rectangle_32bit and fill_rectangle_32bit to
hopefully generate a bug report which indicates any games using the modes. [Harmony]
This commit is contained in:
parent
93ecc1d425
commit
537e76be82
@ -38,7 +38,13 @@ static FILE *rdp_exec;
|
|||||||
// The functions in this file should be moved into the parent Processor class.
|
// The functions in this file should be moved into the parent Processor class.
|
||||||
#include "rdpfiltr.c"
|
#include "rdpfiltr.c"
|
||||||
|
|
||||||
void N64::RDP::Processor::GetAlphaCvg(UINT8 *comb_alpha)
|
namespace N64
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace RDP
|
||||||
|
{
|
||||||
|
|
||||||
|
void Processor::GetAlphaCvg(UINT8 *comb_alpha)
|
||||||
{
|
{
|
||||||
if(m_other_modes.cvg_times_alpha)
|
if(m_other_modes.cvg_times_alpha)
|
||||||
{
|
{
|
||||||
@ -100,7 +106,7 @@ void N64::RDP::Processor::GetAlphaCvg(UINT8 *comb_alpha)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void N64::RDP::Processor::VideoUpdate(bitmap_t *bitmap)
|
void Processor::VideoUpdate(bitmap_t *bitmap)
|
||||||
{
|
{
|
||||||
switch(n64_vi_control & 0x3)
|
switch(n64_vi_control & 0x3)
|
||||||
{
|
{
|
||||||
@ -118,7 +124,7 @@ void N64::RDP::Processor::VideoUpdate(bitmap_t *bitmap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::VideoUpdate16(bitmap_t *bitmap)
|
void Processor::VideoUpdate16(bitmap_t *bitmap)
|
||||||
{
|
{
|
||||||
int fsaa = (((n64_vi_control >> 8) & 3) < 2);
|
int fsaa = (((n64_vi_control >> 8) & 3) < 2);
|
||||||
int divot = (n64_vi_control >> 4) & 1;
|
int divot = (n64_vi_control >> 4) & 1;
|
||||||
@ -162,7 +168,7 @@ void N64::RDP::Processor::VideoUpdate16(bitmap_t *bitmap)
|
|||||||
|
|
||||||
for(int i = 0; i < hres; i++)
|
for(int i = 0; i < hres; i++)
|
||||||
{
|
{
|
||||||
N64::RDP::Color c;
|
Color c;
|
||||||
//int r, g, b;
|
//int r, g, b;
|
||||||
|
|
||||||
UINT16 pix = frame_buffer[pixels ^ WORD_ADDR_XOR];
|
UINT16 pix = frame_buffer[pixels ^ WORD_ADDR_XOR];
|
||||||
@ -253,7 +259,7 @@ void N64::RDP::Processor::VideoUpdate16(bitmap_t *bitmap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::VideoUpdate32(bitmap_t *bitmap)
|
void Processor::VideoUpdate32(bitmap_t *bitmap)
|
||||||
{
|
{
|
||||||
int gamma = (n64_vi_control >> 3) & 1;
|
int gamma = (n64_vi_control >> 3) & 1;
|
||||||
int gamma_dither = (n64_vi_control >> 2) & 1;
|
int gamma_dither = (n64_vi_control >> 2) & 1;
|
||||||
@ -336,7 +342,7 @@ void N64::RDP::Processor::VideoUpdate32(bitmap_t *bitmap)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void N64::RDP::Processor::TCDiv(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst)
|
void Processor::TCDiv(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst)
|
||||||
{
|
{
|
||||||
int shift;
|
int shift;
|
||||||
|
|
||||||
@ -362,7 +368,7 @@ void N64::RDP::Processor::TCDiv(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetSubAInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
void Processor::SetSubAInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0xf)
|
switch (code & 0xf)
|
||||||
{
|
{
|
||||||
@ -381,7 +387,7 @@ void N64::RDP::Processor::SetSubAInputRGB(UINT8 **input_r, UINT8 **input_g, UINT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetSubBInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
void Processor::SetSubBInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0xf)
|
switch (code & 0xf)
|
||||||
{
|
{
|
||||||
@ -400,7 +406,7 @@ void N64::RDP::Processor::SetSubBInputRGB(UINT8 **input_r, UINT8 **input_g, UINT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetMulInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
void Processor::SetMulInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0x1f)
|
switch (code & 0x1f)
|
||||||
{
|
{
|
||||||
@ -428,7 +434,7 @@ void N64::RDP::Processor::SetMulInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetAddInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
void Processor::SetAddInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0x7)
|
switch (code & 0x7)
|
||||||
{
|
{
|
||||||
@ -443,7 +449,7 @@ void N64::RDP::Processor::SetAddInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetSubInputAlpha(UINT8 **input, int code)
|
void Processor::SetSubInputAlpha(UINT8 **input, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0x7)
|
switch (code & 0x7)
|
||||||
{
|
{
|
||||||
@ -458,7 +464,7 @@ void N64::RDP::Processor::SetSubInputAlpha(UINT8 **input, int code)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetMulInputAlpha(UINT8 **input, int code)
|
void Processor::SetMulInputAlpha(UINT8 **input, int code)
|
||||||
{
|
{
|
||||||
switch (code & 0x7)
|
switch (code & 0x7)
|
||||||
{
|
{
|
||||||
@ -473,7 +479,7 @@ void N64::RDP::Processor::SetMulInputAlpha(UINT8 **input, int code)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::SetBlenderInput(int cycle, int which, UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, UINT8 **input_a, int a, int b)
|
void Processor::SetBlenderInput(int cycle, int which, UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, UINT8 **input_a, int a, int b)
|
||||||
{
|
{
|
||||||
switch (a & 0x3)
|
switch (a & 0x3)
|
||||||
{
|
{
|
||||||
@ -541,7 +547,7 @@ void N64::RDP::Processor::SetBlenderInput(int cycle, int which, UINT8 **input_r,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const UINT8 N64::RDP::Processor::s_bayer_matrix[16] =
|
const UINT8 Processor::s_bayer_matrix[16] =
|
||||||
{ /* Bayer matrix */
|
{ /* Bayer matrix */
|
||||||
0, 4, 1, 5,
|
0, 4, 1, 5,
|
||||||
6, 2, 7, 3,
|
6, 2, 7, 3,
|
||||||
@ -549,7 +555,7 @@ const UINT8 N64::RDP::Processor::s_bayer_matrix[16] =
|
|||||||
7, 3, 6, 2
|
7, 3, 6, 2
|
||||||
};
|
};
|
||||||
|
|
||||||
const UINT8 N64::RDP::Processor::s_magic_matrix[16] =
|
const UINT8 Processor::s_magic_matrix[16] =
|
||||||
{ /* Magic square matrix */
|
{ /* Magic square matrix */
|
||||||
0, 6, 1, 7,
|
0, 6, 1, 7,
|
||||||
4, 2, 5, 3,
|
4, 2, 5, 3,
|
||||||
@ -557,7 +563,7 @@ const UINT8 N64::RDP::Processor::s_magic_matrix[16] =
|
|||||||
7, 1, 6, 0
|
7, 1, 6, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
const N64::RDP::Processor::ZDecompressEntry N64::RDP::Processor::m_z_decompress_table[8] =
|
const Processor::ZDecompressEntry Processor::m_z_decompress_table[8] =
|
||||||
{
|
{
|
||||||
{ 6, 0x00000 },
|
{ 6, 0x00000 },
|
||||||
{ 5, 0x20000 },
|
{ 5, 0x20000 },
|
||||||
@ -571,7 +577,7 @@ const N64::RDP::Processor::ZDecompressEntry N64::RDP::Processor::m_z_decompress_
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void N64::RDP::Processor::BuildCompressedZTable()
|
void Processor::BuildCompressedZTable()
|
||||||
{
|
{
|
||||||
for(int j = 0; j < 0x40000; j++)
|
for(int j = 0; j < 0x40000; j++)
|
||||||
{
|
{
|
||||||
@ -589,7 +595,7 @@ void N64::RDP::Processor::BuildCompressedZTable()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::ZStore(UINT16* zb, UINT8* zhb, UINT32 z, UINT32 deltaz)
|
void Processor::ZStore(UINT16* zb, UINT8* zhb, UINT32 z, UINT32 deltaz)
|
||||||
{
|
{
|
||||||
UINT8 deltazmem = 15;
|
UINT8 deltazmem = 15;
|
||||||
z &= 0x3ffff;
|
z &= 0x3ffff;
|
||||||
@ -613,20 +619,20 @@ void N64::RDP::Processor::ZStore(UINT16* zb, UINT8* zhb, UINT32 z, UINT32 deltaz
|
|||||||
*zhb = (deltazmem & 3);
|
*zhb = (deltazmem & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 N64::RDP::Processor::DecompressZ(UINT16 *zb)
|
UINT32 Processor::DecompressZ(UINT16 *zb)
|
||||||
{
|
{
|
||||||
UINT32 exponent = (*zb >> 13) & 7;
|
UINT32 exponent = (*zb >> 13) & 7;
|
||||||
UINT32 mantissa = (*zb >> 2) & 0x7ff;
|
UINT32 mantissa = (*zb >> 2) & 0x7ff;
|
||||||
return ((mantissa << m_z_decompress_table[exponent].shift) + m_z_decompress_table[exponent].add);
|
return ((mantissa << m_z_decompress_table[exponent].shift) + m_z_decompress_table[exponent].add);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT16 N64::RDP::Processor::DecompressDZ(UINT16* zb, UINT8* zhb)
|
UINT16 Processor::DecompressDZ(UINT16* zb, UINT8* zhb)
|
||||||
{
|
{
|
||||||
UINT32 dz_compressed = (((*zb & 3) << 2)|(*zhb & 3));
|
UINT32 dz_compressed = (((*zb & 3) << 2)|(*zhb & 3));
|
||||||
return (1 << dz_compressed);
|
return (1 << dz_compressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 N64::RDP::Processor::NormalizeDZPix(INT32 sum)
|
INT32 Processor::NormalizeDZPix(INT32 sum)
|
||||||
{
|
{
|
||||||
if (sum & 0xc000)
|
if (sum & 0xc000)
|
||||||
{
|
{
|
||||||
@ -646,7 +652,7 @@ INT32 N64::RDP::Processor::NormalizeDZPix(INT32 sum)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool N64::RDP::Processor::ZCompare(void* fb, UINT8* hb, UINT16* zb, UINT8* zhb, UINT32 sz, UINT16 dzpix)
|
bool Processor::ZCompare(void* fb, UINT8* hb, UINT16* zb, UINT8* zhb, UINT32 sz, UINT16 dzpix)
|
||||||
{
|
{
|
||||||
int force_coplanar = 0;
|
int force_coplanar = 0;
|
||||||
UINT32 oz = DecompressZ(zb);
|
UINT32 oz = DecompressZ(zb);
|
||||||
@ -755,7 +761,7 @@ bool N64::RDP::Processor::ZCompare(void* fb, UINT8* hb, UINT16* zb, UINT8* zhb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 N64::RDP::Processor::GetLog2(UINT32 lod_clamp)
|
UINT32 Processor::GetLog2(UINT32 lod_clamp)
|
||||||
{
|
{
|
||||||
if (lod_clamp < 2)
|
if (lod_clamp < 2)
|
||||||
{
|
{
|
||||||
@ -777,364 +783,6 @@ UINT32 N64::RDP::Processor::GetLog2(UINT32 lod_clamp)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void fill_rectangle_32bit(running_machine *machine, N64::RDP::Rectangle *rect)
|
|
||||||
{
|
|
||||||
_n64_state *state = (_n64_state *)machine->driver_data;
|
|
||||||
|
|
||||||
UINT32 *fb = (UINT32*)&rdram[(state->m_rdp.GetMiscState()->m_fb_address / 4)];
|
|
||||||
int x1 = rect->m_xh;
|
|
||||||
int x2 = rect->m_xl;
|
|
||||||
int y1 = rect->m_yh;
|
|
||||||
int y2 = rect->m_yl;
|
|
||||||
int fill_cvg = 0;
|
|
||||||
|
|
||||||
// clip
|
|
||||||
if (x1 < state->m_rdp.GetScissor()->m_xh)
|
|
||||||
{
|
|
||||||
x1 = state->m_rdp.GetScissor()->m_xh;
|
|
||||||
}
|
|
||||||
if (y1 < state->m_rdp.GetScissor()->m_yh)
|
|
||||||
{
|
|
||||||
y1 = state->m_rdp.GetScissor()->m_yh;
|
|
||||||
}
|
|
||||||
if (x2 >= state->m_rdp.GetScissor()->m_xl)
|
|
||||||
{
|
|
||||||
x2 = state->m_rdp.GetScissor()->m_xl - 1;
|
|
||||||
}
|
|
||||||
if (y2 >= state->m_rdp.GetScissor()->m_yl)
|
|
||||||
{
|
|
||||||
y2 = state->m_rdp.GetScissor()->m_yl - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
state->m_rdp.GetShadeColor()->c = 0;
|
|
||||||
|
|
||||||
fill_cvg = ((state->m_rdp.GetFillColor32() >> 5) & 7) + 1;
|
|
||||||
|
|
||||||
if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_FILL)
|
|
||||||
{
|
|
||||||
for (int j = y1; j <= y2; j++)
|
|
||||||
{
|
|
||||||
int index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
|
|
||||||
for (int i = x1; i <= x2; i++)
|
|
||||||
{
|
|
||||||
fb[(index + i)^1] = state->m_rdp.GetFillColor32();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_1)
|
|
||||||
{
|
|
||||||
for (int j = y1; j <= y2; j++)
|
|
||||||
{
|
|
||||||
N64::RDP::Color c1;
|
|
||||||
int index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
for (int i = x1; i <= x2; i++)
|
|
||||||
{
|
|
||||||
state->m_rdp.GetMiscState()->m_curpixel_cvg = fill_cvg;
|
|
||||||
|
|
||||||
c1.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[1]);
|
|
||||||
c1.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[1]);
|
|
||||||
c1.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[1]);
|
|
||||||
c1.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[1]);
|
|
||||||
state->m_rdp.GetAlphaCvg(&c1.i.a);
|
|
||||||
|
|
||||||
state->m_rdp.GetBlender()->Blend(&fb[(index + i)], NULL, c1, *state->m_rdp.GetZero(), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_2)
|
|
||||||
{
|
|
||||||
for (int j = y1; j <= y2; j++)
|
|
||||||
{
|
|
||||||
N64::RDP::Color c1, c2;
|
|
||||||
int index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
for (int i = x1; i <= x2; i++)
|
|
||||||
{
|
|
||||||
state->m_rdp.GetMiscState()->m_curpixel_cvg = fill_cvg;
|
|
||||||
|
|
||||||
c1.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[0]);
|
|
||||||
c1.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[0]);
|
|
||||||
c1.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[0]);
|
|
||||||
c1.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[0]);
|
|
||||||
state->m_rdp.GetCombinedColor()->c = c1.c;
|
|
||||||
c2.c = state->m_rdp.GetTexel0Color()->c;
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexel1Color()->c;
|
|
||||||
state->m_rdp.GetTexel1Color()->c = c2.c;
|
|
||||||
c2.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[1]);
|
|
||||||
c2.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[1]);
|
|
||||||
c2.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[1]);
|
|
||||||
c2.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[1]);
|
|
||||||
state->m_rdp.GetAlphaCvg(&c2.i.a);
|
|
||||||
|
|
||||||
state->m_rdp.GetBlender()->Blend(&fb[(index + i)], NULL, c1, c2, 0);
|
|
||||||
//BLENDER2_32(&fb[(index + i)], c1, c2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fatalerror("fill_rectangle_32bit: cycle type copy");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void texture_rectangle_32bit(running_machine *machine, N64::RDP::TexRectangle *rect)
|
|
||||||
{ // TODO: Z-compare and Z-update
|
|
||||||
_n64_state *state = (_n64_state *)machine->driver_data;
|
|
||||||
|
|
||||||
UINT32 *fb = (UINT32*)&rdram[(state->m_rdp.GetMiscState()->m_fb_address / 4)];
|
|
||||||
|
|
||||||
UINT32 tilenum = rect->m_tilenum;
|
|
||||||
UINT32 tilenum2 = 0;
|
|
||||||
N64::RDP::Tile *tex_tile = &state->m_rdp.GetTiles()[rect->m_tilenum];
|
|
||||||
N64::RDP::Tile *tex_tile2 = NULL;
|
|
||||||
|
|
||||||
int x1 = rect->m_xh;
|
|
||||||
int x2 = rect->m_xl;
|
|
||||||
int y1 = rect->m_yh;
|
|
||||||
int y2 = rect->m_yl;
|
|
||||||
|
|
||||||
if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_FILL || state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_COPY)
|
|
||||||
{
|
|
||||||
rect->m_dsdx /= 4;
|
|
||||||
x2 += 1;
|
|
||||||
y2 += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clip
|
|
||||||
if (x1 < state->m_rdp.GetScissor()->m_xh)
|
|
||||||
{
|
|
||||||
x1 = state->m_rdp.GetScissor()->m_xh;
|
|
||||||
}
|
|
||||||
if (y1 < state->m_rdp.GetScissor()->m_yh)
|
|
||||||
{
|
|
||||||
y1 = state->m_rdp.GetScissor()->m_yh;
|
|
||||||
}
|
|
||||||
if (x2 >= state->m_rdp.GetScissor()->m_xl)
|
|
||||||
{
|
|
||||||
x2 = state->m_rdp.GetScissor()->m_xl - 1;
|
|
||||||
}
|
|
||||||
if (y2 >= state->m_rdp.GetScissor()->m_yl)
|
|
||||||
{
|
|
||||||
y2 = state->m_rdp.GetScissor()->m_yl - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
state->m_rdp.GetTexPipe()->CalculateClampDiffs(tex_tile->num);
|
|
||||||
|
|
||||||
if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_2)
|
|
||||||
{
|
|
||||||
if (!state->m_rdp.GetOtherModes()->tex_lod_en)
|
|
||||||
{
|
|
||||||
tilenum2 = (tilenum + 1) & 7;
|
|
||||||
tex_tile2 = &state->m_rdp.GetTiles()[tilenum2];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tilenum2 = (tilenum + 1) & 7;
|
|
||||||
tex_tile2 = &state->m_rdp.GetTiles()[tilenum2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
state->m_rdp.GetShadeColor()->c = 0; // Needed by Pilotwings 64
|
|
||||||
|
|
||||||
int t = (int)(rect->m_t) << 5;
|
|
||||||
|
|
||||||
if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_1)
|
|
||||||
{
|
|
||||||
for (int j = y1; j < y2; j++)
|
|
||||||
{
|
|
||||||
int fb_index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
|
|
||||||
int s = (int)(rect->m_s) << 5;
|
|
||||||
|
|
||||||
for (int i = x1; i < x2; i++)
|
|
||||||
{
|
|
||||||
N64::RDP::Color c1;
|
|
||||||
int ss = s >> 5;
|
|
||||||
int st = t >> 5;
|
|
||||||
|
|
||||||
state->m_rdp.GetMiscState()->m_curpixel_cvg = 8;
|
|
||||||
|
|
||||||
if (rect->m_flip)
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(st, ss, tex_tile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(ss, st, tex_tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
c1.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[1]);
|
|
||||||
c1.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[1]);
|
|
||||||
c1.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[1]);
|
|
||||||
c1.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[1]);
|
|
||||||
state->m_rdp.GetAlphaCvg(&c1.i.a);
|
|
||||||
|
|
||||||
state->m_rdp.GetBlender()->Blend(&fb[(fb_index + i)], NULL, c1, *state->m_rdp.GetZero(), 0);
|
|
||||||
|
|
||||||
s += rect->m_dsdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
t += rect->m_dtdy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_2)
|
|
||||||
{
|
|
||||||
for (int j = y1; j < y2; j++)
|
|
||||||
{
|
|
||||||
int fb_index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
|
|
||||||
int s = (int)(rect->m_s) << 5;
|
|
||||||
|
|
||||||
for (int i = x1; i < x2; i++)
|
|
||||||
{
|
|
||||||
N64::RDP::Color c1, c2;
|
|
||||||
int ss = s >> 5;
|
|
||||||
int st = t >> 5;
|
|
||||||
|
|
||||||
state->m_rdp.GetMiscState()->m_curpixel_cvg = 8;
|
|
||||||
|
|
||||||
if (rect->m_flip)
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(st, ss, tex_tile);
|
|
||||||
state->m_rdp.GetTexel1Color()->c = state->m_rdp.GetTexPipe()->Fetch(st, ss, tex_tile2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(ss, st, tex_tile);
|
|
||||||
state->m_rdp.GetTexel1Color()->c = state->m_rdp.GetTexPipe()->Fetch(ss, st, tex_tile2);
|
|
||||||
}
|
|
||||||
|
|
||||||
c1.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[0]);
|
|
||||||
c1.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[0]);
|
|
||||||
c1.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[0]);
|
|
||||||
c1.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[0],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[0]);
|
|
||||||
state->m_rdp.GetCombinedColor()->c = c1.c;
|
|
||||||
c2.c = state->m_rdp.GetTexel0Color()->c;
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexel1Color()->c;
|
|
||||||
state->m_rdp.GetTexel1Color()->c = c2.c;
|
|
||||||
c2.i.r = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_r[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_r[1]);
|
|
||||||
c2.i.g = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_g[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_g[1]);
|
|
||||||
c2.i.b = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_rgbsub_a_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbsub_b_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbmul_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_rgbadd_b[1]);
|
|
||||||
c2.i.a = LookUpCC(*state->m_rdp.GetColorInputs()->combiner_alphasub_a[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphasub_b[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphamul[1],
|
|
||||||
*state->m_rdp.GetColorInputs()->combiner_alphaadd[1]);
|
|
||||||
state->m_rdp.GetAlphaCvg(&c2.i.a);
|
|
||||||
|
|
||||||
state->m_rdp.GetBlender()->Blend(&fb[(fb_index + i)], NULL, c1, c2, 0);
|
|
||||||
|
|
||||||
s += rect->m_dsdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
t += rect->m_dtdy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (state->m_rdp.GetOtherModes()->cycle_type == CYCLE_TYPE_COPY)
|
|
||||||
{
|
|
||||||
for (int j = y1; j < y2; j++)
|
|
||||||
{
|
|
||||||
int fb_index = j * state->m_rdp.GetMiscState()->m_fb_width;
|
|
||||||
|
|
||||||
int s = (int)(rect->m_s) << 5;
|
|
||||||
|
|
||||||
for (int i = x1; i < x2; i++)
|
|
||||||
{
|
|
||||||
int ss = s >> 5;
|
|
||||||
int st = t >> 5;
|
|
||||||
if (rect->m_flip)
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(st, ss, tex_tile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
state->m_rdp.GetTexel0Color()->c = state->m_rdp.GetTexPipe()->Fetch(ss, st, tex_tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
fb[fb_index + i] = (state->m_rdp.GetTexel0Color()->i.r << 24) | (state->m_rdp.GetTexel0Color()->i.g << 16) | (state->m_rdp.GetTexel0Color()->i.b << 8)|1;
|
|
||||||
|
|
||||||
s += rect->m_dsdx;
|
|
||||||
}
|
|
||||||
|
|
||||||
t += rect->m_dtdy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fatalerror("texture_rectangle_32bit: unknown cycle type %d\n", state->m_rdp.GetOtherModes()->cycle_type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
UINT32 N64::RDP::Processor::ReadData(UINT32 address)
|
UINT32 N64::RDP::Processor::ReadData(UINT32 address)
|
||||||
{
|
{
|
||||||
if (m_status & 0x1) // XBUS_DMEM_DMA enabled
|
if (m_status & 0x1) // XBUS_DMEM_DMA enabled
|
||||||
@ -2133,27 +1781,13 @@ void N64::RDP::TexRectangle::InitFromBuffer(UINT32 *data)
|
|||||||
void N64::RDP::Processor::CmdTexRect(UINT32 w1, UINT32 w2)
|
void N64::RDP::Processor::CmdTexRect(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
N64::RDP::TexRectangle rect(m_machine, m_cmd_data + m_cmd_cur, 0);
|
N64::RDP::TexRectangle rect(m_machine, m_cmd_data + m_cmd_cur, 0);
|
||||||
|
rect.Draw();
|
||||||
switch (m_misc_state.m_fb_size)
|
|
||||||
{
|
|
||||||
case PIXEL_SIZE_16BIT:
|
|
||||||
rect.Draw();
|
|
||||||
break;
|
|
||||||
case PIXEL_SIZE_32BIT:
|
|
||||||
texture_rectangle_32bit(m_machine, &rect);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::CmdTexRectFlip(UINT32 w1, UINT32 w2)
|
void N64::RDP::Processor::CmdTexRectFlip(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
N64::RDP::TexRectangle rect(m_machine, m_cmd_data + m_cmd_cur, 1);
|
N64::RDP::TexRectangle rect(m_machine, m_cmd_data + m_cmd_cur, 1);
|
||||||
|
rect.Draw();
|
||||||
switch (m_misc_state.m_fb_size)
|
|
||||||
{
|
|
||||||
case PIXEL_SIZE_16BIT: rect.Draw(); break;
|
|
||||||
case PIXEL_SIZE_32BIT: texture_rectangle_32bit(m_machine, &rect); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::CmdSyncLoad(UINT32 w1, UINT32 w2)
|
void N64::RDP::Processor::CmdSyncLoad(UINT32 w1, UINT32 w2)
|
||||||
@ -2559,15 +2193,7 @@ void N64::RDP::Processor::CmdFillRect(UINT32 w1, UINT32 w2)
|
|||||||
{
|
{
|
||||||
N64::RDP::Rectangle rect(m_machine, m_cmd_data + m_cmd_cur);
|
N64::RDP::Rectangle rect(m_machine, m_cmd_data + m_cmd_cur);
|
||||||
|
|
||||||
switch (m_misc_state.m_fb_size)
|
rect.Draw();
|
||||||
{
|
|
||||||
case PIXEL_SIZE_16BIT:
|
|
||||||
rect.Draw();
|
|
||||||
break;
|
|
||||||
case PIXEL_SIZE_32BIT:
|
|
||||||
fill_rectangle_32bit(m_machine, &rect);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void N64::RDP::Processor::CmdSetFogColor(UINT32 w1, UINT32 w2)
|
void N64::RDP::Processor::CmdSetFogColor(UINT32 w1, UINT32 w2)
|
||||||
@ -2870,6 +2496,10 @@ void N64::RDP::Processor::ProcessList()
|
|||||||
m_start = m_current = m_end;
|
m_start = m_current = m_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace RDP
|
||||||
|
|
||||||
|
} // namespace N64
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
VIDEO_START(n64)
|
VIDEO_START(n64)
|
||||||
|
Loading…
Reference in New Issue
Block a user