n64: fix several RDP regressions (#9125)

- YUV texture fetch and color space conversion
- textured rectangle command parsing
- set primitive depth command parsing
This commit is contained in:
invertego 2022-01-11 18:45:28 -05:00 committed by GitHub
parent 9ce167e8c2
commit 6637ec0647
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 22 deletions

View File

@ -2290,7 +2290,7 @@ void n64_rdp::cmd_tex_rect(uint64_t *cmd_buf)
ewdata[16] = ((dtdy >> 5) & 0xffff) << 32; // dsde, dtde, dwde (0)
ewdata[17] = ((dtdy >> 5) & 0xffff) << 32; // dsdy, dtdy, dwdy (0)
ewdata[18] = ((dtdy & 0x1f) << 11) << 32; // dsde frac, dtde frac, dwde frac (0)
ewdata[38] = ((dtdy & 0x1f) << 11) << 32; // dsdy frac, dtdy frac, dwdy frac (0)
ewdata[19] = ((dtdy & 0x1f) << 11) << 32; // dsdy frac, dtdy frac, dwdy frac (0)
// ewdata[40-43] = 0; // depth
draw_triangle(cmd_buf, true, true, false, true);
@ -2301,7 +2301,7 @@ void n64_rdp::cmd_tex_rect_flip(uint64_t *cmd_buf)
const uint64_t w1 = cmd_buf[0];
const uint64_t w2 = cmd_buf[1];
const uint64_t tilenum = (w1 >> 56) & 0x7;
const uint64_t tilenum = (w1 >> 24) & 0x7;
const uint64_t xh = (w1 >> 12) & 0xfff;
const uint64_t xl = (w1 >> 44) & 0xfff;
const uint64_t yh = (w1 >> 0) & 0xfff;
@ -2393,7 +2393,7 @@ void n64_rdp::cmd_set_convert(uint64_t *cmd_buf)
k2 = (SIGN9(k2) << 1) + 1;
k3 = (SIGN9(k3) << 1) + 1;
set_yuv_factors(rgbaint_t(0, k0, k2, k3), rgbaint_t(0, 0, k1, 0), rgbaint_t(k4, k4, k4, k4), rgbaint_t(k5, k5, k5, k5));
set_yuv_factors(rgbaint_t(0, k0, k2, 0), rgbaint_t(0, 0, k1, k3), rgbaint_t(k4, k4, k4, k4), rgbaint_t(k5, k5, k5, k5));
}
void n64_rdp::cmd_set_scissor(uint64_t *cmd_buf)
@ -2411,7 +2411,7 @@ void n64_rdp::cmd_set_scissor(uint64_t *cmd_buf)
void n64_rdp::cmd_set_prim_depth(uint64_t *cmd_buf)
{
const uint64_t w1 = cmd_buf[0];
m_misc_state.m_primitive_z = (uint32_t)(w1 & 0x7fff0000);
m_misc_state.m_primitive_z = (uint16_t)(w1 >> 16) & 0x7fff;
m_misc_state.m_primitive_dz = (uint16_t)(w1 >> 32);
}
@ -3718,7 +3718,7 @@ void n64_rdp::span_draw_1cycle(int32_t scanline, const extent_t &extent, const r
if(object.m_other_modes.z_source_sel)
{
z.w = object.m_misc_state.m_primitive_z;
z.w = (uint32_t)object.m_misc_state.m_primitive_z << 16;
dzpix = object.m_misc_state.m_primitive_dz;
dzinc = 0;
}
@ -4045,7 +4045,7 @@ void n64_rdp::span_draw_2cycle(int32_t scanline, const extent_t &extent, const r
if(object.m_other_modes.z_source_sel)
{
z.w = object.m_misc_state.m_primitive_z;
z.w = (uint32_t)object.m_misc_state.m_primitive_z << 16;
dzpix = object.m_misc_state.m_primitive_dz;
dzinc = 0;
}

View File

@ -196,9 +196,9 @@ public:
uint16_t* get_tmem16() { return (uint16_t*)m_tmem.get(); }
// YUV Factors
void set_yuv_factors(color_t k023, color_t k1, color_t k4, color_t k5) { m_k023 = k023; m_k1 = k1; m_k4 = k4; m_k5 = k5; }
color_t& get_k023() { return m_k023; }
color_t& get_k1() { return m_k1; }
void set_yuv_factors(color_t k02, color_t k13, color_t k4, color_t k5) { m_k02 = k02; m_k13 = k13; m_k4 = k4; m_k5 = k5; }
color_t& get_k02() { return m_k02; }
color_t& get_k13() { return m_k13; }
// Blender-related (move into RDP::Blender)
void set_blender_input(int32_t cycle, int32_t which, color_t** input_rgb, color_t** input_a, int32_t a, int32_t b, rdp_span_aux* userdata);
@ -371,8 +371,8 @@ private:
std::unique_ptr<uint8_t[]> m_tmem;
// YUV factors
color_t m_k023;
color_t m_k1;
color_t m_k02;
color_t m_k13;
color_t m_k4;
color_t m_k5;

View File

@ -199,12 +199,12 @@ void n64_texture_pipe_t::cycle_nearest(color_t* TEX, color_t* prev, int32_t SSS,
t0.sign_extend(0x00000100, 0xffffff00);
rgbaint_t k1r(m_rdp->get_k1());
k1r.mul_imm(t0.get_r32());
rgbaint_t k13r(m_rdp->get_k13());
k13r.mul_imm(t0.get_r32());
TEX->set(m_rdp->get_k023());
TEX->set(m_rdp->get_k02());
TEX->mul_imm(t0.get_g32());
TEX->add(k1r);
TEX->add(k13r);
TEX->add_imm(0x80);
TEX->shr_imm(8);
TEX->add_imm(t0.get_b32());
@ -249,12 +249,12 @@ void n64_texture_pipe_t::cycle_linear(color_t* TEX, color_t* prev, int32_t SSS,
t0.sign_extend(0x00000100, 0xffffff00);
rgbaint_t k1r(m_rdp->get_k1());
k1r.mul_imm(t0.get_r32());
rgbaint_t k13r(m_rdp->get_k13());
k13r.mul_imm(t0.get_r32());
TEX->set(m_rdp->get_k023());
TEX->set(m_rdp->get_k02());
TEX->mul_imm(t0.get_g32());
TEX->add(k1r);
TEX->add(k13r);
TEX->add_imm(0x80);
TEX->shr_imm(8);
TEX->add_imm(t0.get_b32());
@ -738,12 +738,13 @@ void n64_texture_pipe_t::fetch_yuv(rgbaint_t& out, int32_t s, int32_t t, int32_t
{
const uint16_t *tc = ((uint16_t*)userdata->m_tmem);
const int32_t taddr = (((tbase << 3) + s) ^ sTexAddrSwap8[t & 1]) & 0x7ff;
const int32_t taddr = (tbase << 3) + s;
const int32_t taddrhi = (taddr ^ sTexAddrSwap8[t & 1]) & 0x7ff;
const int32_t taddrlow = ((taddr >> 1) ^ sTexAddrSwap16[t & 1]) & 0x3ff;
const uint16_t c = tc[taddrlow];
int32_t y = userdata->m_tmem[taddr | 0x800];
int32_t y = userdata->m_tmem[taddrhi | 0x800];
int32_t u = c >> 8;
int32_t v = c & 0xff;
@ -751,7 +752,7 @@ void n64_texture_pipe_t::fetch_yuv(rgbaint_t& out, int32_t s, int32_t t, int32_t
u |= ((u & 0x80) << 1);
v |= ((v & 0x80) << 1);
out.set(y & 0xff, y & 0xff, u & 0xff, v & 0xff);
out.set(y, u, v, y);
}
void n64_texture_pipe_t::fetch_ci4_tlut0(rgbaint_t& out, int32_t s, int32_t t, int32_t tbase, int32_t tpal, rdp_span_aux* userdata)