mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
Work on making blending and combining use color_t instead of UINT8 pointesr
This commit is contained in:
parent
66fdd28b83
commit
9fe201b57c
@ -26,6 +26,7 @@ TODO:
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/n64.h"
|
||||
#include <algorithm>
|
||||
|
||||
#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 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 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:
|
||||
{
|
||||
*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 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 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 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 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 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 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 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 13: *input_r = &userdata->m_lod_fraction; *input_g = &userdata->m_lod_fraction; *input_b = &userdata->m_lod_fraction; 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 15: *input_r = (UINT8*)&m_k5; *input_g = (UINT8*)&m_k5; *input_b = (UINT8*)&m_k5; 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_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_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_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_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_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.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.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 = &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 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
|
||||
{
|
||||
@ -532,61 +533,36 @@ void n64_rdp::set_mul_input_alpha(UINT8** input, INT32 code, rdp_span_aux* userd
|
||||
{
|
||||
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 2: *input = &userdata->m_texel1_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 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;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
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;
|
||||
}
|
||||
*input_rgb = cycle == 0 ? &userdata->m_pixel_color : &userdata->m_blended_pixel_color;
|
||||
break;
|
||||
}
|
||||
|
||||
case 1:
|
||||
{
|
||||
*input_r = &userdata->m_memory_color.i.r;
|
||||
*input_g = &userdata->m_memory_color.i.g;
|
||||
*input_b = &userdata->m_memory_color.i.b;
|
||||
*input_rgb = &userdata->m_memory_color;
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
*input_r = &userdata->m_blend_color.i.r;
|
||||
*input_g = &userdata->m_blend_color.i.g;
|
||||
*input_b = &userdata->m_blend_color.i.b;
|
||||
*input_rgb = &userdata->m_blend_color;
|
||||
break;
|
||||
}
|
||||
|
||||
case 3:
|
||||
{
|
||||
*input_r = &userdata->m_fog_color.i.r;
|
||||
*input_g = &userdata->m_fog_color.i.g;
|
||||
*input_b = &userdata->m_fog_color.i.b;
|
||||
*input_rgb = &userdata->m_fog_color;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (which == 0)
|
||||
@ -2067,287 +2043,147 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
|
||||
rdp_poly_state* object = NULL;
|
||||
bool valid = false;
|
||||
|
||||
if(flip)
|
||||
INT32* minx = flip ? &minxhx : &minxmx;
|
||||
INT32* maxx = flip ? &maxxmx : &maxxhx;
|
||||
INT32* startx = flip ? maxx : minx;
|
||||
INT32* endx = flip ? minx : maxx;
|
||||
|
||||
for (INT32 k = ycur; k <= ylfar; k++)
|
||||
{
|
||||
for (INT32 k = ycur; k <= ylfar; k++)
|
||||
if (k == ym)
|
||||
{
|
||||
if (k == ym)
|
||||
xleft = xl & ~1;
|
||||
xleft_inc = (dxldy >> 2) & ~1;
|
||||
}
|
||||
|
||||
const INT32 xstart = xleft >> 16;
|
||||
const INT32 xend = xright >> 16;
|
||||
const INT32 j = k >> 2;
|
||||
const INT32 spanidx = (k - ycur) >> 2;
|
||||
const INT32 spix = k & 3;
|
||||
bool valid_y = !(k < yh || k >= yl);
|
||||
|
||||
if (spanidx >= 0 && spanidx < 2048)
|
||||
{
|
||||
majorxint[spix] = xend;
|
||||
minorxint[spix] = xstart;
|
||||
majorx[spix] = xright;
|
||||
minorx[spix] = xleft;
|
||||
|
||||
if (spix == 0)
|
||||
{
|
||||
xleft = xl & ~1;
|
||||
xleft_inc = (dxldy >> 2) & ~1;
|
||||
*maxx = 0;
|
||||
*minx = 0xfff;
|
||||
}
|
||||
|
||||
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)
|
||||
if (valid_y)
|
||||
{
|
||||
majorxint[spix] = xend; // 0
|
||||
minorxint[spix] = xstart; // 319
|
||||
majorx[spix] = xright; // 0x00000000
|
||||
minorx[spix] = xleft; // 0x013f0000
|
||||
|
||||
if (spix == 0)
|
||||
if (flip)
|
||||
{
|
||||
maxxmx = 0;
|
||||
minxhx = 0xfff;
|
||||
*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(new_object)
|
||||
{
|
||||
object = &object_data_alloc();
|
||||
memcpy(object->m_tmem, m_tmem, 0x1000);
|
||||
new_object = false;
|
||||
}
|
||||
|
||||
if (valid_y)
|
||||
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
|
||||
valid = true;
|
||||
m_aux_buf_ptr += sizeof(rdp_span_aux);
|
||||
|
||||
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
|
||||
{
|
||||
maxxmx = (xstart > maxxmx) ? xstart : maxxmx;
|
||||
minxhx = (xend < minxhx) ? xend : minxhx;
|
||||
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
|
||||
}
|
||||
|
||||
if (spix == 0)
|
||||
{
|
||||
if(new_object)
|
||||
{
|
||||
object = &object_data_alloc();
|
||||
memcpy(object->m_tmem, m_tmem, 0x1000);
|
||||
new_object = false;
|
||||
}
|
||||
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
|
||||
userdata->m_tmem = object->m_tmem;
|
||||
|
||||
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
|
||||
m_aux_buf_ptr += sizeof(rdp_span_aux);
|
||||
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_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_lod_fraction = m_lod_fraction;
|
||||
userdata->m_prim_lod_fraction = m_prim_lod_fraction;
|
||||
|
||||
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
|
||||
{
|
||||
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
|
||||
}
|
||||
// Setup blender data for this scanline
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
|
||||
valid = true;
|
||||
// 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);
|
||||
|
||||
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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
r += drde;
|
||||
g += dgde;
|
||||
b += dbde;
|
||||
a += dade;
|
||||
s += dsde;
|
||||
t += dtde;
|
||||
w += dwde;
|
||||
z += dzde;
|
||||
spans[spanidx].startx = *startx;
|
||||
spans[spanidx].stopx = *endx;
|
||||
((this)->*(m_compute_cvg[flip]))(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
|
||||
}
|
||||
|
||||
xleft += xleft_inc;
|
||||
xright += xright_inc;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (INT32 k = ycur; k <= ylfar; k++)
|
||||
|
||||
if (spix == 3)
|
||||
{
|
||||
if (k == ym)
|
||||
{
|
||||
xleft = xl & ~1;
|
||||
xleft_inc = (dxldy >> 2) & ~1;
|
||||
}
|
||||
|
||||
const INT32 xstart = xleft >> 16;
|
||||
const INT32 xend = xright >> 16;
|
||||
const INT32 j = k >> 2;
|
||||
const INT32 spanidx = j - (ycur >> 2);
|
||||
const INT32 spix = k & 3;
|
||||
bool valid_y = !(k < yh || k >= yl);
|
||||
|
||||
if (k >= 0 && k < 0x1000)
|
||||
{
|
||||
majorxint[spix] = xend;
|
||||
minorxint[spix] = xstart;
|
||||
majorx[spix] = xright;
|
||||
minorx[spix] = xleft;
|
||||
|
||||
if (spix == 0)
|
||||
{
|
||||
maxxhx = 0;
|
||||
minxmx = 0xfff;
|
||||
}
|
||||
|
||||
if (valid_y)
|
||||
{
|
||||
minxmx = (xstart < minxmx) ? xstart : minxmx;
|
||||
maxxhx = (xend > maxxhx) ? xend : maxxhx;
|
||||
}
|
||||
|
||||
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);
|
||||
valid = true;
|
||||
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;
|
||||
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 = minxmx;
|
||||
spans[spanidx].stopx = maxxhx;
|
||||
compute_cvg_noflip(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;
|
||||
r += drde;
|
||||
g += dgde;
|
||||
b += dbde;
|
||||
a += dade;
|
||||
s += dsde;
|
||||
t += dtde;
|
||||
w += dwde;
|
||||
z += dzde;
|
||||
}
|
||||
xleft += xleft_inc;
|
||||
xright += xright_inc;
|
||||
}
|
||||
|
||||
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;
|
||||
k4 = ((w2 >> 17) & 1) ? (-(0x100 - k4)) : k4;
|
||||
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)
|
||||
@ -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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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_alpha.c = m_prim_color.i.a * 0x01010101;
|
||||
}
|
||||
|
||||
void n64_rdp::cmd_set_env_color(UINT32 w1, UINT32 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)
|
||||
@ -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);
|
||||
|
||||
m_prim_lod_fraction = 0;
|
||||
m_prim_lod_fraction.c = 0;
|
||||
|
||||
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_compute_cvg[0] = &n64_rdp::compute_cvg_noflip;
|
||||
m_compute_cvg[1] = &n64_rdp::compute_cvg_flip;
|
||||
}
|
||||
|
||||
void n64_state::video_start()
|
||||
|
@ -327,13 +327,9 @@ struct color_inputs_t
|
||||
UINT8* combiner_alphaadd[2];
|
||||
|
||||
// blender input
|
||||
UINT8* blender1a_r[2];
|
||||
UINT8* blender1a_g[2];
|
||||
UINT8* blender1a_b[2];
|
||||
color_t* blender1a_rgb[2];
|
||||
UINT8* blender1b_a[2];
|
||||
UINT8* blender2a_r[2];
|
||||
UINT8* blender2a_g[2];
|
||||
UINT8* blender2a_b[2];
|
||||
color_t* blender2a_rgb[2];
|
||||
UINT8* blender2b_a[2];
|
||||
};
|
||||
|
||||
@ -346,19 +342,31 @@ struct rdp_span_aux
|
||||
color_t m_pixel_color;
|
||||
color_t m_inv_pixel_color;
|
||||
color_t m_blended_pixel_color;
|
||||
|
||||
color_t m_combined_color;
|
||||
color_t m_combined_alpha;
|
||||
color_t m_texel0_color;
|
||||
color_t m_texel0_alpha;
|
||||
color_t m_texel1_color;
|
||||
color_t m_texel1_alpha;
|
||||
color_t m_next_texel_color;
|
||||
color_t m_next_texel_alpha;
|
||||
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_alpha; /* flat primitive alpha */
|
||||
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_alpha; /* generic color constant ('fog') */
|
||||
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_noise_color; /* noise */
|
||||
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */
|
||||
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
||||
color_t m_lod_fraction; /* Z-based 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;
|
||||
UINT32 m_current_pix_cvg;
|
||||
UINT32 m_current_mem_cvg;
|
||||
@ -478,16 +486,14 @@ public:
|
||||
UINT8 get_random() { return m_misc_state.m_random_seed += 0x13; }
|
||||
|
||||
// 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_k1() const { return m_k1; }
|
||||
INT32 get_k2() const { return m_k2; }
|
||||
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)
|
||||
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
|
||||
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_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_alpha; /* flat primitive alpha */
|
||||
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_alpha; /* generic alpha constant ('fog') */
|
||||
color_t m_key_scale; /* color-keying constant */
|
||||
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */
|
||||
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
||||
color_t m_lod_fraction; /* Z-based LOD fraction for this poly */
|
||||
color_t m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
||||
|
||||
color_t m_one;
|
||||
color_t m_zero;
|
||||
@ -595,8 +605,6 @@ public:
|
||||
rectangle m_visarea;
|
||||
|
||||
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;
|
||||
UINT32 m_aux_buf_ptr;
|
||||
@ -607,6 +615,9 @@ public:
|
||||
n64_tile_t m_tiles[8];
|
||||
|
||||
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 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);
|
||||
@ -618,6 +629,9 @@ private:
|
||||
void video_update16(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;
|
||||
|
||||
combine_modes_t m_combine;
|
||||
@ -648,8 +662,8 @@ private:
|
||||
INT32 m_k1;
|
||||
INT32 m_k2;
|
||||
INT32 m_k3;
|
||||
INT32 m_k4;
|
||||
INT32 m_k5;
|
||||
color_t m_k4;
|
||||
color_t m_k5;
|
||||
|
||||
// Texture perspective division
|
||||
INT32 m_norm_point_rom[64];
|
||||
|
@ -106,9 +106,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_nodither(INT32* fr, INT32* fg, INT32*
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*fr = *userdata->m_color_inputs.blender1a_r[0];
|
||||
*fg = *userdata->m_color_inputs.blender1a_g[0];
|
||||
*fb = *userdata->m_color_inputs.blender1a_b[0];
|
||||
*fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
|
||||
*fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
|
||||
*fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -121,9 +121,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_dither(INT32* fr, INT32* fg, INT32* fb
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith];
|
||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[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_rgb[0]).i.g & 0xff) << 3) | dith];
|
||||
*fb = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.b & 0xff) << 3) | dith];
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -136,9 +136,9 @@ bool n64_blender_t::cycle1_noblend_acvg_nodither(INT32* fr, INT32* fg, INT32* fb
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*fr = *userdata->m_color_inputs.blender1a_r[0];
|
||||
*fg = *userdata->m_color_inputs.blender1a_g[0];
|
||||
*fb = *userdata->m_color_inputs.blender1a_b[0];
|
||||
*fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
|
||||
*fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
|
||||
*fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -151,9 +151,9 @@ bool n64_blender_t::cycle1_noblend_acvg_dither(INT32* fr, INT32* fg, INT32* fb,
|
||||
{
|
||||
return false;
|
||||
}
|
||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith];
|
||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[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_rgb[0]).i.g << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.b << 3) | dith];
|
||||
|
||||
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.b = b;
|
||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||
*fr = *userdata->m_color_inputs.blender1a_r[1];
|
||||
*fg = *userdata->m_color_inputs.blender1a_g[1];
|
||||
*fb = *userdata->m_color_inputs.blender1a_b[1];
|
||||
*fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
|
||||
*fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
|
||||
*fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
|
||||
|
||||
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.b = b;
|
||||
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];
|
||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[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_rgb[1]).i.g << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
|
||||
|
||||
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.b = b;
|
||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||
*fr = *userdata->m_color_inputs.blender1a_r[1];
|
||||
*fg = *userdata->m_color_inputs.blender1a_g[1];
|
||||
*fb = *userdata->m_color_inputs.blender1a_b[1];
|
||||
*fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
|
||||
*fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
|
||||
*fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
|
||||
|
||||
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.b = b;
|
||||
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];
|
||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[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_rgb[1]).i.g << 3) | dith];
|
||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
|
||||
|
||||
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)
|
||||
{
|
||||
*r = *userdata->m_color_inputs.blender1a_r[cycle];
|
||||
*g = *userdata->m_color_inputs.blender1a_g[cycle];
|
||||
*b = *userdata->m_color_inputs.blender1a_b[cycle];
|
||||
*r = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.r;
|
||||
*g = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.g;
|
||||
*b = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.b;
|
||||
}
|
||||
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 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 g = (((int)(*userdata->m_color_inputs.blender1a_g[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_g[cycle]) * (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 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_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_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;
|
||||
g += ((int)*userdata->m_color_inputs.blender2a_g[cycle]) << special_shift;
|
||||
b += ((int)*userdata->m_color_inputs.blender2a_b[cycle]) << special_shift;
|
||||
r += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.r << special_shift;
|
||||
g += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.g << special_shift;
|
||||
b += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.b << special_shift;
|
||||
|
||||
r >>= object.m_other_modes.blend_shift;
|
||||
g >>= object.m_other_modes.blend_shift;
|
||||
|
@ -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 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 (distant)
|
||||
{
|
||||
userdata->m_lod_fraction = 0xff;
|
||||
lod_fraction = 0xff;
|
||||
}
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -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 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 (distant)
|
||||
{
|
||||
userdata->m_lod_fraction = 0xff;
|
||||
lod_fraction = 0xff;
|
||||
}
|
||||
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)
|
||||
{
|
||||
userdata->m_lod_fraction |= 0x100;
|
||||
}
|
||||
}*/
|
||||
|
||||
if (object.m_other_modes.tex_lod_en)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user