Work on making blending and combining use color_t instead of UINT8 pointesr

This commit is contained in:
therealmogminer@gmail.com 2015-06-09 12:02:05 +02:00
parent 66fdd28b83
commit 9fe201b57c
4 changed files with 225 additions and 359 deletions

View File

@ -26,6 +26,7 @@ TODO:
#include "emu.h" #include "emu.h"
#include "video/n64.h" #include "video/n64.h"
#include <algorithm>
#define LOG_RDP_EXECUTION 0 #define LOG_RDP_EXECUTION 0
@ -462,7 +463,7 @@ void n64_rdp::set_subb_input_rgb(UINT8** input_r, UINT8** input_g, UINT8** input
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break; case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break; case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n"); case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n");
case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break; case 7: *input_r = &userdata->m_k4.i.r; *input_g = &userdata->m_k4.i.g; *input_b = &userdata->m_k4.i.b; break;
case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
{ {
*input_r = &m_zero.i.r; *input_g = &m_zero.i.g; *input_b = &m_zero.i.b; break; *input_r = &m_zero.i.r; *input_g = &m_zero.i.g; *input_b = &m_zero.i.b; break;
@ -481,15 +482,15 @@ void n64_rdp::set_mul_input_rgb(UINT8** input_r, UINT8** input_g, UINT8** input_
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break; case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break; case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
case 6: *input_r = &userdata->m_key_scale.i.r; *input_g = &userdata->m_key_scale.i.g; *input_b = &userdata->m_key_scale.i.b; break; case 6: *input_r = &userdata->m_key_scale.i.r; *input_g = &userdata->m_key_scale.i.g; *input_b = &userdata->m_key_scale.i.b; break;
case 7: *input_r = &userdata->m_combined_color.i.a; *input_g = &userdata->m_combined_color.i.a; *input_b = &userdata->m_combined_color.i.a; break; case 7: *input_r = &userdata->m_combined_alpha.i.r; *input_g = &userdata->m_combined_alpha.i.g; *input_b = &userdata->m_combined_alpha.i.b; break;
case 8: *input_r = &userdata->m_texel0_color.i.a; *input_g = &userdata->m_texel0_color.i.a; *input_b = &userdata->m_texel0_color.i.a; break; case 8: *input_r = &userdata->m_texel0_alpha.i.r; *input_g = &userdata->m_texel0_alpha.i.g; *input_b = &userdata->m_texel0_alpha.i.b; break;
case 9: *input_r = &userdata->m_texel1_color.i.a; *input_g = &userdata->m_texel1_color.i.a; *input_b = &userdata->m_texel1_color.i.a; break; case 9: *input_r = &userdata->m_texel1_alpha.i.r; *input_g = &userdata->m_texel1_alpha.i.g; *input_b = &userdata->m_texel1_alpha.i.b; break;
case 10: *input_r = &userdata->m_prim_color.i.a; *input_g = &userdata->m_prim_color.i.a; *input_b = &userdata->m_prim_color.i.a; break; case 10: *input_r = &userdata->m_prim_alpha.i.r; *input_g = &userdata->m_prim_alpha.i.g; *input_b = &userdata->m_prim_alpha.i.b; break;
case 11: *input_r = &userdata->m_shade_color.i.a; *input_g = &userdata->m_shade_color.i.a; *input_b = &userdata->m_shade_color.i.a; break; case 11: *input_r = &userdata->m_shade_alpha.i.r; *input_g = &userdata->m_shade_alpha.i.g; *input_b = &userdata->m_shade_alpha.i.b; break;
case 12: *input_r = &userdata->m_env_color.i.a; *input_g = &userdata->m_env_color.i.a; *input_b = &userdata->m_env_color.i.a; break; case 12: *input_r = &userdata->m_env_alpha.i.r; *input_g = &userdata->m_env_alpha.i.g; *input_b = &userdata->m_env_alpha.i.b; break;
case 13: *input_r = &userdata->m_lod_fraction; *input_g = &userdata->m_lod_fraction; *input_b = &userdata->m_lod_fraction; break; case 13: *input_r = &userdata->m_lod_fraction.i.r; *input_g = &userdata->m_lod_fraction.i.g; *input_b = &userdata->m_lod_fraction.i.b; break;
case 14: *input_r = &userdata->m_prim_lod_fraction; *input_g = &userdata->m_prim_lod_fraction; *input_b = &userdata->m_prim_lod_fraction; break; case 14: *input_r = &userdata->m_prim_lod_fraction.i.r; *input_g = &userdata->m_prim_lod_fraction.i.g; *input_b = &userdata->m_prim_lod_fraction.i.b; break;
case 15: *input_r = (UINT8*)&m_k5; *input_g = (UINT8*)&m_k5; *input_b = (UINT8*)&m_k5; break; case 15: *input_r = &userdata->m_k5.i.r; *input_g = &userdata->m_k5.i.g; *input_b = &userdata->m_k5.i.b; break;
case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
{ {
@ -532,62 +533,37 @@ void n64_rdp::set_mul_input_alpha(UINT8** input, INT32 code, rdp_span_aux* userd
{ {
switch (code & 0x7) switch (code & 0x7)
{ {
case 0: *input = &userdata->m_lod_fraction; break; case 0: *input = &userdata->m_lod_fraction.i.a; break;
case 1: *input = &userdata->m_texel0_color.i.a; break; case 1: *input = &userdata->m_texel0_color.i.a; break;
case 2: *input = &userdata->m_texel1_color.i.a; break; case 2: *input = &userdata->m_texel1_color.i.a; break;
case 3: *input = &userdata->m_prim_color.i.a; break; case 3: *input = &userdata->m_prim_color.i.a; break;
case 4: *input = &userdata->m_shade_color.i.a; break; case 4: *input = &userdata->m_shade_color.i.a; break;
case 5: *input = &userdata->m_env_color.i.a; break; case 5: *input = &userdata->m_env_color.i.a; break;
case 6: *input = &userdata->m_prim_lod_fraction; break; case 6: *input = &userdata->m_prim_lod_fraction.i.a; break;
case 7: *input = &m_zero.i.a; break; case 7: *input = &m_zero.i.a; break;
} }
} }
void n64_rdp::set_blender_input(INT32 cycle, INT32 which, UINT8** input_r, UINT8** input_g, UINT8** input_b, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata) void n64_rdp::set_blender_input(INT32 cycle, INT32 which, color_t** input_rgb, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata)
{ {
switch (a & 0x3) switch (a & 0x3)
{ {
case 0: case 0:
{ *input_rgb = cycle == 0 ? &userdata->m_pixel_color : &userdata->m_blended_pixel_color;
if (cycle == 0)
{
*input_r = &userdata->m_pixel_color.i.r;
*input_g = &userdata->m_pixel_color.i.g;
*input_b = &userdata->m_pixel_color.i.b;
}
else
{
*input_r = &userdata->m_blended_pixel_color.i.r;
*input_g = &userdata->m_blended_pixel_color.i.g;
*input_b = &userdata->m_blended_pixel_color.i.b;
}
break; break;
}
case 1: case 1:
{ *input_rgb = &userdata->m_memory_color;
*input_r = &userdata->m_memory_color.i.r;
*input_g = &userdata->m_memory_color.i.g;
*input_b = &userdata->m_memory_color.i.b;
break; break;
}
case 2: case 2:
{ *input_rgb = &userdata->m_blend_color;
*input_r = &userdata->m_blend_color.i.r;
*input_g = &userdata->m_blend_color.i.g;
*input_b = &userdata->m_blend_color.i.b;
break; break;
}
case 3: case 3:
{ *input_rgb = &userdata->m_fog_color;
*input_r = &userdata->m_fog_color.i.r;
*input_g = &userdata->m_fog_color.i.g;
*input_b = &userdata->m_fog_color.i.b;
break; break;
} }
}
if (which == 0) if (which == 0)
{ {
@ -2067,150 +2043,11 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
rdp_poly_state* object = NULL; rdp_poly_state* object = NULL;
bool valid = false; bool valid = false;
if(flip) INT32* minx = flip ? &minxhx : &minxmx;
{ INT32* maxx = flip ? &maxxmx : &maxxhx;
for (INT32 k = ycur; k <= ylfar; k++) INT32* startx = flip ? maxx : minx;
{ INT32* endx = flip ? minx : maxx;
if (k == ym)
{
xleft = xl & ~1;
xleft_inc = (dxldy >> 2) & ~1;
}
const INT32 xstart = xleft >> 16; // 319
const INT32 xend = xright >> 16; // 0
const INT32 j = k >> 2;
const INT32 spanidx = (k - ycur) >> 2;
const INT32 spix = k & 3;
const bool valid_y = !(k < yh || k >= yl);
if (spanidx >= 0 && spanidx < 2048)
{
majorxint[spix] = xend; // 0
minorxint[spix] = xstart; // 319
majorx[spix] = xright; // 0x00000000
minorx[spix] = xleft; // 0x013f0000
if (spix == 0)
{
maxxmx = 0;
minxhx = 0xfff;
}
if (valid_y)
{
maxxmx = (xstart > maxxmx) ? xstart : maxxmx;
minxhx = (xend < minxhx) ? xend : minxhx;
}
if (spix == 0)
{
if(new_object)
{
object = &object_data_alloc();
memcpy(object->m_tmem, m_tmem, 0x1000);
new_object = false;
}
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
m_aux_buf_ptr += sizeof(rdp_span_aux);
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
{
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
}
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
valid = true;
userdata->m_tmem = object->m_tmem;
userdata->m_blend_color = m_blend_color;
userdata->m_prim_color = m_prim_color;
userdata->m_env_color = m_env_color;
userdata->m_fog_color = m_fog_color;
userdata->m_key_scale = m_key_scale;
userdata->m_lod_fraction = m_lod_fraction;
userdata->m_prim_lod_fraction = m_prim_lod_fraction;
// Setup blender data for this scanline
set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_r[0],
&userdata->m_color_inputs.blender1a_g[0],
&userdata->m_color_inputs.blender1a_b[0],
&userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata);
set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_r[0],
&userdata->m_color_inputs.blender2a_g[0],
&userdata->m_color_inputs.blender2a_b[0],
&userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_r[1],
&userdata->m_color_inputs.blender1a_g[1],
&userdata->m_color_inputs.blender1a_b[1],
&userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_r[1],
&userdata->m_color_inputs.blender2a_g[1],
&userdata->m_color_inputs.blender2a_b[1],
&userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
// Setup color combiner data for this scanline
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata);
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[0], &userdata->m_color_inputs.combiner_rgbsub_b_g[0], &userdata->m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0, userdata);
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[0], &userdata->m_color_inputs.combiner_rgbmul_g[0], &userdata->m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0, userdata);
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[0], &userdata->m_color_inputs.combiner_rgbadd_g[0], &userdata->m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0, userdata);
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[0], m_combine.mul_a0, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[0], m_combine.add_a0, userdata);
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[1], &userdata->m_color_inputs.combiner_rgbsub_a_g[1], &userdata->m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1, userdata);
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[1], &userdata->m_color_inputs.combiner_rgbsub_b_g[1], &userdata->m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1, userdata);
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[1], &userdata->m_color_inputs.combiner_rgbmul_g[1], &userdata->m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1, userdata);
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[1], &userdata->m_color_inputs.combiner_rgbadd_g[1], &userdata->m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1, userdata);
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[1], m_combine.mul_a1, userdata);
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[1], m_combine.add_a1, userdata);
}
if (spix == 3)
{
spans[spanidx].startx = maxxmx;
spans[spanidx].stopx = minxhx;
compute_cvg_flip(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
}
if (spix == ldflag)
{
((rdp_span_aux*)spans[spanidx].userdata)->m_unscissored_rx = xend;
xfrac = ((xright >> 8) & 0xff);
spans[spanidx].param[SPAN_R].start = ((r >> 9) << 9) + drdiff - (xfrac * drdxh);
spans[spanidx].param[SPAN_G].start = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh);
spans[spanidx].param[SPAN_B].start = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh);
spans[spanidx].param[SPAN_A].start = ((a >> 9) << 9) + dadiff - (xfrac * dadxh);
spans[spanidx].param[SPAN_S].start = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f;
spans[spanidx].param[SPAN_T].start = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f;
spans[spanidx].param[SPAN_W].start = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f;
spans[spanidx].param[SPAN_Z].start = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh);
}
}
if (spix == 3)
{
r += drde;
g += dgde;
b += dbde;
a += dade;
s += dsde;
t += dtde;
w += dwde;
z += dzde;
}
xleft += xleft_inc;
xright += xright_inc;
}
}
else
{
for (INT32 k = ycur; k <= ylfar; k++) for (INT32 k = ycur; k <= ylfar; k++)
{ {
if (k == ym) if (k == ym)
@ -2222,11 +2059,11 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
const INT32 xstart = xleft >> 16; const INT32 xstart = xleft >> 16;
const INT32 xend = xright >> 16; const INT32 xend = xright >> 16;
const INT32 j = k >> 2; const INT32 j = k >> 2;
const INT32 spanidx = j - (ycur >> 2); const INT32 spanidx = (k - ycur) >> 2;
const INT32 spix = k & 3; const INT32 spix = k & 3;
bool valid_y = !(k < yh || k >= yl); bool valid_y = !(k < yh || k >= yl);
if (k >= 0 && k < 0x1000) if (spanidx >= 0 && spanidx < 2048)
{ {
majorxint[spix] = xend; majorxint[spix] = xend;
minorxint[spix] = xstart; minorxint[spix] = xstart;
@ -2235,14 +2072,22 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
if (spix == 0) if (spix == 0)
{ {
maxxhx = 0; *maxx = 0;
minxmx = 0xfff; *minx = 0xfff;
} }
if (valid_y) if (valid_y)
{ {
minxmx = (xstart < minxmx) ? xstart : minxmx; if (flip)
maxxhx = (xend > maxxhx) ? xend : maxxhx; {
*maxx = std::max(xstart, *maxx);
*minx = std::min(xend, *minx);
}
else
{
*minx = std::min(xstart, *minx);
*maxx = std::max(xend, *maxx);
}
} }
if (spix == 0) if (spix == 0)
@ -2270,27 +2115,19 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
userdata->m_prim_color = m_prim_color; userdata->m_prim_color = m_prim_color;
userdata->m_env_color = m_env_color; userdata->m_env_color = m_env_color;
userdata->m_fog_color = m_fog_color; userdata->m_fog_color = m_fog_color;
userdata->m_blend_alpha = m_blend_alpha;
userdata->m_prim_alpha = m_prim_alpha;
userdata->m_env_alpha = m_env_alpha;
userdata->m_fog_alpha = m_fog_alpha;
userdata->m_key_scale = m_key_scale; userdata->m_key_scale = m_key_scale;
userdata->m_lod_fraction = m_lod_fraction; userdata->m_lod_fraction = m_lod_fraction;
userdata->m_prim_lod_fraction = m_prim_lod_fraction; userdata->m_prim_lod_fraction = m_prim_lod_fraction;
// Setup blender data for this scanline // Setup blender data for this scanline
set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_r[0], set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_rgb[0], &userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata);
&userdata->m_color_inputs.blender1a_g[0], set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_rgb[0], &userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
&userdata->m_color_inputs.blender1a_b[0], set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_rgb[1], &userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
&userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata); set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_rgb[1], &userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_r[0],
&userdata->m_color_inputs.blender2a_g[0],
&userdata->m_color_inputs.blender2a_b[0],
&userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_r[1],
&userdata->m_color_inputs.blender1a_g[1],
&userdata->m_color_inputs.blender1a_b[1],
&userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_r[1],
&userdata->m_color_inputs.blender2a_g[1],
&userdata->m_color_inputs.blender2a_b[1],
&userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
// Setup color combiner data for this scanline // Setup color combiner data for this scanline
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata); set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata);
@ -2314,9 +2151,9 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
if (spix == 3) if (spix == 3)
{ {
spans[spanidx].startx = minxmx; spans[spanidx].startx = *startx;
spans[spanidx].stopx = maxxhx; spans[spanidx].stopx = *endx;
compute_cvg_noflip(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2); ((this)->*(m_compute_cvg[flip]))(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
} }
if (spix == ldflag) if (spix == ldflag)
@ -2348,7 +2185,6 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
xleft += xleft_inc; xleft += xleft_inc;
xright += xright_inc; xright += xright_inc;
} }
}
if(!new_object && valid) if(!new_object && valid)
{ {
@ -2577,7 +2413,10 @@ void n64_rdp::cmd_set_convert(UINT32 w1, UINT32 w2)
k3 = ((w2 >> 26) & 1) ? (-(0x100 - k3)) : k3; k3 = ((w2 >> 26) & 1) ? (-(0x100 - k3)) : k3;
k4 = ((w2 >> 17) & 1) ? (-(0x100 - k4)) : k4; k4 = ((w2 >> 17) & 1) ? (-(0x100 - k4)) : k4;
k5 = ((w2 >> 8) & 1) ? (-(0x100 - k5)) : k5; k5 = ((w2 >> 8) & 1) ? (-(0x100 - k5)) : k5;
set_yuv_factors(k0, k1, k2, k3, k4, k5);
UINT32 repl_k4 = (k4 & 0xff) * 0x01010101;
UINT32 repl_k5 = (k5 & 0xff) * 0x01010101;
set_yuv_factors(k0, k1, k2, k3, repl_k4, repl_k5);
} }
void n64_rdp::cmd_set_scissor(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_scissor(UINT32 w1, UINT32 w2)
@ -3061,23 +2900,27 @@ void n64_rdp::cmd_fill_rect(UINT32 w1, UINT32 w2)
void n64_rdp::cmd_set_fog_color(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_fog_color(UINT32 w1, UINT32 w2)
{ {
m_fog_color.c = w2; m_fog_color.c = w2;
m_fog_alpha.c = m_fog_color.i.a * 0x01010101;
} }
void n64_rdp::cmd_set_blend_color(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_blend_color(UINT32 w1, UINT32 w2)
{ {
m_blend_color.c = w2; m_blend_color.c = w2;
m_blend_alpha.c = m_blend_color.i.a * 0x01010101;
} }
void n64_rdp::cmd_set_prim_color(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_prim_color(UINT32 w1, UINT32 w2)
{ {
m_misc_state.m_min_level = (w1 >> 8) & 0x1f; m_misc_state.m_min_level = (w1 >> 8) & 0x1f;
m_prim_lod_fraction = w1 & 0xff; m_prim_lod_fraction.c = (w1 & 0xff) * 0x01010101;
m_prim_color.c = w2; m_prim_color.c = w2;
m_prim_alpha.c = m_prim_color.i.a * 0x01010101;
} }
void n64_rdp::cmd_set_env_color(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_env_color(UINT32 w1, UINT32 w2)
{ {
m_env_color.c = w2; m_env_color.c = w2;
m_env_alpha.c = m_env_color.i.a * 0x01010101;
} }
void n64_rdp::cmd_set_combine(UINT32 w1, UINT32 w2) void n64_rdp::cmd_set_combine(UINT32 w1, UINT32 w2)
@ -3286,7 +3129,7 @@ n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 320
//memset(m_hidden_bits, 3, 8388608); //memset(m_hidden_bits, 3, 8388608);
m_prim_lod_fraction = 0; m_prim_lod_fraction.c = 0;
for (INT32 i = 0; i < 256; i++) for (INT32 i = 0; i < 256; i++)
{ {
@ -3337,6 +3180,9 @@ n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 320
{ {
m_dzpix_normalize[i] = (UINT16)normalize_dzpix(i & 0xffff); m_dzpix_normalize[i] = (UINT16)normalize_dzpix(i & 0xffff);
} }
m_compute_cvg[0] = &n64_rdp::compute_cvg_noflip;
m_compute_cvg[1] = &n64_rdp::compute_cvg_flip;
} }
void n64_state::video_start() void n64_state::video_start()

View File

@ -327,13 +327,9 @@ struct color_inputs_t
UINT8* combiner_alphaadd[2]; UINT8* combiner_alphaadd[2];
// blender input // blender input
UINT8* blender1a_r[2]; color_t* blender1a_rgb[2];
UINT8* blender1a_g[2];
UINT8* blender1a_b[2];
UINT8* blender1b_a[2]; UINT8* blender1b_a[2];
UINT8* blender2a_r[2]; color_t* blender2a_rgb[2];
UINT8* blender2a_g[2];
UINT8* blender2a_b[2];
UINT8* blender2b_a[2]; UINT8* blender2b_a[2];
}; };
@ -346,19 +342,31 @@ struct rdp_span_aux
color_t m_pixel_color; color_t m_pixel_color;
color_t m_inv_pixel_color; color_t m_inv_pixel_color;
color_t m_blended_pixel_color; color_t m_blended_pixel_color;
color_t m_combined_color; color_t m_combined_color;
color_t m_combined_alpha;
color_t m_texel0_color; color_t m_texel0_color;
color_t m_texel0_alpha;
color_t m_texel1_color; color_t m_texel1_color;
color_t m_texel1_alpha;
color_t m_next_texel_color; color_t m_next_texel_color;
color_t m_next_texel_alpha;
color_t m_blend_color; /* constant blend color */ color_t m_blend_color; /* constant blend color */
color_t m_blend_alpha; /* constant blend alpha */
color_t m_prim_color; /* flat primitive color */ color_t m_prim_color; /* flat primitive color */
color_t m_prim_alpha; /* flat primitive alpha */
color_t m_env_color; /* generic color constant ('environment') */ color_t m_env_color; /* generic color constant ('environment') */
color_t m_env_alpha; /* generic color constant ('environment') */
color_t m_fog_color; /* generic color constant ('fog') */ color_t m_fog_color; /* generic color constant ('fog') */
color_t m_fog_alpha; /* generic color constant ('fog') */
color_t m_shade_color; /* gouraud-shaded color */ color_t m_shade_color; /* gouraud-shaded color */
color_t m_shade_alpha; /* gouraud-shaded color */
color_t m_key_scale; /* color-keying constant */ color_t m_key_scale; /* color-keying constant */
color_t m_noise_color; /* noise */ color_t m_noise_color; /* noise */
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */ color_t m_lod_fraction; /* Z-based LOD fraction for this poly */
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */ color_t m_prim_lod_fraction; /* fixed LOD fraction for this poly */
color_t m_k4;
color_t m_k5;
color_inputs_t m_color_inputs; color_inputs_t m_color_inputs;
UINT32 m_current_pix_cvg; UINT32 m_current_pix_cvg;
UINT32 m_current_mem_cvg; UINT32 m_current_mem_cvg;
@ -478,16 +486,14 @@ public:
UINT8 get_random() { return m_misc_state.m_random_seed += 0x13; } UINT8 get_random() { return m_misc_state.m_random_seed += 0x13; }
// YUV Factors // YUV Factors
void set_yuv_factors(INT32 k0, INT32 k1, INT32 k2, INT32 k3, INT32 k4, INT32 k5) { m_k0 = k0; m_k1 = k1; m_k2 = k2; m_k3 = k3; m_k4 = k4; m_k5 = k5; } void set_yuv_factors(INT32 k0, INT32 k1, INT32 k2, INT32 k3, INT32 k4, INT32 k5) { m_k0 = k0; m_k1 = k1; m_k2 = k2; m_k3 = k3; m_k4.c = k4; m_k5.c = k5; }
INT32 get_k0() const { return m_k0; } INT32 get_k0() const { return m_k0; }
INT32 get_k1() const { return m_k1; } INT32 get_k1() const { return m_k1; }
INT32 get_k2() const { return m_k2; } INT32 get_k2() const { return m_k2; }
INT32 get_k3() const { return m_k3; } INT32 get_k3() const { return m_k3; }
INT32* get_k4() { return &m_k4; }
INT32* get_k5() { return &m_k5; }
// Blender-related (move into RDP::Blender) // Blender-related (move into RDP::Blender)
void set_blender_input(INT32 cycle, INT32 which, UINT8** input_r, UINT8** input_g, UINT8** input_b, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata); void set_blender_input(INT32 cycle, INT32 which, color_t** input_rgb, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata);
// Span rasterization // Span rasterization
void span_draw_1cycle(INT32 scanline, const extent_t &extent, const rdp_poly_state &object, INT32 threadid); void span_draw_1cycle(INT32 scanline, const extent_t &extent, const rdp_poly_state &object, INT32 threadid);
@ -565,12 +571,16 @@ public:
// Color constants // Color constants
color_t m_blend_color; /* constant blend color */ color_t m_blend_color; /* constant blend color */
color_t m_blend_alpha; /* constant blend alpha */
color_t m_prim_color; /* flat primitive color */ color_t m_prim_color; /* flat primitive color */
color_t m_prim_alpha; /* flat primitive alpha */
color_t m_env_color; /* generic color constant ('environment') */ color_t m_env_color; /* generic color constant ('environment') */
color_t m_env_alpha; /* generic alpha constant ('environment') */
color_t m_fog_color; /* generic color constant ('fog') */ color_t m_fog_color; /* generic color constant ('fog') */
color_t m_fog_alpha; /* generic alpha constant ('fog') */
color_t m_key_scale; /* color-keying constant */ color_t m_key_scale; /* color-keying constant */
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */ color_t m_lod_fraction; /* Z-based LOD fraction for this poly */
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */ color_t m_prim_lod_fraction; /* fixed LOD fraction for this poly */
color_t m_one; color_t m_one;
color_t m_zero; color_t m_zero;
@ -595,8 +605,6 @@ public:
rectangle m_visarea; rectangle m_visarea;
void draw_triangle(bool shade, bool texture, bool zbuffer, bool rect); void draw_triangle(bool shade, bool texture, bool zbuffer, bool rect);
void compute_cvg_noflip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
void compute_cvg_flip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
void* m_aux_buf; void* m_aux_buf;
UINT32 m_aux_buf_ptr; UINT32 m_aux_buf_ptr;
@ -607,6 +615,9 @@ public:
n64_tile_t m_tiles[8]; n64_tile_t m_tiles[8];
private: private:
void compute_cvg_noflip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
void compute_cvg_flip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
void write_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, rdp_span_aux* userdata, const rdp_poly_state &object); void write_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, rdp_span_aux* userdata, const rdp_poly_state &object);
void read_pixel(UINT32 curpixel, rdp_span_aux* userdata, const rdp_poly_state &object); void read_pixel(UINT32 curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
void copy_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, INT32 m_current_pix_cvg, const rdp_poly_state &object); void copy_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, INT32 m_current_pix_cvg, const rdp_poly_state &object);
@ -618,6 +629,9 @@ private:
void video_update16(n64_periphs* n64, bitmap_rgb32 &bitmap); void video_update16(n64_periphs* n64, bitmap_rgb32 &bitmap);
void video_update32(n64_periphs* n64, bitmap_rgb32 &bitmap); void video_update32(n64_periphs* n64, bitmap_rgb32 &bitmap);
typedef void (n64_rdp::*compute_cvg_t) (extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
compute_cvg_t m_compute_cvg[2];
running_machine* m_machine; running_machine* m_machine;
combine_modes_t m_combine; combine_modes_t m_combine;
@ -648,8 +662,8 @@ private:
INT32 m_k1; INT32 m_k1;
INT32 m_k2; INT32 m_k2;
INT32 m_k3; INT32 m_k3;
INT32 m_k4; color_t m_k4;
INT32 m_k5; color_t m_k5;
// Texture perspective division // Texture perspective division
INT32 m_norm_point_rom[64]; INT32 m_norm_point_rom[64];

View File

@ -106,9 +106,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_nodither(INT32* fr, INT32* fg, INT32*
{ {
return false; return false;
} }
*fr = *userdata->m_color_inputs.blender1a_r[0]; *fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
*fg = *userdata->m_color_inputs.blender1a_g[0]; *fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
*fb = *userdata->m_color_inputs.blender1a_b[0]; *fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
return true; return true;
} }
@ -121,9 +121,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_dither(INT32* fr, INT32* fg, INT32* fb
{ {
return false; return false;
} }
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith]; *fr = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.r & 0xff) << 3) | dith];
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith]; *fg = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.g & 0xff) << 3) | dith];
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[0] & 0xff) << 3) | dith]; *fb = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.b & 0xff) << 3) | dith];
return true; return true;
} }
@ -136,9 +136,9 @@ bool n64_blender_t::cycle1_noblend_acvg_nodither(INT32* fr, INT32* fg, INT32* fb
{ {
return false; return false;
} }
*fr = *userdata->m_color_inputs.blender1a_r[0]; *fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
*fg = *userdata->m_color_inputs.blender1a_g[0]; *fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
*fb = *userdata->m_color_inputs.blender1a_b[0]; *fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
return true; return true;
} }
@ -151,9 +151,9 @@ bool n64_blender_t::cycle1_noblend_acvg_dither(INT32* fr, INT32* fg, INT32* fb,
{ {
return false; return false;
} }
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith]; *fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.r << 3) | dith];
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith]; *fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.g << 3) | dith];
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[0] & 0xff) << 3) | dith]; *fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.b << 3) | dith];
return true; return true;
} }
@ -259,9 +259,9 @@ bool n64_blender_t::cycle2_noblend_noacvg_nodither(INT32* fr, INT32* fg, INT32*
userdata->m_blended_pixel_color.i.g = g; userdata->m_blended_pixel_color.i.g = g;
userdata->m_blended_pixel_color.i.b = b; userdata->m_blended_pixel_color.i.b = b;
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a; userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
*fr = *userdata->m_color_inputs.blender1a_r[1]; *fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
*fg = *userdata->m_color_inputs.blender1a_g[1]; *fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
*fb = *userdata->m_color_inputs.blender1a_b[1]; *fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
return true; return true;
} }
@ -285,9 +285,9 @@ bool n64_blender_t::cycle2_noblend_noacvg_dither(INT32* fr, INT32* fg, INT32* fb
userdata->m_blended_pixel_color.i.g = g; userdata->m_blended_pixel_color.i.g = g;
userdata->m_blended_pixel_color.i.b = b; userdata->m_blended_pixel_color.i.b = b;
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a; userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[1] & 0xff) << 3) | dith]; *fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.r << 3) | dith];
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith]; *fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.g << 3) | dith];
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[1] & 0xff) << 3) | dith]; *fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
return true; return true;
} }
@ -310,9 +310,9 @@ bool n64_blender_t::cycle2_noblend_acvg_nodither(INT32* fr, INT32* fg, INT32* fb
userdata->m_blended_pixel_color.i.g = g; userdata->m_blended_pixel_color.i.g = g;
userdata->m_blended_pixel_color.i.b = b; userdata->m_blended_pixel_color.i.b = b;
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a; userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
*fr = *userdata->m_color_inputs.blender1a_r[1]; *fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
*fg = *userdata->m_color_inputs.blender1a_g[1]; *fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
*fb = *userdata->m_color_inputs.blender1a_b[1]; *fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
return true; return true;
} }
@ -335,9 +335,9 @@ bool n64_blender_t::cycle2_noblend_acvg_dither(INT32* fr, INT32* fg, INT32* fb,
userdata->m_blended_pixel_color.i.g = g; userdata->m_blended_pixel_color.i.g = g;
userdata->m_blended_pixel_color.i.b = b; userdata->m_blended_pixel_color.i.b = b;
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a; userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[1] & 0xff) << 3) | dith]; *fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.r << 3) | dith];
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith]; *fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.g << 3) | dith];
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[1] & 0xff) << 3) | dith]; *fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
return true; return true;
} }
@ -460,9 +460,9 @@ void n64_blender_t::blend_with_partial_reject(INT32* r, INT32* g, INT32* b, INT3
{ {
if (partialreject && userdata->m_pixel_color.i.a >= 0xff) if (partialreject && userdata->m_pixel_color.i.a >= 0xff)
{ {
*r = *userdata->m_color_inputs.blender1a_r[cycle]; *r = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.r;
*g = *userdata->m_color_inputs.blender1a_g[cycle]; *g = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.g;
*b = *userdata->m_color_inputs.blender1a_b[cycle]; *b = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.b;
} }
else else
{ {
@ -480,13 +480,13 @@ void n64_blender_t::blend_pipe(const int cycle, const int special, int* r_out, i
const INT32 blend2a = (*userdata->m_color_inputs.blender2b_a[cycle] >> shift_b) & mask; const INT32 blend2a = (*userdata->m_color_inputs.blender2b_a[cycle] >> shift_b) & mask;
const INT32 special_shift = special << 1; const INT32 special_shift = special << 1;
INT32 r = (((int)(*userdata->m_color_inputs.blender1a_r[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_r[cycle]) * (int)(blend2a))); INT32 r = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.r * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.r * (int)(blend2a)));
INT32 g = (((int)(*userdata->m_color_inputs.blender1a_g[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_g[cycle]) * (int)(blend2a))); INT32 g = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.g * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.g * (int)(blend2a)));
INT32 b = (((int)(*userdata->m_color_inputs.blender1a_b[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_b[cycle]) * (int)(blend2a))); INT32 b = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.b * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.b * (int)(blend2a)));
r += ((int)*userdata->m_color_inputs.blender2a_r[cycle]) << special_shift; r += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.r << special_shift;
g += ((int)*userdata->m_color_inputs.blender2a_g[cycle]) << special_shift; g += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.g << special_shift;
b += ((int)*userdata->m_color_inputs.blender2a_b[cycle]) << special_shift; b += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.b << special_shift;
r >>= object.m_other_modes.blend_shift; r >>= object.m_other_modes.blend_shift;
g >>= object.m_other_modes.blend_shift; g >>= object.m_other_modes.blend_shift;

View File

@ -541,24 +541,27 @@ void n64_texture_pipe_t::lod_1cycle(INT32* sss, INT32* sst, const INT32 s, const
const bool magnify = (lod < 32); const bool magnify = (lod < 32);
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level)); const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
userdata->m_lod_fraction = ((lod << 3) >> l_tile) & 0xff; UINT8 lod_fraction = ((lod << 3) >> l_tile) & 0xff;
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en) if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
{ {
if (distant) if (distant)
{ {
userdata->m_lod_fraction = 0xff; lod_fraction = 0xff;
} }
else if (magnify) else if (magnify)
{ {
userdata->m_lod_fraction = 0; lod_fraction = 0;
} }
} }
userdata->m_lod_fraction.i.r = userdata->m_lod_fraction.i.g = userdata->m_lod_fraction.i.b = userdata->m_lod_fraction.i.a = lod_fraction;
/* FIXME: ???
if(object.m_other_modes.sharpen_tex_en && magnify) if(object.m_other_modes.sharpen_tex_en && magnify)
{ {
userdata->m_lod_fraction |= 0x100; userdata->m_lod_fraction |= 0x100;
} }
*/
} }
void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const INT32 t, const INT32 w, const INT32 dsinc, const INT32 dtinc, const INT32 dwinc, const INT32 prim_tile, INT32* t1, INT32* t2, rdp_span_aux* userdata, const rdp_poly_state& object) void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const INT32 t, const INT32 w, const INT32 dsinc, const INT32 dtinc, const INT32 dwinc, const INT32 prim_tile, INT32* t1, INT32* t2, rdp_span_aux* userdata, const rdp_poly_state& object)
@ -611,24 +614,27 @@ void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const
const bool magnify = (lod < 32); const bool magnify = (lod < 32);
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level)); const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
userdata->m_lod_fraction = ((lod << 3) >> l_tile) & 0xff; UINT8 lod_fraction = ((lod << 3) >> l_tile) & 0xff;
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en) if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
{ {
if (distant) if (distant)
{ {
userdata->m_lod_fraction = 0xff; lod_fraction = 0xff;
} }
else if (magnify) else if (magnify)
{ {
userdata->m_lod_fraction = 0; lod_fraction = 0;
} }
} }
userdata->m_lod_fraction.i.r = userdata->m_lod_fraction.i.g = userdata->m_lod_fraction.i.b = userdata->m_lod_fraction.i.a = lod_fraction;
/* FIXME: ???
if(object.m_other_modes.sharpen_tex_en && magnify) if(object.m_other_modes.sharpen_tex_en && magnify)
{ {
userdata->m_lod_fraction |= 0x100; userdata->m_lod_fraction |= 0x100;
} }*/
if (object.m_other_modes.tex_lod_en) if (object.m_other_modes.tex_lod_en)
{ {