From ae70f4d52bffaa1d56ebd1f214ebf6608c50d76c Mon Sep 17 00:00:00 2001 From: Ryan Holtz Date: Fri, 3 Feb 2012 21:06:10 +0000 Subject: [PATCH] - RDP optimizations and memory system shunting in N64 driver; relative speedup of 1.4x to 1.5x [MooglyGuy] --- src/emu/cpu/rsp/rsp.c | 12 +- src/emu/cpu/rsp/rsp.h | 12 +- src/emu/cpu/rsp/rspdrc.c | 70 ++- src/mame/machine/n64.c | 58 +- src/mame/video/n64.c | 633 ++++++++++----------- src/mame/video/n64.h | 283 ++++------ src/mame/video/rdpblend.c | 149 +++-- src/mame/video/rdpblend.h | 28 +- src/mame/video/rdpfb.c | 148 ++--- src/mame/video/rdpfb.h | 4 +- src/mame/video/rdpspn16.c | 129 +++-- src/mame/video/rdptpipe.c | 1095 +++++++++++++++++++++---------------- src/mame/video/rdptpipe.h | 95 +++- src/mame/video/rdptri.h | 1 - 14 files changed, 1448 insertions(+), 1269 deletions(-) diff --git a/src/emu/cpu/rsp/rsp.c b/src/emu/cpu/rsp/rsp.c index a6bedcf3fcd..72fd66f2a45 100644 --- a/src/emu/cpu/rsp/rsp.c +++ b/src/emu/cpu/rsp/rsp.c @@ -3123,19 +3123,19 @@ CPU_GET_INFO( rsp ) } } +void rspdrc_flush_drc_cache(device_t *device) +{ +} + void rspdrc_set_options(device_t *device, UINT32 options) { } -void rspdrc_add_imem(device_t *device, void *base) +void rspdrc_add_imem(device_t *device, UINT32 *base) { } -void rspdrc_add_dmem(device_t *device, void *base) -{ -} - -void rspdrc_flush_drc_cache(device_t *device) +void rspdrc_add_dmem(device_t *device, UINT32 *base) { } diff --git a/src/emu/cpu/rsp/rsp.h b/src/emu/cpu/rsp/rsp.h index 13e9afba965..3260e3f131d 100644 --- a/src/emu/cpu/rsp/rsp.h +++ b/src/emu/cpu/rsp/rsp.h @@ -88,8 +88,8 @@ struct _rsp_config void rspdrc_flush_drc_cache(device_t *device); void rspdrc_set_options(device_t *device, UINT32 options); -void rspdrc_add_imem(device_t *device, void *base); -void rspdrc_add_dmem(device_t *device, void *base); +void rspdrc_add_dmem(device_t *device, UINT32 *base); +void rspdrc_add_imem(device_t *device, UINT32 *base); /*************************************************************************** HELPER MACROS @@ -184,6 +184,14 @@ struct _rsp_state direct_read_data *direct; int icount; + UINT32 *dmem32; + UINT16 *dmem16; + UINT8 *dmem8; + + UINT32 *imem32; + UINT16 *imem16; + UINT8 *imem8; + rspimp_state* impstate; }; diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c index fff466a2e53..1145d524f53 100644 --- a/src/emu/cpu/rsp/rspdrc.c +++ b/src/emu/cpu/rsp/rspdrc.c @@ -303,13 +303,25 @@ INLINE void save_fast_iregs(rsp_state *rsp, drcuml_block *block) CORE CALLBACKS ***************************************************************************/ +void rspdrc_add_imem(device_t *device, UINT32 *base) +{ + rsp_state *rsp = get_safe_token(device); + rsp->imem32 = base; + rsp->imem16 = (UINT16*)base; + rsp->imem8 = (UINT8*)base; +} + +void rspdrc_add_dmem(device_t *device, UINT32 *base) +{ + rsp_state *rsp = get_safe_token(device); + rsp->dmem32 = base; + rsp->dmem16 = (UINT16*)base; + rsp->dmem8 = (UINT8*)base; +} + INLINE UINT8 READ8(rsp_state *rsp, UINT32 address) { - UINT8 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address); - //printf("%04xr%02x\n",address & 0x1fff, ret); - return ret; + return rsp->dmem8[BYTE4_XOR_BE(address & 0xfff)]; } static void cfunc_read8(void *param) @@ -321,10 +333,10 @@ static void cfunc_read8(void *param) INLINE UINT16 READ16(rsp_state *rsp, UINT32 address) { UINT16 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address+0) << 8; - ret |= rsp->program->read_byte(address+1) << 0; - //printf("%04xr%04x\n",address & 0x1fff, ret); + address &= 0xfff; + ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 8; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)]; + //printf("%04xr%04x\n",address, ret); return ret; } @@ -337,12 +349,12 @@ static void cfunc_read16(void *param) INLINE UINT32 READ32(rsp_state *rsp, UINT32 address) { UINT32 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address+0) << 24; - ret |= rsp->program->read_byte(address+1) << 16; - ret |= rsp->program->read_byte(address+2) << 8; - ret |= rsp->program->read_byte(address+3) << 0; - //printf("%04xr%08x\n",address & 0x1fff, ret); + address &= 0xfff; + ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 24; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)] << 16; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 2)] << 8; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 3)]; + //printf("%04xr%08x\n",address, ret); return ret; } @@ -354,9 +366,9 @@ static void cfunc_read32(void *param) INLINE void WRITE8(rsp_state *rsp, UINT32 address, UINT8 data) { - address = 0x04000000 | (address & 0xfff); - //printf("%04x:%02x\n",address & 0x1fff, data); - rsp->program->write_byte(address, data); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data; + //printf("%04xw%02x\n",address, data); } static void cfunc_write8(void *param) @@ -367,11 +379,10 @@ static void cfunc_write8(void *param) INLINE void WRITE16(rsp_state *rsp, UINT32 address, UINT16 data) { - address = 0x04000000 | (address & 0xfff); - - //printf("%04x:%04x\n",address & 0x1fff, data); - rsp->program->write_byte(address + 0, (data >> 8) & 0xff); - rsp->program->write_byte(address + 1, (data >> 0) & 0xff); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 8; + rsp->dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff; + //printf("%04xw%04x\n",address, data); } static void cfunc_write16(void *param) @@ -382,13 +393,12 @@ static void cfunc_write16(void *param) INLINE void WRITE32(rsp_state *rsp, UINT32 address, UINT32 data) { - address = 0x04000000 | (address & 0xfff); - - //printf("%04x:%08x\n",address & 0x1fff, data); - rsp->program->write_byte(address + 0, (data >> 24) & 0xff); - rsp->program->write_byte(address + 1, (data >> 16) & 0xff); - rsp->program->write_byte(address + 2, (data >> 8) & 0xff); - rsp->program->write_byte(address + 3, (data >> 0) & 0xff); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 24; + rsp->dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff; + rsp->dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff; + rsp->dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff; + //printf("%04xw%08x\n",address, data); } static void cfunc_write32(void *param) diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c index 1cc8488b866..9c48789101d 100644 --- a/src/mame/machine/n64.c +++ b/src/mame/machine/n64.c @@ -1,6 +1,7 @@ /* machine/n64.c - contains N64 hardware emulation shared between MAME and MESS */ #include "emu.h" +#include "debugger.h" #include "cpu/mips/mips3.h" #include "cpu/mips/mips3com.h" #include "includes/n64.h" @@ -437,20 +438,19 @@ void n64_periphs::sp_dma(int direction) sp_dma_length = 0x1000 - (sp_mem_addr & 0xfff); } + UINT32 *sp_mem[2] = { rsp_dmem, rsp_imem }; + if(direction == 0)// RDRAM -> I/DMEM { for(int c = 0; c <= sp_dma_count; c++) { - UINT32 src = sp_dram_addr; - UINT32 dst = 0x04000000 | (sp_mem_addr & 0x1fff); + UINT32 src = (sp_dram_addr & 0x007fffff) >> 2; + UINT32 dst = (sp_mem_addr & 0x1fff) >> 2; - //printf("CPU %08x -> RSP %08x\n", sp_dram_addr, 0x04000000 | sp_mem_addr); - for(int i = 0; i < sp_dma_length; i++) + for(int i = 0; i < sp_dma_length / 4; i++) { - //printf("%02x ", mem_map->read_byte((src + i)^3)); - mem_map->write_byte(dst + i, mem_map->read_byte(src + i)); + sp_mem[(dst + i) >> 10][(dst + i) & 0x3ff] = rdram[src + i]; } - //printf("\n"); sp_mem_addr += sp_dma_length; sp_dram_addr += sp_dma_length; @@ -462,16 +462,13 @@ void n64_periphs::sp_dma(int direction) { for(int c = 0; c <= sp_dma_count; c++) { - UINT32 src = 0x04000000 | (sp_mem_addr & 0x1fff); - UINT32 dst = sp_dram_addr; + UINT32 src = (sp_mem_addr & 0x1fff) >> 2; + UINT32 dst = (sp_dram_addr & 0x007fffff) >> 2; - //printf("RSP %08x -> CPU %08x\n", 0x04000000 | sp_mem_addr, sp_dram_addr); - for(int i = 0; i < sp_dma_length; i++) + for(int i = 0; i < sp_dma_length / 4; i++) { - //printf("%02x ", mem_map->read_byte((src + i)^3)); - mem_map->write_byte(dst + i, mem_map->read_byte(src + i)); + rdram[dst + i] = sp_mem[(src + i) >> 10][(src + i) & 0x3ff]; } - //printf("\n"); sp_mem_addr += sp_dma_length; sp_dram_addr += sp_dma_length; @@ -870,7 +867,7 @@ void n64_periphs::vi_recalculate_resolution() if (height > 480) height = 480; - state->m_rdp.GetMiscState()->m_fb_height = height; + state->m_rdp.MiscState.FBHeight = height; visarea.max_x = width - 1; visarea.max_y = height - 1; @@ -953,7 +950,7 @@ WRITE32_MEMBER( n64_periphs::vi_reg_w ) vi_recalculate_resolution(); } vi_width = data; - state->m_rdp.GetMiscState()->m_fb_width = data; + state->m_rdp.MiscState.FBWidth = data; break; case 0x0c/4: // VI_INTR_REG @@ -1212,7 +1209,12 @@ static TIMER_CALLBACK(pi_dma_callback) void n64_periphs::pi_dma_tick() { - //printf("pi_dma_tick\n"); + UINT16 *cart16 = (UINT16*)machine().region("user2")->base(); + UINT16 *dram16 = (UINT16*)rdram; + + UINT32 cart_addr = (pi_cart_addr & 0x0fffffff) >> 1; + UINT32 dram_addr = (pi_dram_addr & 0x007fffff) >> 1; + if(pi_dma_dir == 1) { UINT32 dma_length = pi_wr_len + 1; @@ -1223,13 +1225,13 @@ void n64_periphs::pi_dma_tick() if (pi_dram_addr != 0xffffffff) { - for(int i = 0; i < dma_length; i++) + for(int i = 0; i < dma_length / 2; i++) { - UINT8 b = mem_map->read_byte(pi_cart_addr); - mem_map->write_byte(pi_dram_addr & 0x1fffffff, b); - pi_cart_addr += 1; - pi_dram_addr += 1; + dram16[BYTE_XOR_BE(dram_addr + i)] = cart16[BYTE_XOR_BE(cart_addr + i)]; } + + pi_cart_addr += dma_length; + pi_dram_addr += dma_length; } if (pi_first_dma) @@ -1250,13 +1252,13 @@ void n64_periphs::pi_dma_tick() if (pi_dram_addr != 0xffffffff) { - for(int i = 0; i < dma_length; i++) + for(int i = 0; i < dma_length / 2; i++) { - UINT8 b = mem_map->read_byte(pi_dram_addr); - mem_map->write_byte(pi_cart_addr & 0x1fffffff, b); - pi_cart_addr += 1; - pi_dram_addr += 1; + cart16[BYTE_XOR_BE(cart_addr + i)] = dram16[BYTE_XOR_BE(dram_addr + i)]; } + + pi_cart_addr += dma_length; + pi_dram_addr += dma_length; } } @@ -1861,6 +1863,8 @@ MACHINE_START( n64 ) rspdrc_set_options(machine.device("rsp"), RSPDRC_STRICT_VERIFY); rspdrc_flush_drc_cache(machine.device("rsp")); + rspdrc_add_dmem(machine.device("rsp"), rsp_dmem); + rspdrc_add_imem(machine.device("rsp"), rsp_imem); } MACHINE_RESET( n64 ) diff --git a/src/mame/video/n64.c b/src/mame/video/n64.c index 6641b769c64..c926dad6ed3 100644 --- a/src/mame/video/n64.c +++ b/src/mame/video/n64.c @@ -45,17 +45,17 @@ namespace RDP void Processor::GetAlphaCvg(UINT8 *comb_alpha) { INT32 temp = *comb_alpha; - INT32 temp2 = m_misc_state.m_curpixel_cvg; + INT32 temp2 = MiscState.CurrentPixCvg; INT32 temp3 = 0; - if (m_other_modes.cvg_times_alpha) + if (OtherModes.cvg_times_alpha) { temp3 = (temp * temp2) + 4; - m_misc_state.m_curpixel_cvg = (temp3 >> 8) & 0xf; + MiscState.CurrentPixCvg = (temp3 >> 8) & 0xf; } - if (m_other_modes.alpha_cvg_select) + if (OtherModes.alpha_cvg_select) { - temp = (m_other_modes.cvg_times_alpha) ? (temp3 >> 3) : (temp2 << 5); + temp = (OtherModes.cvg_times_alpha) ? (temp3 >> 3) : (temp2 << 5); } if (temp > 0xff) { @@ -79,24 +79,24 @@ void Processor::VideoUpdate(n64_periphs *n64, bitmap_rgb32 &bitmap) break; default: - //fatalerror("Unsupported framebuffer depth: m_fb_size=%d\n", m_misc_state.m_fb_size); + //fatalerror("Unsupported framebuffer depth: m_fb_size=%d\n", MiscState.FBSize); break; } } void Processor::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap) { - int fsaa = (((n64->vi_control >> 8) & 3) < 2); - int divot = (n64->vi_control >> 4) & 1; + //int fsaa = (((n64->vi_control >> 8) & 3) < 2); + //int divot = (n64->vi_control >> 4) & 1; - UINT32 prev_cvg = 0; - UINT32 next_cvg = 0; + //UINT32 prev_cvg = 0; + //UINT32 next_cvg = 0; //int dither_filter = (n64->vi_control >> 16) & 1; //int vibuffering = ((n64->vi_control & 2) && fsaa && divot); UINT16 *frame_buffer = (UINT16*)&rdram[(n64->vi_origin & 0xffffff) >> 2]; UINT32 hb = ((n64->vi_origin & 0xffffff) >> 2) >> 1; - UINT8* hidden_buffer = &m_hidden_bits[hb]; + UINT8* hidden_buffer = &HiddenBits[hb]; INT32 hdiff = (n64->vi_hstart & 0x3ff) - ((n64->vi_hstart >> 16) & 0x3ff); float hcoeff = ((float)(n64->vi_xscale & 0xfff) / (1 << 10)); @@ -132,28 +132,28 @@ void Processor::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap) //int r, g, b; UINT16 pix = frame_buffer[pixels ^ WORD_ADDR_XOR]; - m_misc_state.m_curpixel_cvg = ((pix & 1) << 2) | (hidden_buffer[pixels ^ BYTE_ADDR_XOR] & 3); + MiscState.CurrentPixCvg = ((pix & 1) << 2) | (hidden_buffer[pixels ^ BYTE_ADDR_XOR] & 3); - if(divot) - { - if(i > 0 && i < (hres - 1)) - { - prev_cvg = ((frame_buffer[(pixels - 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels - 1)^BYTE_ADDR_XOR] & 3); - next_cvg = ((frame_buffer[(pixels + 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels + 1)^BYTE_ADDR_XOR] & 3); - } - } + //if(divot) + //{ + // if(i > 0 && i < (hres - 1)) + // { + // prev_cvg = ((frame_buffer[(pixels - 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels - 1)^BYTE_ADDR_XOR] & 3); + // next_cvg = ((frame_buffer[(pixels + 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels + 1)^BYTE_ADDR_XOR] & 3); + // } + //} c.i.r = ((pix >> 8) & 0xf8) | (pix >> 13); c.i.g = ((pix >> 3) & 0xf8) | ((pix >> 8) & 0x07); c.i.b = ((pix << 2) & 0xf8) | ((pix >> 3) & 0x07); - if(fsaa) - { - //if (/*!vibuffering &&*/ state->m_rdp.GetMiscState()->m_curpixel_cvg < 7 && i > 1 && j > 1 && i < (hres - 2) && j < (vres - 2)) + //if(fsaa) + //{ + //if (/*!vibuffering &&*/ state->m_rdp.MiscState.CurrentPixCvg < 7 && i > 1 && j > 1 && i < (hres - 2) && j < (vres - 2)) //{ //video_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR],&hidden_buffer[pixels ^ BYTE_ADDR_XOR], n64->vi_width); //} - } - //else if (dither_filter && state->m_rdp.GetMiscState()->m_curpixel_cvg == 7 && i > 0 && j > 0 && i < (hres - 1) && j < (vres - 1)) + //} + //else if (dither_filter && state->m_rdp.MiscState.CurrentPixCvg == 7 && i > 0 && j > 0 && i < (hres - 1) && j < (vres - 1)) //{ //if (vibuffering) //{ @@ -164,10 +164,10 @@ void Processor::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap) //restore_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR], pixels ^ WORD_ADDR_XOR, n64->vi_width); //} //} - if(divot) - { - if (i > 0 && i < (hres - 1) && (m_misc_state.m_curpixel_cvg != 7 || prev_cvg != 7 || next_cvg != 7)) - { + //if(divot) + //{ + //if (i > 0 && i < (hres - 1) && (MiscState.CurrentPixCvg != 7 || prev_cvg != 7 || next_cvg != 7)) + //{ //if (vibuffering) //{ // divot_filter16_buffer(&r, &g, &b, &ViBuffer[i][j]); @@ -176,8 +176,8 @@ void Processor::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap) //{ //divot_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR], pixels ^ WORD_ADDR_XOR); //} - } - } + //} + //} /* if (gamma_dither) @@ -412,56 +412,56 @@ void Processor::ColorCombiner1Cycle(bool noisecompute) { if (noisecompute) { - m_noise_color.i.r = m_noise_color.i.g = m_noise_color.i.b = machine().rand() & 0xff; // Not accurate... + NoiseColor.i.r = NoiseColor.i.g = NoiseColor.i.b = machine().rand() & 0xff; // Not accurate... } - m_pixel_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[1],*m_color_inputs.combiner_rgbsub_b_r[1],*m_color_inputs.combiner_rgbmul_r[1],*m_color_inputs.combiner_rgbadd_r[1]); - m_pixel_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[1],*m_color_inputs.combiner_rgbsub_b_g[1],*m_color_inputs.combiner_rgbmul_g[1],*m_color_inputs.combiner_rgbadd_g[1]); - m_pixel_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[1],*m_color_inputs.combiner_rgbsub_b_b[1],*m_color_inputs.combiner_rgbmul_b[1],*m_color_inputs.combiner_rgbadd_b[1]); - m_pixel_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[1],*m_color_inputs.combiner_alphasub_b[1],*m_color_inputs.combiner_alphamul[1],*m_color_inputs.combiner_alphaadd[1]); + PixelColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[1],*ColorInputs.combiner_rgbsub_b_r[1],*ColorInputs.combiner_rgbmul_r[1],*ColorInputs.combiner_rgbadd_r[1]); + PixelColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[1],*ColorInputs.combiner_rgbsub_b_g[1],*ColorInputs.combiner_rgbmul_g[1],*ColorInputs.combiner_rgbadd_g[1]); + PixelColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[1],*ColorInputs.combiner_rgbsub_b_b[1],*ColorInputs.combiner_rgbmul_b[1],*ColorInputs.combiner_rgbadd_b[1]); + PixelColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[1],*ColorInputs.combiner_alphasub_b[1],*ColorInputs.combiner_alphamul[1],*ColorInputs.combiner_alphaadd[1]); //Alpha coverage combiner - GetAlphaCvg(&m_pixel_color.i.a); + GetAlphaCvg(&PixelColor.i.a); } void Processor::ColorCombiner2Cycle(bool noisecompute) { if (noisecompute) { - m_noise_color.i.r = m_noise_color.i.g = m_noise_color.i.b = machine().rand() & 0xff; // HACK + NoiseColor.i.r = NoiseColor.i.g = NoiseColor.i.b = machine().rand() & 0xff; // HACK } - m_combined_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[0],*m_color_inputs.combiner_rgbsub_b_r[0],*m_color_inputs.combiner_rgbmul_r[0],*m_color_inputs.combiner_rgbadd_r[0]); - m_combined_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[0],*m_color_inputs.combiner_rgbsub_b_g[0],*m_color_inputs.combiner_rgbmul_g[0],*m_color_inputs.combiner_rgbadd_g[0]); - m_combined_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[0],*m_color_inputs.combiner_rgbsub_b_b[0],*m_color_inputs.combiner_rgbmul_b[0],*m_color_inputs.combiner_rgbadd_b[0]); - m_combined_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[0],*m_color_inputs.combiner_alphasub_b[0],*m_color_inputs.combiner_alphamul[0],*m_color_inputs.combiner_alphaadd[0]); + CombinedColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[0],*ColorInputs.combiner_rgbsub_b_r[0],*ColorInputs.combiner_rgbmul_r[0],*ColorInputs.combiner_rgbadd_r[0]); + CombinedColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[0],*ColorInputs.combiner_rgbsub_b_g[0],*ColorInputs.combiner_rgbmul_g[0],*ColorInputs.combiner_rgbadd_g[0]); + CombinedColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[0],*ColorInputs.combiner_rgbsub_b_b[0],*ColorInputs.combiner_rgbmul_b[0],*ColorInputs.combiner_rgbadd_b[0]); + CombinedColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[0],*ColorInputs.combiner_alphasub_b[0],*ColorInputs.combiner_alphamul[0],*ColorInputs.combiner_alphaadd[0]); - m_texel0_color = m_texel1_color; - m_texel1_color = m_next_texel_color; + Texel0Color = Texel1Color; + Texel1Color = NextTexelColor; - m_pixel_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[1],*m_color_inputs.combiner_rgbsub_b_r[1],*m_color_inputs.combiner_rgbmul_r[1],*m_color_inputs.combiner_rgbadd_r[1]); - m_pixel_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[1],*m_color_inputs.combiner_rgbsub_b_g[1],*m_color_inputs.combiner_rgbmul_g[1],*m_color_inputs.combiner_rgbadd_g[1]); - m_pixel_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[1],*m_color_inputs.combiner_rgbsub_b_b[1],*m_color_inputs.combiner_rgbmul_b[1],*m_color_inputs.combiner_rgbadd_b[1]); - m_pixel_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[1],*m_color_inputs.combiner_alphasub_b[1],*m_color_inputs.combiner_alphamul[1],*m_color_inputs.combiner_alphaadd[1]); + PixelColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[1],*ColorInputs.combiner_rgbsub_b_r[1],*ColorInputs.combiner_rgbmul_r[1],*ColorInputs.combiner_rgbadd_r[1]); + PixelColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[1],*ColorInputs.combiner_rgbsub_b_g[1],*ColorInputs.combiner_rgbmul_g[1],*ColorInputs.combiner_rgbadd_g[1]); + PixelColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[1],*ColorInputs.combiner_rgbsub_b_b[1],*ColorInputs.combiner_rgbmul_b[1],*ColorInputs.combiner_rgbadd_b[1]); + PixelColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[1],*ColorInputs.combiner_alphasub_b[1],*ColorInputs.combiner_alphamul[1],*ColorInputs.combiner_alphaadd[1]); - GetAlphaCvg(&m_pixel_color.i.a); + GetAlphaCvg(&PixelColor.i.a); } void Processor::SetSubAInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) { switch (code & 0xf) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_one_color.i.r; *input_g = &m_one_color.i.g; *input_b = &m_one_color.i.b; break; - case 7: *input_r = &m_noise_color.i.r; *input_g = &m_noise_color.i.g; *input_b = &m_noise_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &OneColor.i.r; *input_g = &OneColor.i.g; *input_b = &OneColor.i.b; break; + case 7: *input_r = &NoiseColor.i.r; *input_g = &NoiseColor.i.g; *input_b = &NoiseColor.i.b; break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -470,17 +470,17 @@ void Processor::SetSubBInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_ { switch (code & 0xf) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n"); break; - case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break; + case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -489,26 +489,26 @@ void Processor::SetMulInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b { switch (code & 0x1f) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_key_scale.i.r; *input_g = &m_key_scale.i.g; *input_b = &m_key_scale.i.b; break; - case 7: *input_r = &m_combined_color.i.a; *input_g = &m_combined_color.i.a; *input_b = &m_combined_color.i.a; break; - case 8: *input_r = &m_texel0_color.i.a; *input_g = &m_texel0_color.i.a; *input_b = &m_texel0_color.i.a; break; - case 9: *input_r = &m_texel1_color.i.a; *input_g = &m_texel1_color.i.a; *input_b = &m_texel1_color.i.a; break; - case 10: *input_r = &m_prim_color.i.a; *input_g = &m_prim_color.i.a; *input_b = &m_prim_color.i.a; break; - case 11: *input_r = &m_shade_color.i.a; *input_g = &m_shade_color.i.a; *input_b = &m_shade_color.i.a; break; - case 12: *input_r = &m_env_color.i.a; *input_g = &m_env_color.i.a; *input_b = &m_env_color.i.a; break; - case 13: *input_r = &m_lod_frac; *input_g = &m_lod_frac; *input_b = &m_lod_frac; break; - case 14: *input_r = &m_prim_lod_frac; *input_g = &m_prim_lod_frac; *input_b = &m_prim_lod_frac; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &KeyScale.i.r; *input_g = &KeyScale.i.g; *input_b = &KeyScale.i.b; break; + case 7: *input_r = &CombinedColor.i.a; *input_g = &CombinedColor.i.a; *input_b = &CombinedColor.i.a; break; + case 8: *input_r = &Texel0Color.i.a; *input_g = &Texel0Color.i.a; *input_b = &Texel0Color.i.a; break; + case 9: *input_r = &Texel1Color.i.a; *input_g = &Texel1Color.i.a; *input_b = &Texel1Color.i.a; break; + case 10: *input_r = &PrimColor.i.a; *input_g = &PrimColor.i.a; *input_b = &PrimColor.i.a; break; + case 11: *input_r = &ShadeColor.i.a; *input_g = &ShadeColor.i.a; *input_b = &ShadeColor.i.a; break; + case 12: *input_r = &EnvColor.i.a; *input_g = &EnvColor.i.a; *input_b = &EnvColor.i.a; break; + case 13: *input_r = &LODFraction; *input_g = &LODFraction; *input_b = &LODFraction; break; + case 14: *input_r = &PrimLODFraction; *input_g = &PrimLODFraction; *input_b = &PrimLODFraction; break; case 15: *input_r = (UINT8*)&m_k5; *input_g = (UINT8*)&m_k5; *input_b = (UINT8*)&m_k5; 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: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -517,14 +517,14 @@ void Processor::SetAddInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b { switch (code & 0x7) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_one_color.i.r; *input_g = &m_one_color.i.g; *input_b = &m_one_color.i.b; break; - case 7: *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &OneColor.i.r; *input_g = &OneColor.i.g; *input_b = &OneColor.i.b; break; + case 7: *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } @@ -532,14 +532,14 @@ void Processor::SetSubInputAlpha(UINT8 **input, int code) { switch (code & 0x7) { - case 0: *input = &m_combined_color.i.a; break; - case 1: *input = &m_texel0_color.i.a; break; - case 2: *input = &m_texel1_color.i.a; break; - case 3: *input = &m_prim_color.i.a; break; - case 4: *input = &m_shade_color.i.a; break; - case 5: *input = &m_env_color.i.a; break; - case 6: *input = &m_one_color.i.a; break; - case 7: *input = &m_zero_color.i.a; break; + case 0: *input = &CombinedColor.i.a; break; + case 1: *input = &Texel0Color.i.a; break; + case 2: *input = &Texel1Color.i.a; break; + case 3: *input = &PrimColor.i.a; break; + case 4: *input = &ShadeColor.i.a; break; + case 5: *input = &EnvColor.i.a; break; + case 6: *input = &OneColor.i.a; break; + case 7: *input = &ZeroColor.i.a; break; } } @@ -547,14 +547,14 @@ void Processor::SetMulInputAlpha(UINT8 **input, int code) { switch (code & 0x7) { - case 0: *input = &m_lod_frac; break; - case 1: *input = &m_texel0_color.i.a; break; - case 2: *input = &m_texel1_color.i.a; break; - case 3: *input = &m_prim_color.i.a; break; - case 4: *input = &m_shade_color.i.a; break; - case 5: *input = &m_env_color.i.a; break; - case 6: *input = &m_prim_lod_frac; break; - case 7: *input = &m_zero_color.i.a; break; + case 0: *input = &LODFraction; break; + case 1: *input = &Texel0Color.i.a; break; + case 2: *input = &Texel1Color.i.a; break; + case 3: *input = &PrimColor.i.a; break; + case 4: *input = &ShadeColor.i.a; break; + case 5: *input = &EnvColor.i.a; break; + case 6: *input = &PrimLODFraction; break; + case 7: *input = &ZeroColor.i.a; break; } } @@ -566,40 +566,40 @@ void Processor::SetBlenderInput(int cycle, int which, UINT8 **input_r, UINT8 **i { if (cycle == 0) { - *input_r = &m_pixel_color.i.r; - *input_g = &m_pixel_color.i.g; - *input_b = &m_pixel_color.i.b; + *input_r = &PixelColor.i.r; + *input_g = &PixelColor.i.g; + *input_b = &PixelColor.i.b; } else { - *input_r = &m_blended_pixel_color.i.r; - *input_g = &m_blended_pixel_color.i.g; - *input_b = &m_blended_pixel_color.i.b; + *input_r = &BlendedPixelColor.i.r; + *input_g = &BlendedPixelColor.i.g; + *input_b = &BlendedPixelColor.i.b; } break; } case 1: { - *input_r = &m_memory_color.i.r; - *input_g = &m_memory_color.i.g; - *input_b = &m_memory_color.i.b; + *input_r = &MemoryColor.i.r; + *input_g = &MemoryColor.i.g; + *input_b = &MemoryColor.i.b; break; } case 2: { - *input_r = &m_blend_color.i.r; - *input_g = &m_blend_color.i.g; - *input_b = &m_blend_color.i.b; + *input_r = &BlendColor.i.r; + *input_g = &BlendColor.i.g; + *input_b = &BlendColor.i.b; break; } case 3: { - *input_r = &m_fog_color.i.r; - *input_g = &m_fog_color.i.g; - *input_b = &m_fog_color.i.b; + *input_r = &FogColor.i.r; + *input_g = &FogColor.i.g; + *input_b = &FogColor.i.b; break; } } @@ -608,20 +608,20 @@ void Processor::SetBlenderInput(int cycle, int which, UINT8 **input_r, UINT8 **i { switch (b & 0x3) { - case 0: *input_a = &m_pixel_color.i.a; break; - case 1: *input_a = &m_fog_color.i.a; break; - case 2: *input_a = &m_shade_color.i.a; break; - case 3: *input_a = &m_zero_color.i.a; break; + case 0: *input_a = &PixelColor.i.a; break; + case 1: *input_a = &FogColor.i.a; break; + case 2: *input_a = &ShadeColor.i.a; break; + case 3: *input_a = &ZeroColor.i.a; break; } } else { switch (b & 0x3) { - case 0: *input_a = &m_inv_pixel_color.i.a; break; - case 1: *input_a = &m_memory_color.i.a; break; - case 2: *input_a = &m_one_color.i.a; break; - case 3: *input_a = &m_zero_color.i.a; break; + case 0: *input_a = &InvPixelColor.i.a; break; + case 1: *input_a = &MemoryColor.i.a; break; + case 2: *input_a = &OneColor.i.a; break; + case 3: *input_a = &ZeroColor.i.a; break; } } } @@ -859,14 +859,9 @@ UINT16 Processor::decompress_cvmask_frombyte(UINT8 x) void Processor::lookup_cvmask_derivatives(UINT32 mask, UINT8* offx, UINT8* offy) { - UINT32 index; - /* - if (mask != (mask & 0xa5a5))//never happens - stricterror("wrong cvmask computed: %x", mask); - */ - index = compressed_cvmasks[mask];//???????? VTune, ???-?? ?? 50% ???????, ??? ?????? ?? 8 ??? ?? ????? ? ???? ?-?? - m_misc_state.m_curpixel_cvg = cvarray[index].cvg; - m_misc_state.m_curpixel_cvbit = cvarray[index].cvbit;//??? mask15b: cv.c, bl.c + UINT32 index = compressed_cvmasks[mask]; + MiscState.CurrentPixCvg = cvarray[index].cvg; + MiscState.CurrentCvgBit = cvarray[index].cvbit; *offx = cvarray[index].xoff; *offy = cvarray[index].yoff; } @@ -880,7 +875,7 @@ void Processor::ZStore(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 z) } if(dzcurpixel <= MEM8_LIMIT) { - m_hidden_bits[dzcurpixel ^ BYTE_ADDR_XOR] = m_dzpix_enc & 3; + HiddenBits[dzcurpixel ^ BYTE_ADDR_XOR] = m_dzpix_enc & 3; } } @@ -913,7 +908,7 @@ UINT32 Processor::ZDecompress(UINT32 zcurpixel) UINT32 Processor::DZDecompress(UINT32 zcurpixel, UINT32 dzcurpixel) { UINT16 zval = RREADIDX16(zcurpixel); - UINT8 dzval = (((dzcurpixel) <= 0x7fffff) ? (GetHiddenBits()[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0); + UINT8 dzval = (((dzcurpixel) <= 0x7fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0); UINT32 dz_compressed = ((zval & 3) << 2) | (dzval & 3); return (1 << dz_compressed); } @@ -928,7 +923,7 @@ UINT32 Processor::DZCompress(UINT32 value) void Processor::GetDitherValues(int x, int y, int* cdith, int* adith) { int dithindex = ((y & 3) << 2) | (x & 3); - switch((m_other_modes.rgb_dither_sel << 2) | m_other_modes.alpha_dither_sel) + switch((OtherModes.rgb_dither_sel << 2) | OtherModes.alpha_dither_sel) { case 0: *adith = *cdith = s_magic_matrix[dithindex]; @@ -1011,12 +1006,12 @@ bool Processor::ZCompare(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 sz, UINT16 UINT32 zval; INT32 rawdzmem; - if (m_other_modes.z_compare_en) + if (OtherModes.z_compare_en) { oz = ZDecompress(zcurpixel); dzmem = DZDecompress(zcurpixel, dzcurpixel); zval = RREADIDX16(zcurpixel); - rawdzmem = ((zval & 3) << 2) | ((((dzcurpixel) <= 0x3fffff) ? (GetHiddenBits()[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0) & 3); + rawdzmem = ((zval & 3) << 2) | ((((dzcurpixel) <= 0x3fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0) & 3); } else { @@ -1027,16 +1022,13 @@ bool Processor::ZCompare(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 sz, UINT16 } m_dzpix_enc = DZCompress(dzpix & 0xffff); - m_blender.SetShiftA(CLAMP(m_dzpix_enc - rawdzmem, 0, 4)); - m_blender.SetShiftB(CLAMP(rawdzmem - m_dzpix_enc, 0, 4)); + Blender.ShiftA = CLAMP(m_dzpix_enc - rawdzmem, 0, 4); + Blender.ShiftB = CLAMP(rawdzmem - m_dzpix_enc, 0, 4); int precision_factor = (zval >> 13) & 0xf; - - bool precision_important = precision_factor < 3; - int dzmemmodifier; - if (precision_important) + if (precision_factor < 3) { - dzmemmodifier = 16 >> precision_factor; + int dzmemmodifier = 16 >> precision_factor; if (dzmem == 0x8000) { force_coplanar = true; @@ -1068,21 +1060,21 @@ bool Processor::ZCompare(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 sz, UINT16 farther = true; } - bool overflow = ((m_misc_state.m_curpixel_memcvg + m_misc_state.m_curpixel_cvg) & 8) > 0; - m_blender.SetBlendEnable(m_other_modes.force_blend || (!overflow && m_other_modes.antialias_en && farther)); - m_framebuffer.SetPreWrap(overflow); + bool overflow = ((MiscState.CurrentMemCvg + MiscState.CurrentPixCvg) & 8) > 0; + Blender.BlendEnable = OtherModes.force_blend || (!overflow && OtherModes.antialias_en && farther); + Framebuffer.SetPreWrap(overflow); int cvgcoeff = 0; UINT32 dzenc = 0; - if (m_other_modes.z_mode == 1 && infront && farther && overflow) + if (OtherModes.z_mode == 1 && infront && farther && overflow) { dzenc = DZCompress(dznotshift & 0xffff); cvgcoeff = ((oz >> dzenc) - (sz >> dzenc)) & 0xf; - m_misc_state.m_curpixel_cvg = ((cvgcoeff * m_misc_state.m_curpixel_cvg) >> 3) & 0xf; + MiscState.CurrentPixCvg = ((cvgcoeff * MiscState.CurrentPixCvg) >> 3) & 0xf; } - if (!m_other_modes.z_compare_en) + if (!OtherModes.z_compare_en) { return true; } @@ -1095,7 +1087,7 @@ bool Processor::ZCompare(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 sz, UINT16 nearer = true; } - switch(m_other_modes.z_mode) + switch(OtherModes.z_mode) { case 0: return (max || (overflow ? infront : nearer)); @@ -1743,7 +1735,6 @@ void N64::RDP::Triangle::InitFromData(running_machine &machine, bool shade, bool m_machine = &machine; m_rdp = &(machine.driver_data<_n64_state>())->m_rdp; m_cmd_data = rect ? m_rdp->GetTempRectData() : m_rdp->GetCommandData(); - m_misc_state = m_rdp->GetMiscState(); m_shade = shade; m_texture = texture; m_zbuffer = zbuffer; @@ -1809,7 +1800,7 @@ void N64::RDP::Triangle::compute_cvg_noflip(INT32* majorx, INT32* minorx, INT32* if (length < 0) return; - memset(&m_rdp->GetSpans()[scanline].m_cvg[purgestart], 0, (length + 1) << 2); + memset(&m_rdp->Spans[scanline].m_cvg[purgestart], 0, (length + 1) << 2); for(int i = 0; i < 4; i++) { @@ -1831,11 +1822,11 @@ void N64::RDP::Triangle::compute_cvg_noflip(INT32* majorx, INT32* minorx, INT32* { if (!(minorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[minorcurint] |= (leftcvghex(minorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[minorcurint] |= (leftcvghex(minorcur, fmask) << maskshift); } if (!(majorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (rightcvghex(majorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (rightcvghex(majorcur, fmask) << maskshift); } } else @@ -1843,12 +1834,12 @@ void N64::RDP::Triangle::compute_cvg_noflip(INT32* majorx, INT32* minorx, INT32* if (!(majorcurint & ~0x3ff)) { INT32 samecvg = leftcvghex(minorcur, fmask) & rightcvghex(majorcur, fmask); - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); } } for (; fleft <= fright; fleft++) { - m_rdp->GetSpans()[scanline].m_cvg[fleft] |= fmaskshifted; + m_rdp->Spans[scanline].m_cvg[fleft] |= fmaskshifted; } } } @@ -1882,7 +1873,7 @@ void N64::RDP::Triangle::compute_cvg_flip(INT32* majorx, INT32* minorx, INT32* m if (length < 0) return; - memset(&m_rdp->GetSpans()[scanline].m_cvg[purgestart], 0, (length + 1) << 2); + memset(&m_rdp->Spans[scanline].m_cvg[purgestart], 0, (length + 1) << 2); for(int i = 0; i < 4; i++) { @@ -1904,11 +1895,11 @@ void N64::RDP::Triangle::compute_cvg_flip(INT32* majorx, INT32* minorx, INT32* m { if (!(minorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[minorcurint] |= (rightcvghex(minorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[minorcurint] |= (rightcvghex(minorcur, fmask) << maskshift); } if (!(majorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (leftcvghex(majorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (leftcvghex(majorcur, fmask) << maskshift); } } else @@ -1916,12 +1907,12 @@ void N64::RDP::Triangle::compute_cvg_flip(INT32* majorx, INT32* minorx, INT32* m if (!(majorcurint & ~0x3ff)) { INT32 samecvg = rightcvghex(minorcur, fmask) & leftcvghex(majorcur, fmask); - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); } } for (; fleft <= fright; fleft++) { - m_rdp->GetSpans()[scanline].m_cvg[fleft] |= fmaskshifted; + m_rdp->Spans[scanline].m_cvg[fleft] |= fmaskshifted; } } } @@ -1934,7 +1925,7 @@ void N64::RDP::Triangle::Draw() UINT32 w2 = m_cmd_data[fifo_index + 1]; int flip = (w1 & 0x800000) ? 1 : 0; - m_misc_state->m_max_level = ((w1 >> 19) & 7); + m_rdp->MiscState.MaxLevel = ((w1 >> 19) & 7); int tilenum = (w1 >> 16) & 0x7; int dsdiff = 0, dtdiff = 0, dwdiff = 0, drdiff = 0, dgdiff = 0, dbdiff = 0, dadiff = 0, dzdiff = 0; @@ -2140,24 +2131,24 @@ void N64::RDP::Triangle::Draw() if (spix == 3) { - m_rdp->GetSpans()[j].m_lx = maxxmx; - m_rdp->GetSpans()[j].m_rx = minxhx; + m_rdp->Spans[j].m_lx = maxxmx; + m_rdp->Spans[j].m_rx = minxhx; compute_cvg_flip(majorx, minorx, majorxint, minorxint, j, yh, yl); } if (spix == ldflag) { - m_rdp->GetSpans()[j].m_unscissored_rx = xend; + m_rdp->Spans[j].m_unscissored_rx = xend; xfrac = ((xright >> 8) & 0xff); - m_rdp->GetSpans()[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); - m_rdp->GetSpans()[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); - m_rdp->GetSpans()[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); - m_rdp->GetSpans()[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); - m_rdp->GetSpans()[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); - //printf("%d - %08x\n", j, m_rdp->GetSpans()[j].m_z.w); + m_rdp->Spans[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); + m_rdp->Spans[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); + m_rdp->Spans[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); + m_rdp->Spans[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); + m_rdp->Spans[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; + m_rdp->Spans[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; + m_rdp->Spans[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; + m_rdp->Spans[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); + //printf("%d - %08x\n", j, m_rdp->Spans[j].m_z.w); } } @@ -2214,23 +2205,23 @@ void N64::RDP::Triangle::Draw() if (spix == 3) { - m_rdp->GetSpans()[j].m_lx = minxmx; - m_rdp->GetSpans()[j].m_rx = maxxhx; + m_rdp->Spans[j].m_lx = minxmx; + m_rdp->Spans[j].m_rx = maxxhx; compute_cvg_noflip(majorx, minorx, majorxint, minorxint, j, yh, yl); } if (spix == ldflag) { - m_rdp->GetSpans()[j].m_unscissored_rx = xend; + m_rdp->Spans[j].m_unscissored_rx = xend; xfrac = ((xright >> 8) & 0xff); - m_rdp->GetSpans()[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); - m_rdp->GetSpans()[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); - m_rdp->GetSpans()[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); - m_rdp->GetSpans()[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); - m_rdp->GetSpans()[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); + m_rdp->Spans[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); + m_rdp->Spans[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); + m_rdp->Spans[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); + m_rdp->Spans[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); + m_rdp->Spans[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; + m_rdp->Spans[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; + m_rdp->Spans[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; + m_rdp->Spans[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); } } @@ -2325,7 +2316,7 @@ void N64::RDP::Processor::CmdTexRect(UINT32 w1, UINT32 w2) dsdx = SIGN16(dsdx); dtdy = SIGN16(dtdy); - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2385,7 +2376,7 @@ void N64::RDP::Processor::CmdTexRectFlip(UINT32 w1, UINT32 w2) dsdx = SIGN16(dsdx); dtdy = SIGN16(dtdy); - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2447,18 +2438,18 @@ void N64::RDP::Processor::CmdSyncFull(UINT32 w1, UINT32 w2) void N64::RDP::Processor::CmdSetKeyGB(UINT32 w1, UINT32 w2) { - m_key_scale.i.b = w2 & 0xff; - m_key_scale.i.g = (w2 >> 16) & 0xff; + KeyScale.i.b = w2 & 0xff; + KeyScale.i.g = (w2 >> 16) & 0xff; } void N64::RDP::Processor::CmdSetKeyR(UINT32 w1, UINT32 w2) { - m_key_scale.i.r = w2 & 0xff; + KeyScale.i.r = w2 & 0xff; } void N64::RDP::Processor::CmdSetFillColor32(UINT32 w1, UINT32 w2) { - m_fill_color = w2; + FillColor = w2; } void N64::RDP::Processor::CmdSetConvert(UINT32 w1, UINT32 w2) @@ -2490,55 +2481,55 @@ void N64::RDP::Processor::CmdSetScissor(UINT32 w1, UINT32 w2) void N64::RDP::Processor::CmdSetPrimDepth(UINT32 w1, UINT32 w2) { - m_misc_state.m_primitive_z = (UINT16)(w2 >> 16) & 0x7fff; - m_misc_state.m_primitive_delta_z = (UINT16)(w1); + MiscState.PrimitiveZ = (UINT16)(w2 >> 16) & 0x7fff; + MiscState.PrimitiveDZ = (UINT16)(w1); } void N64::RDP::Processor::CmdSetOtherModes(UINT32 w1, UINT32 w2) { - m_other_modes.cycle_type = (w1 >> 20) & 0x3; // 01 - m_other_modes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; // 1 - m_other_modes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; // 0 - m_other_modes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; // 0 - m_other_modes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; // 0 - m_other_modes.en_tlut = (w1 & 0x08000) ? 1 : 0; // 0 - m_other_modes.tlut_type = (w1 & 0x04000) ? 1 : 0; // 0 - m_other_modes.sample_type = (w1 & 0x02000) ? 1 : 0; // 1 - m_other_modes.mid_texel = (w1 & 0x01000) ? 1 : 0; // 0 - m_other_modes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; // 1 - m_other_modes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; // 1 - m_other_modes.convert_one = (w1 & 0x00200) ? 1 : 0; // 0 - m_other_modes.key_en = (w1 & 0x00100) ? 1 : 0; // 0 - m_other_modes.rgb_dither_sel = (w1 >> 6) & 0x3; // 00 - m_other_modes.alpha_dither_sel = (w1 >> 4) & 0x3; // 01 - m_other_modes.blend_m1a_0 = (w2 >> 30) & 0x3; // 11 - m_other_modes.blend_m1a_1 = (w2 >> 28) & 0x3; // 00 - m_other_modes.blend_m1b_0 = (w2 >> 26) & 0x3; // 10 - m_other_modes.blend_m1b_1 = (w2 >> 24) & 0x3; // 00 - m_other_modes.blend_m2a_0 = (w2 >> 22) & 0x3; // 00 - m_other_modes.blend_m2a_1 = (w2 >> 20) & 0x3; // 01 - m_other_modes.blend_m2b_0 = (w2 >> 18) & 0x3; // 00 - m_other_modes.blend_m2b_1 = (w2 >> 16) & 0x3; // 01 - m_other_modes.force_blend = (w2 >> 14) & 1; // 0 - m_other_modes.alpha_cvg_select = (w2 >> 13) & 1; // 1 - m_other_modes.cvg_times_alpha = (w2 >> 12) & 1; // 0 - m_other_modes.z_mode = (w2 >> 10) & 0x3; // 00 - m_other_modes.cvg_dest = (w2 >> 8) & 0x3; // 00 - m_other_modes.color_on_cvg = (w2 >> 7) & 1; // 0 - m_other_modes.image_read_en = (w2 >> 6) & 1; // 1 - m_other_modes.z_update_en = (w2 >> 5) & 1; // 1 - m_other_modes.z_compare_en = (w2 >> 4) & 1; // 1 - m_other_modes.antialias_en = (w2 >> 3) & 1; // 1 - m_other_modes.z_source_sel = (w2 >> 2) & 1; // 0 - m_other_modes.dither_alpha_en = (w2 >> 1) & 1; // 0 - m_other_modes.alpha_compare_en = (w2) & 1; // 0 + OtherModes.cycle_type = (w1 >> 20) & 0x3; // 01 + OtherModes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; // 1 + OtherModes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; // 0 + OtherModes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; // 0 + OtherModes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; // 0 + OtherModes.en_tlut = (w1 & 0x08000) ? 1 : 0; // 0 + OtherModes.tlut_type = (w1 & 0x04000) ? 1 : 0; // 0 + OtherModes.sample_type = (w1 & 0x02000) ? 1 : 0; // 1 + OtherModes.mid_texel = (w1 & 0x01000) ? 1 : 0; // 0 + OtherModes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; // 1 + OtherModes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; // 1 + OtherModes.convert_one = (w1 & 0x00200) ? 1 : 0; // 0 + OtherModes.key_en = (w1 & 0x00100) ? 1 : 0; // 0 + OtherModes.rgb_dither_sel = (w1 >> 6) & 0x3; // 00 + OtherModes.alpha_dither_sel = (w1 >> 4) & 0x3; // 01 + OtherModes.blend_m1a_0 = (w2 >> 30) & 0x3; // 11 + OtherModes.blend_m1a_1 = (w2 >> 28) & 0x3; // 00 + OtherModes.blend_m1b_0 = (w2 >> 26) & 0x3; // 10 + OtherModes.blend_m1b_1 = (w2 >> 24) & 0x3; // 00 + OtherModes.blend_m2a_0 = (w2 >> 22) & 0x3; // 00 + OtherModes.blend_m2a_1 = (w2 >> 20) & 0x3; // 01 + OtherModes.blend_m2b_0 = (w2 >> 18) & 0x3; // 00 + OtherModes.blend_m2b_1 = (w2 >> 16) & 0x3; // 01 + OtherModes.force_blend = (w2 >> 14) & 1; // 0 + OtherModes.alpha_cvg_select = (w2 >> 13) & 1; // 1 + OtherModes.cvg_times_alpha = (w2 >> 12) & 1; // 0 + OtherModes.z_mode = (w2 >> 10) & 0x3; // 00 + OtherModes.cvg_dest = (w2 >> 8) & 0x3; // 00 + OtherModes.color_on_cvg = (w2 >> 7) & 1; // 0 + OtherModes.image_read_en = (w2 >> 6) & 1; // 1 + OtherModes.z_update_en = (w2 >> 5) & 1; // 1 + OtherModes.z_compare_en = (w2 >> 4) & 1; // 1 + OtherModes.antialias_en = (w2 >> 3) & 1; // 1 + OtherModes.z_source_sel = (w2 >> 2) & 1; // 0 + OtherModes.dither_alpha_en = (w2 >> 1) & 1; // 0 + OtherModes.alpha_compare_en = (w2) & 1; // 0 // These should belong to the Blender class - SetBlenderInput(0, 0, &m_color_inputs.blender1a_r[0], &m_color_inputs.blender1a_g[0], &m_color_inputs.blender1a_b[0], &m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0); - SetBlenderInput(0, 1, &m_color_inputs.blender2a_r[0], &m_color_inputs.blender2a_g[0], &m_color_inputs.blender2a_b[0], &m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0); - SetBlenderInput(1, 0, &m_color_inputs.blender1a_r[1], &m_color_inputs.blender1a_g[1], &m_color_inputs.blender1a_b[1], &m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1); - SetBlenderInput(1, 1, &m_color_inputs.blender2a_r[1], &m_color_inputs.blender2a_g[1], &m_color_inputs.blender2a_b[1], &m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1); + SetBlenderInput(0, 0, &ColorInputs.blender1a_r[0], &ColorInputs.blender1a_g[0], &ColorInputs.blender1a_b[0], &ColorInputs.blender1b_a[0], OtherModes.blend_m1a_0, OtherModes.blend_m1b_0); + SetBlenderInput(0, 1, &ColorInputs.blender2a_r[0], &ColorInputs.blender2a_g[0], &ColorInputs.blender2a_b[0], &ColorInputs.blender2b_a[0], OtherModes.blend_m2a_0, OtherModes.blend_m2b_0); + SetBlenderInput(1, 0, &ColorInputs.blender1a_r[1], &ColorInputs.blender1a_g[1], &ColorInputs.blender1a_b[1], &ColorInputs.blender1b_a[1], OtherModes.blend_m1a_1, OtherModes.blend_m1b_1); + SetBlenderInput(1, 1, &ColorInputs.blender2a_r[1], &ColorInputs.blender2a_g[1], &ColorInputs.blender2a_b[1], &ColorInputs.blender2b_a[1], OtherModes.blend_m2a_1, OtherModes.blend_m2b_1); } void N64::RDP::Processor::CmdLoadTLUT(UINT32 w1, UINT32 w2) @@ -2559,7 +2550,7 @@ void N64::RDP::Processor::CmdLoadTLUT(UINT32 w1, UINT32 w2) int count = (sh >> 2) - (sl >> 2) + 1; count <<= 2; - switch (m_misc_state.m_ti_size) + switch (MiscState.TISize) { case PIXEL_SIZE_16BIT: { @@ -2567,7 +2558,7 @@ void N64::RDP::Processor::CmdLoadTLUT(UINT32 w1, UINT32 w2) { fatalerror("rdp_load_tlut: loading tlut into low half at %d qwords",tile[tilenum].tmem); } - UINT32 srcstart = (m_misc_state.m_ti_address + (tl >> 2) * (m_misc_state.m_ti_width << 1) + (sl >> 1)) >> 1; + UINT32 srcstart = (MiscState.TIAddress + (tl >> 2) * (MiscState.TIWidth << 1) + (sl >> 1)) >> 1; UINT16 *dst = GetTMEM16(); UINT32 dststart = tile[tilenum].tmem << 2; @@ -2585,7 +2576,7 @@ void N64::RDP::Processor::CmdLoadTLUT(UINT32 w1, UINT32 w2) } break; } - default: fatalerror("RDP: load_tlut: size = %d\n", m_misc_state.m_ti_size); + default: fatalerror("RDP: load_tlut: size = %d\n", MiscState.TISize); } } @@ -2619,7 +2610,7 @@ void N64::RDP::Processor::CmdLoadBlock(UINT32 w1, UINT32 w2) INT32 width = (sh - sl) + 1; - width = (width << m_misc_state.m_ti_size) >> 1; + width = (width << MiscState.TISize) >> 1; if (width & 7) { width = (width & ~7) + 8; @@ -2628,15 +2619,15 @@ void N64::RDP::Processor::CmdLoadBlock(UINT32 w1, UINT32 w2) UINT32 tb = tile[tilenum].tmem << 2; - int tiwinwords = m_misc_state.m_ti_width; + int tiwinwords = MiscState.TIWidth; UINT32 slinwords = sl; - tiwinwords = (tiwinwords << m_misc_state.m_ti_size) >> 2; - slinwords = (slinwords << m_misc_state.m_ti_size) >> 2; + tiwinwords = (tiwinwords << MiscState.TISize) >> 2; + slinwords = (slinwords << MiscState.TISize) >> 2; int ptr = 0, srcptr = 0; UINT16 first, sec; - UINT32 src = (m_misc_state.m_ti_address >> 1) + (tl * tiwinwords) + slinwords; + UINT32 src = (MiscState.TIAddress >> 1) + (tl * tiwinwords) + slinwords; if (dxt != 0) { @@ -2785,9 +2776,9 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) INT32 height = (th - tl) + 1; /* int topad; - if (m_misc_state.m_ti_size < 3) + if (MiscState.TISize < 3) { - topad = (width * m_misc_state.m_ti_size) & 0x7; + topad = (width * MiscState.TISize) & 0x7; } else { @@ -2795,20 +2786,20 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) } topad = 0; // ???? */ - switch (m_misc_state.m_ti_size) + switch (MiscState.TISize) { case PIXEL_SIZE_8BIT: { - UINT32 src = m_misc_state.m_ti_address; + UINT32 src = MiscState.TIAddress; UINT8 *tc = GetTMEM(); int tb = tile[tilenum].tmem << 3; for (int j = 0; j < height; j++) { int tline = tb + ((tile[tilenum].line << 3) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; - int xorval8 = ((j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR);//???????,??? ? Ziggy + int xorval8 = ((j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); for (int i = 0; i < width; i++) { tc[((tline + i) ^ xorval8) & 0xfff] = RREADADDR8(src + s + i); @@ -2818,7 +2809,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) } case PIXEL_SIZE_16BIT: { - UINT32 src = m_misc_state.m_ti_address >> 1; + UINT32 src = MiscState.TIAddress >> 1; UINT16 *tc = GetTMEM16(); UINT16 yuvword; @@ -2828,7 +2819,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) { int tb = tile[tilenum].tmem << 2; int tline = tb + ((tile[tilenum].line << 2) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval16 = (j & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR; for (int i = 0; i < width; i++) @@ -2844,7 +2835,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) { int tb = tile[tilenum].tmem << 3; int tline = tb + ((tile[tilenum].line << 3) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval8 = (j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR; for (int i = 0; i < width; i++) @@ -2860,7 +2851,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) } case PIXEL_SIZE_32BIT: { - UINT32 src = m_misc_state.m_ti_address >> 2; + UINT32 src = MiscState.TIAddress >> 2; UINT16 *tc16 = GetTMEM16(); int tb = (tile[tilenum].tmem << 2); @@ -2868,7 +2859,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) { int tline = tb + ((tile[tilenum].line << 2) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval32cur = (j & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR; for (int i = 0; i < width; i++) { @@ -2881,7 +2872,7 @@ void N64::RDP::Processor::CmdLoadTile(UINT32 w1, UINT32 w2) break; } - default: fatalerror("RDP: load_tile: size = %d\n", m_misc_state.m_ti_size); + default: fatalerror("RDP: load_tile: size = %d\n", MiscState.TISize); } } @@ -2903,6 +2894,20 @@ void N64::RDP::Processor::CmdSetTile(UINT32 w1, UINT32 w2) tex_tile->ms = (w2 >> 8) & 0x1; tex_tile->mask_s = (w2 >> 4) & 0xf; tex_tile->shift_s = (w2 >> 0) & 0xf; + + if (tex_tile->format == FORMAT_I && tex_tile->size > PIXEL_SIZE_8BIT) + { + tex_tile->format = FORMAT_RGBA; // Used by Supercross 2000 (in-game) + } + if (tex_tile->format == FORMAT_CI && tex_tile->size > PIXEL_SIZE_8BIT) + { + tex_tile->format = FORMAT_RGBA; // Used by Clay Fighter - Sculptor's Cut + } + + if (tex_tile->format == FORMAT_RGBA && tex_tile->size < PIXEL_SIZE_16BIT) + { + tex_tile->format = FORMAT_CI; // Used by Exterem-G2, Madden Football 64, and Rat Attack + } } void N64::RDP::Processor::CmdFillRect(UINT32 w1, UINT32 w2) @@ -2912,7 +2917,7 @@ void N64::RDP::Processor::CmdFillRect(UINT32 w1, UINT32 w2) UINT32 xh = (w2 >> 12) & 0xfff; UINT32 yh = (w2 >> 0) & 0xfff; - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2937,24 +2942,24 @@ void N64::RDP::Processor::CmdFillRect(UINT32 w1, UINT32 w2) void N64::RDP::Processor::CmdSetFogColor(UINT32 w1, UINT32 w2) { - m_fog_color.c = w2; + FogColor.c = w2; } void N64::RDP::Processor::CmdSetBlendColor(UINT32 w1, UINT32 w2) { - m_blend_color.c = w2; + BlendColor.c = w2; } void N64::RDP::Processor::CmdSetPrimColor(UINT32 w1, UINT32 w2) { - m_misc_state.m_min_level = (w1 >> 8) & 0x1f; - m_prim_lod_frac = w1 & 0xff; - m_prim_color.c = w2; + MiscState.MinLevel = (w1 >> 8) & 0x1f; + PrimLODFraction = w1 & 0xff; + PrimColor.c = w2; } void N64::RDP::Processor::CmdSetEnvColor(UINT32 w1, UINT32 w2) { - m_env_color.c = w2; + EnvColor.c = w2; } void N64::RDP::Processor::CmdSetCombine(UINT32 w1, UINT32 w2) @@ -2977,60 +2982,60 @@ void N64::RDP::Processor::CmdSetCombine(UINT32 w1, UINT32 w2) m_combine.sub_b_a1 = (w2 >> 3) & 0x7; m_combine.add_a1 = (w2 >> 0) & 0x7; - SetSubAInputRGB(&m_color_inputs.combiner_rgbsub_a_r[0], &m_color_inputs.combiner_rgbsub_a_g[0], &m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0); - SetSubBInputRGB(&m_color_inputs.combiner_rgbsub_b_r[0], &m_color_inputs.combiner_rgbsub_b_g[0], &m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0); - SetMulInputRGB(&m_color_inputs.combiner_rgbmul_r[0], &m_color_inputs.combiner_rgbmul_g[0], &m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0); - SetAddInputRGB(&m_color_inputs.combiner_rgbadd_r[0], &m_color_inputs.combiner_rgbadd_g[0], &m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0); - SetMulInputAlpha(&m_color_inputs.combiner_alphamul[0], m_combine.mul_a0); - SetSubInputAlpha(&m_color_inputs.combiner_alphaadd[0], m_combine.add_a0); + SetSubAInputRGB(&ColorInputs.combiner_rgbsub_a_r[0], &ColorInputs.combiner_rgbsub_a_g[0], &ColorInputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0); + SetSubBInputRGB(&ColorInputs.combiner_rgbsub_b_r[0], &ColorInputs.combiner_rgbsub_b_g[0], &ColorInputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0); + SetMulInputRGB(&ColorInputs.combiner_rgbmul_r[0], &ColorInputs.combiner_rgbmul_g[0], &ColorInputs.combiner_rgbmul_b[0], m_combine.mul_rgb0); + SetAddInputRGB(&ColorInputs.combiner_rgbadd_r[0], &ColorInputs.combiner_rgbadd_g[0], &ColorInputs.combiner_rgbadd_b[0], m_combine.add_rgb0); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_a[0], m_combine.sub_a_a0); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_b[0], m_combine.sub_b_a0); + SetMulInputAlpha(&ColorInputs.combiner_alphamul[0], m_combine.mul_a0); + SetSubInputAlpha(&ColorInputs.combiner_alphaadd[0], m_combine.add_a0); - SetSubAInputRGB(&m_color_inputs.combiner_rgbsub_a_r[1], &m_color_inputs.combiner_rgbsub_a_g[1], &m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1); - SetSubBInputRGB(&m_color_inputs.combiner_rgbsub_b_r[1], &m_color_inputs.combiner_rgbsub_b_g[1], &m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1); - SetMulInputRGB(&m_color_inputs.combiner_rgbmul_r[1], &m_color_inputs.combiner_rgbmul_g[1], &m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1); - SetAddInputRGB(&m_color_inputs.combiner_rgbadd_r[1], &m_color_inputs.combiner_rgbadd_g[1], &m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1); - SetMulInputAlpha(&m_color_inputs.combiner_alphamul[1], m_combine.mul_a1); - SetSubInputAlpha(&m_color_inputs.combiner_alphaadd[1], m_combine.add_a1); + SetSubAInputRGB(&ColorInputs.combiner_rgbsub_a_r[1], &ColorInputs.combiner_rgbsub_a_g[1], &ColorInputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1); + SetSubBInputRGB(&ColorInputs.combiner_rgbsub_b_r[1], &ColorInputs.combiner_rgbsub_b_g[1], &ColorInputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1); + SetMulInputRGB(&ColorInputs.combiner_rgbmul_r[1], &ColorInputs.combiner_rgbmul_g[1], &ColorInputs.combiner_rgbmul_b[1], m_combine.mul_rgb1); + SetAddInputRGB(&ColorInputs.combiner_rgbadd_r[1], &ColorInputs.combiner_rgbadd_g[1], &ColorInputs.combiner_rgbadd_b[1], m_combine.add_rgb1); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_a[1], m_combine.sub_a_a1); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_b[1], m_combine.sub_b_a1); + SetMulInputAlpha(&ColorInputs.combiner_alphamul[1], m_combine.mul_a1); + SetSubInputAlpha(&ColorInputs.combiner_alphaadd[1], m_combine.add_a1); } void N64::RDP::Processor::CmdSetTextureImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_ti_format = (w1 >> 21) & 0x7; - m_misc_state.m_ti_size = (w1 >> 19) & 0x3; - m_misc_state.m_ti_width = (w1 & 0x3ff) + 1; - m_misc_state.m_ti_address = w2 & 0x01ffffff; + MiscState.TIFormat = (w1 >> 21) & 0x7; + MiscState.TISize = (w1 >> 19) & 0x3; + MiscState.TIWidth = (w1 & 0x3ff) + 1; + MiscState.TIAddress = w2 & 0x01ffffff; } void N64::RDP::Processor::CmdSetMaskImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_zb_address = w2 & 0x01ffffff; + MiscState.ZBAddress = w2 & 0x01ffffff; } void N64::RDP::Processor::CmdSetColorImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_fb_format = (w1 >> 21) & 0x7; - m_misc_state.m_fb_size = (w1 >> 19) & 0x3; - m_misc_state.m_fb_width = (w1 & 0x3ff) + 1; - m_misc_state.m_fb_address = w2 & 0x01ffffff; + MiscState.FBFormat = (w1 >> 21) & 0x7; + MiscState.FBSize = (w1 >> 19) & 0x3; + MiscState.FBWidth = (w1 & 0x3ff) + 1; + MiscState.FBAddress = w2 & 0x01ffffff; - if (m_misc_state.m_fb_format && m_misc_state.m_fb_format != 2) // Jet Force Gemini sets the format to 4, Intensity. Protection? + if (MiscState.FBFormat && MiscState.FBFormat != 2) // Jet Force Gemini sets the format to 4, Intensity. Protection? { - if (m_misc_state.m_fb_size == 1) + if (MiscState.FBSize == 1) { - m_misc_state.m_fb_format = 2; + MiscState.FBFormat = 2; } else { - m_misc_state.m_fb_format = 0; + MiscState.FBFormat = 0; } } - if (m_misc_state.m_fb_format != 0) + if (MiscState.FBFormat != 0) { - m_misc_state.m_fb_format = 0; + MiscState.FBFormat = 0; } } @@ -3137,12 +3142,18 @@ void N64::RDP::Processor::ProcessList() { UINT32 length = m_end - m_current; + //printf("length %08x\n", length); + //printf("end %08x\n", m_end); + //printf("current %08x\n", m_current); + // load command data for(int i = 0; i < length; i += 4) { + //printf("%08x\n", m_current); m_cmd_data[m_cmd_ptr++] = ReadData((m_current & 0x1fffffff) + i); } + //printf("Queued\n"); m_current = m_end; UINT32 cmd = (m_cmd_data[0] >> 24) & 0x3f; @@ -3153,11 +3164,13 @@ void N64::RDP::Processor::ProcessList() // check if more data is needed if (cmd_length < rdp_command_length[cmd]) { + //printf("Early-out\n"); return; } while (m_cmd_cur < m_cmd_ptr) { + //printf("Command\n"); cmd = (m_cmd_data[m_cmd_cur] >> 24) & 0x3f; if (((m_cmd_ptr - m_cmd_cur) * 4) < rdp_command_length[cmd]) @@ -3235,6 +3248,7 @@ void N64::RDP::Processor::ProcessList() m_cmd_cur = 0; m_start = m_current = m_end; + //printf("Done RDP\n"); } } // namespace RDP @@ -3250,21 +3264,24 @@ VIDEO_START(n64) state->m_rdp.SetMachine(machine); state->m_rdp.InitInternalState(); - state->m_rdp.GetBlender()->SetOtherModes(state->m_rdp.GetOtherModes()); - state->m_rdp.GetBlender()->SetMiscState(state->m_rdp.GetMiscState()); - state->m_rdp.GetBlender()->SetMachine(machine); - state->m_rdp.GetBlender()->SetProcessor(&state->m_rdp); + state->m_rdp.Blender.SetMachine(machine); + state->m_rdp.Blender.SetProcessor(&state->m_rdp); - state->m_rdp.GetFramebuffer()->SetOtherModes(state->m_rdp.GetOtherModes()); - state->m_rdp.GetFramebuffer()->SetMiscState(state->m_rdp.GetMiscState()); - state->m_rdp.GetFramebuffer()->SetProcessor(&state->m_rdp); + state->m_rdp.Framebuffer.SetProcessor(&state->m_rdp); - state->m_rdp.GetTexPipe()->SetMachine(machine); + state->m_rdp.TexPipe.SetMachine(machine); if (LOG_RDP_EXECUTION) { rdp_exec = fopen("rdp_execute.txt", "wt"); } + + printf("A"); + for (int i = 0; i < 4096; i++) + { + state->m_rdp.Spans[i].SetMachine(machine); + } + printf("B"); } SCREEN_UPDATE_RGB32(n64) @@ -3272,9 +3289,9 @@ SCREEN_UPDATE_RGB32(n64) _n64_state *state = screen.machine().driver_data<_n64_state>(); n64_periphs *n64 = screen.machine().device("rcp"); - int height = state->m_rdp.GetMiscState()->m_fb_height; + int height = state->m_rdp.MiscState.FBHeight; //UINT16 *frame_buffer = (UINT16*)&rdram[(n64->vi_origin & 0xffffff) >> 2]; - //UINT8 *cvg_buffer = &state->m_rdp.GetHiddenBits()[((n64->vi_origin & 0xffffff) >> 2) >> 1]; + //UINT8 *cvg_buffer = &state->m_rdp.HiddenBits[((n64->vi_origin & 0xffffff) >> 2) >> 1]; //int vibuffering = ((n64->vi_control & 2) && fsaa && divot); //vibuffering = 0; // Disabled for now @@ -3316,7 +3333,7 @@ SCREEN_UPDATE_RGB32(n64) for (int j = 0; j m_rdp.GetMiscState()->m_fb_width; i++) + for (int i = 0; i < state->m_rdp.MiscState.FBWidth; i++) { d[BYTE_XOR_BE(i)] = 0; } diff --git a/src/mame/video/n64.h b/src/mame/video/n64.h index 6c0ffe7979c..ce716640afc 100644 --- a/src/mame/video/n64.h +++ b/src/mame/video/n64.h @@ -49,9 +49,9 @@ #endif #define DWORD_XOR_DWORD_SWAP 1 -#define GET_LOW_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 1) & 0x1f]) -#define GET_MED_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 6) & 0x1f]) -#define GET_HI_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 11) & 0x1f]) +#define GET_LOW_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 1) & 0x1f]) +#define GET_MED_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 6) & 0x1f]) +#define GET_HI_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 11) & 0x1f]) #define MEM8_LIMIT 0x7fffff #define MEM16_LIMIT 0x3fffff @@ -69,8 +69,8 @@ #define GETMEDCOL(x) (((x) & 0x7c0) >> 3) #define GETHICOL(x) (((x) & 0xf800) >> 8) -#define HREADADDR8(in) (((in) <= MEM8_LIMIT) ? (m_rdp->GetHiddenBits()[(in) ^ BYTE_ADDR_XOR]) : 0) -#define HWRITEADDR8(in, val) {if ((in) <= MEM8_LIMIT) m_rdp->GetHiddenBits()[(in) ^ BYTE_ADDR_XOR] = val;} +#define HREADADDR8(in) (((in) <= MEM8_LIMIT) ? (m_rdp->HiddenBits[(in) ^ BYTE_ADDR_XOR]) : 0) +#define HWRITEADDR8(in, val) {if ((in) <= MEM8_LIMIT) m_rdp->HiddenBits[(in) ^ BYTE_ADDR_XOR] = val;} //sign-extension macros #define SIGN22(x) (((x) & 0x200000) ? ((x) | ~0x3fffff) : ((x) & 0x3fffff)) @@ -94,8 +94,8 @@ namespace RDP { class Processor; -class MiscState; -class OtherModes; +class MiscStateT; +class OtherModesT; class Color { @@ -138,48 +138,48 @@ class Tile int num; }; -class MiscState +class MiscStateT { public: - MiscState() + MiscStateT() { - m_curpixel_cvg = 0; - m_curpixel_memcvg = 0; - m_curpixel_cvbit = 0; - m_curpixel_overlap = 0; + CurrentPixCvg = 0; + CurrentMemCvg = 0; + CurrentCvgBit = 0; + CurrentPixOverlap = 0; - m_max_level = 0; - m_min_level = 0; + MaxLevel = 0; + MinLevel = 0; } - int m_fb_format; - int m_fb_size; - int m_fb_width; - int m_fb_height; - UINT32 m_fb_address; + int FBFormat; // Framebuffer pixel format index (0 - I, 1 - IA, 2 - CI, 3 - RGBA) + int FBSize; // Framebuffer pixel size index (0 - 4bpp, 1 - 8bpp, 2 - 16bpp, 3 - 32bpp) + int FBWidth; // Framebuffer width, in pixels + int FBHeight; // Framebuffer height, in scanlines + UINT32 FBAddress; // Framebuffer source address offset (in bytes) from start of RDRAM - UINT32 m_zb_address; + UINT32 ZBAddress; // Z-buffer source address offset (in bytes) from start of RDRAM - int m_ti_format; - int m_ti_size; - int m_ti_width; - UINT32 m_ti_address; + int TIFormat; // Format for Texture Interface (TI) transfers + int TISize; // Size (in bytes) of TI transfers + int TIWidth; // Width (in pixels) of TI transfers + UINT32 TIAddress; // Destination address for TI transfers - UINT32 m_curpixel_cvg; - UINT32 m_curpixel_memcvg; - UINT32 m_curpixel_cvbit; - UINT32 m_curpixel_overlap; + UINT32 CurrentPixCvg; // Coverage for the current pixel + UINT32 CurrentMemCvg; // Incoming coverage, in memory, for the current pixel + UINT32 CurrentCvgBit; // Bitfield representation of current coverage value + UINT32 CurrentPixOverlap; // Current overlap value, in coverage indices, for the current pixel - UINT8 m_random_seed; + UINT8 RandomSeed; // %HACK%, adds 19 each time it's read and is more or less random - int m_special_bsel0; - int m_special_bsel1; + int SpecialBlendSelect0; // Special blend-mode select for cycle 0 + int SpecialBlendSelect1; // Special blend-mode select for cycle 1 - UINT32 m_max_level; - UINT32 m_min_level; + UINT32 MaxLevel; // Maximum LOD level for texture filtering + UINT32 MinLevel; // Minimum LOD level for texture filtering - UINT16 m_primitive_z; - UINT16 m_primitive_delta_z; + UINT16 PrimitiveZ; // Forced Z value for current primitive, if applicable + UINT16 PrimitiveDZ; // Forced Delta-Z value for current primitive, if applicable }; class CombineModes @@ -204,7 +204,7 @@ class CombineModes int add_a1; }; -class OtherModes +class OtherModesT { public: int cycle_type; @@ -246,7 +246,7 @@ class OtherModes bool alpha_compare_en; }; -class ColorInputs +class ColorInputsT { public: // combiner inputs @@ -305,35 +305,35 @@ class Processor m_tiles[i].num = i; } - m_one_color.c = 0xffffffff; - m_zero_color.c = 0x00000000; + OneColor.c = 0xffffffff; + ZeroColor.c = 0x00000000; - m_color_inputs.combiner_rgbsub_a_r[0] = m_color_inputs.combiner_rgbsub_a_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbsub_a_g[0] = m_color_inputs.combiner_rgbsub_a_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbsub_a_b[0] = m_color_inputs.combiner_rgbsub_a_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbsub_b_r[0] = m_color_inputs.combiner_rgbsub_b_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbsub_b_g[0] = m_color_inputs.combiner_rgbsub_b_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbsub_b_b[0] = m_color_inputs.combiner_rgbsub_b_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbmul_r[0] = m_color_inputs.combiner_rgbmul_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbmul_g[0] = m_color_inputs.combiner_rgbmul_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbmul_b[0] = m_color_inputs.combiner_rgbmul_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbadd_r[0] = m_color_inputs.combiner_rgbadd_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbadd_g[0] = m_color_inputs.combiner_rgbadd_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbadd_b[0] = m_color_inputs.combiner_rgbadd_b[1] = &m_one_color.i.b; + ColorInputs.combiner_rgbsub_a_r[0] = ColorInputs.combiner_rgbsub_a_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbsub_a_g[0] = ColorInputs.combiner_rgbsub_a_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbsub_a_b[0] = ColorInputs.combiner_rgbsub_a_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbsub_b_r[0] = ColorInputs.combiner_rgbsub_b_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbsub_b_g[0] = ColorInputs.combiner_rgbsub_b_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbsub_b_b[0] = ColorInputs.combiner_rgbsub_b_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbmul_r[0] = ColorInputs.combiner_rgbmul_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbmul_g[0] = ColorInputs.combiner_rgbmul_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbmul_b[0] = ColorInputs.combiner_rgbmul_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbadd_r[0] = ColorInputs.combiner_rgbadd_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbadd_g[0] = ColorInputs.combiner_rgbadd_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbadd_b[0] = ColorInputs.combiner_rgbadd_b[1] = &OneColor.i.b; - m_color_inputs.combiner_alphasub_a[0] = m_color_inputs.combiner_alphasub_a[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphasub_b[0] = m_color_inputs.combiner_alphasub_b[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphamul[0] = m_color_inputs.combiner_alphamul[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphaadd[0] = m_color_inputs.combiner_alphaadd[1] = &m_one_color.i.a; + ColorInputs.combiner_alphasub_a[0] = ColorInputs.combiner_alphasub_a[1] = &OneColor.i.a; + ColorInputs.combiner_alphasub_b[0] = ColorInputs.combiner_alphasub_b[1] = &OneColor.i.a; + ColorInputs.combiner_alphamul[0] = ColorInputs.combiner_alphamul[1] = &OneColor.i.a; + ColorInputs.combiner_alphaadd[0] = ColorInputs.combiner_alphaadd[1] = &OneColor.i.a; - m_color_inputs.blender1a_r[0] = m_color_inputs.blender1a_r[1] = &m_pixel_color.i.r; - m_color_inputs.blender1a_g[0] = m_color_inputs.blender1a_g[1] = &m_pixel_color.i.r; - m_color_inputs.blender1a_b[0] = m_color_inputs.blender1a_b[1] = &m_pixel_color.i.r; - m_color_inputs.blender1b_a[0] = m_color_inputs.blender1b_a[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_r[0] = m_color_inputs.blender2a_r[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_g[0] = m_color_inputs.blender2a_g[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_b[0] = m_color_inputs.blender2a_b[1] = &m_pixel_color.i.r; - m_color_inputs.blender2b_a[0] = m_color_inputs.blender2b_a[1] = &m_pixel_color.i.r; + ColorInputs.blender1a_r[0] = ColorInputs.blender1a_r[1] = &PixelColor.i.r; + ColorInputs.blender1a_g[0] = ColorInputs.blender1a_g[1] = &PixelColor.i.r; + ColorInputs.blender1a_b[0] = ColorInputs.blender1a_b[1] = &PixelColor.i.r; + ColorInputs.blender1b_a[0] = ColorInputs.blender1b_a[1] = &PixelColor.i.r; + ColorInputs.blender2a_r[0] = ColorInputs.blender2a_r[1] = &PixelColor.i.r; + ColorInputs.blender2a_g[0] = ColorInputs.blender2a_g[1] = &PixelColor.i.r; + ColorInputs.blender2a_b[0] = ColorInputs.blender2a_b[1] = &PixelColor.i.r; + ColorInputs.blender2b_a[0] = ColorInputs.blender2b_a[1] = &PixelColor.i.r; m_tmem = NULL; @@ -341,8 +341,8 @@ class Processor //memset(m_hidden_bits, 3, 8388608); - m_prim_lod_frac = 0; - m_lod_frac = 0; + PrimLODFraction = 0; + LODFraction = 0; for (int i = 0; i < 256; i++) { @@ -386,14 +386,12 @@ class Processor for(int i = 0; i < 32; i++) { - m_replicated_rgba[i] = (i << 3) | ((i >> 2) & 7); + ReplicatedRGBA[i] = (i << 3) | ((i >> 2) & 7); } } ~Processor() { } - UINT8* ReplicatedRGBA() { return m_replicated_rgba; } - void Dasm(char *buffer); void ProcessList(); @@ -454,71 +452,8 @@ class Processor void SetStatusReg(UINT32 val) { m_status = val; } UINT32 GetStatusReg() const { return m_status; } - // Functional blocks - Blender* GetBlender() { return &m_blender; } - Framebuffer* GetFramebuffer() { return &m_framebuffer; } - TexturePipe* GetTexPipe() { return &m_tex_pipe; } - // Internal state - OtherModes* GetOtherModes() { return &m_other_modes; } - ColorInputs* GetColorInputs() { return &m_color_inputs; } CombineModes* GetCombine() { return &m_combine; } - MiscState* GetMiscState() { return &m_misc_state; } - - // Color constants - Color* GetBlendColor() { return &m_blend_color; } - void SetBlendColor(UINT32 color) { m_blend_color.c = color; } - - Color* GetPixelColor() { return &m_pixel_color; } - void SetPixelColor(UINT32 color) { m_pixel_color.c = color; } - - Color* GetInvPixelColor() { return &m_inv_pixel_color; } - void SetInvPixelColor(UINT32 color) { m_inv_pixel_color.c = color; } - - Color* GetBlendedColor() { return &m_blended_pixel_color; } - void SetBlendedColor(UINT32 color) { m_blended_pixel_color.c = color; } - - Color* GetMemoryColor() { return &m_memory_color; } - void SetMemoryColor(UINT32 color) { m_memory_color.c = color; } - - Color* GetPrimColor() { return &m_prim_color; } - void SetPrimColor(UINT32 color) { m_prim_color.c = color; } - - Color* GetEnvColor() { return &m_env_color; } - void SetEnvColor(UINT32 color) { m_env_color.c = color; } - - Color* GetFogColor() { return &m_fog_color; } - void SetFogColor(UINT32 color) { m_fog_color.c = color; } - - Color* GetCombinedColor() { return &m_combined_color; } - void SetCombinedColor(UINT32 color) { m_combined_color.c = color; } - - Color* GetTexel0Color() { return &m_texel0_color; } - void SetTexel0Color(UINT32 color) { m_texel0_color.c = color; } - - Color* GetTexel1Color() { return &m_texel1_color; } - void SetTexel1Color(UINT32 color) { m_texel1_color.c = color; } - - Color* GetNextTexelColor() { return &m_next_texel_color; } - void SetNextTexelColor(UINT32 color) { m_next_texel_color.c = color; } - - Color* GetShadeColor() { return &m_shade_color; } - void SetShadeColor(UINT32 color) { m_shade_color.c = color; } - - Color* GetKeyScale() { return &m_key_scale; } - void SetKeyScale(UINT32 scale) { m_key_scale.c = scale; } - - Color* GetNoiseColor() { return &m_noise_color; } - void SetNoiseColor(UINT32 color) { m_noise_color.c = color; } - - Color* GetOne() { return &m_one_color; } - Color* GetZero() { return &m_zero_color; } - - UINT8 GetLODFrac() { return m_lod_frac; } - void SetLODFrac(UINT8 lod_frac) { m_lod_frac = lod_frac; } - - UINT8 GetPrimLODFrac() { return m_prim_lod_frac; } - void SetPrimLODFrac(UINT8 prim_lod_frac) { m_prim_lod_frac = prim_lod_frac; } // Color Combiner INT32 ColorCombinerEquation(INT32 a, INT32 b, INT32 c, INT32 d); @@ -540,7 +475,7 @@ class Processor Tile* GetTiles(){ return m_tiles; } // Emulation Accelerators - UINT8 GetRandom() { return m_misc_state.m_random_seed += 0x13; } + UINT8 GetRandom() { return MiscState.RandomSeed += 0x13; } // YUV Factors void SetYUVFactors(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; } @@ -560,13 +495,10 @@ class Processor void TCDivNoPersp(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst); UINT32 GetLog2(UINT32 lod_clamp); void RenderSpans(int start, int end, int tilenum, bool flip); - UINT8* GetHiddenBits() { return m_hidden_bits; } void GetAlphaCvg(UINT8 *comb_alpha); const UINT8* GetBayerMatrix() const { return s_bayer_matrix; } const UINT8* GetMagicMatrix() const { return s_magic_matrix; } - Span* GetSpans() { return m_span; } int GetCurrFIFOIndex() const { return m_cmd_cur; } - UINT32 GetFillColor32() const { return m_fill_color; } void ZStore(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 z); UINT32 ZDecompress(UINT32 zcurpixel); @@ -648,40 +580,51 @@ class Processor UINT16 decompress_cvmask_frombyte(UINT8 x); void lookup_cvmask_derivatives(UINT32 mask, UINT8* offx, UINT8* offy); + MiscStateT MiscState; + + // Color constants + Color MemoryColor; + Color PixelColor; + Color InvPixelColor; + Color BlendedPixelColor; + Color BlendColor; + + Color PrimColor; + Color EnvColor; + Color FogColor; + Color CombinedColor; + Color Texel0Color; + Color Texel1Color; + Color NextTexelColor; + Color ShadeColor; + Color KeyScale; + Color NoiseColor; + + Color OneColor; + Color ZeroColor; + + UINT8 LODFraction; + UINT8 PrimLODFraction; + + UINT32 FillColor; + + OtherModesT OtherModes; + ColorInputsT ColorInputs; + + BlenderT Blender; + + Span Spans[4096]; + + FramebufferT Framebuffer; + TexturePipeT TexPipe; + + UINT8 HiddenBits[0x800000]; + + UINT8 ReplicatedRGBA[32]; + protected: - Blender m_blender; - Framebuffer m_framebuffer; - TexturePipe m_tex_pipe; - - OtherModes m_other_modes; - MiscState m_misc_state; - ColorInputs m_color_inputs; CombineModes m_combine; - Color m_pixel_color; - Color m_inv_pixel_color; - Color m_blended_pixel_color; - Color m_memory_color; - Color m_blend_color; - - Color m_prim_color; - Color m_env_color; - Color m_fog_color; - Color m_combined_color; - Color m_texel0_color; - Color m_texel1_color; - Color m_next_texel_color; - Color m_shade_color; - Color m_key_scale; - Color m_noise_color; - UINT8 m_lod_frac; - UINT8 m_prim_lod_frac; - - Color m_one_color; - Color m_zero_color; - - UINT32 m_fill_color; - typedef struct { UINT8 cvg; @@ -727,10 +670,6 @@ class Processor INT32 m_norm_point_rom[64]; INT32 m_norm_slope_rom[64]; - UINT8 m_hidden_bits[0x800000]; - - Span m_span[4096]; - static const UINT8 s_bayer_matrix[16]; static const UINT8 s_magic_matrix[16]; @@ -739,8 +678,6 @@ class Processor UINT32 m_special_9bit_clamptable[512]; - UINT8 m_replicated_rgba[32]; - INT32 m_dzpix_enc; INT32 m_dz_enc; diff --git a/src/mame/video/rdpblend.c b/src/mame/video/rdpblend.c index 46f73d39b79..0c6a174552b 100644 --- a/src/mame/video/rdpblend.c +++ b/src/mame/video/rdpblend.c @@ -8,95 +8,94 @@ namespace N64 namespace RDP { -bool Blender::Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel) +bool BlenderT::Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel) { - ColorInputs* ci = m_rdp->GetColorInputs(); INT32 r, g, b; - if (!m_other_modes->alpha_cvg_select) + if (!m_rdp->OtherModes.alpha_cvg_select) { - DitherA(&m_rdp->GetPixelColor()->i.a, adseed); + DitherA(&m_rdp->PixelColor.i.a, adseed); } - DitherA(&m_rdp->GetShadeColor()->i.a, adseed); + DitherA(&m_rdp->ShadeColor.i.a, adseed); - if (!AlphaCompare(m_rdp->GetPixelColor()->i.a)) + if (!AlphaCompare(m_rdp->PixelColor.i.a)) { return false; } - if (m_other_modes->antialias_en ? (!m_misc_state->m_curpixel_cvg) : (!m_misc_state->m_curpixel_cvbit)) + if (m_rdp->OtherModes.antialias_en ? (!m_rdp->MiscState.CurrentPixCvg) : (!m_rdp->MiscState.CurrentCvgBit)) { return false; } - bool dontblend = (partialreject && m_rdp->GetPixelColor()->i.a >= 0xff); - if (!m_blend_enable || dontblend) + bool dontblend = (partialreject && m_rdp->PixelColor.i.a >= 0xff); + if (!BlendEnable || dontblend) { - r = *ci->blender1a_r[0]; - g = *ci->blender1a_g[0]; - b = *ci->blender1a_b[0]; + r = *m_rdp->ColorInputs.blender1a_r[0]; + g = *m_rdp->ColorInputs.blender1a_g[0]; + b = *m_rdp->ColorInputs.blender1a_b[0]; } else { - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[0]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[0]; BlendEquationCycle0(&r, &g, &b, special_bsel); } - if (m_other_modes->rgb_dither_sel < 3) + if (m_rdp->OtherModes.rgb_dither_sel < 3) { DitherRGB(&r, &g, &b, dith); } *fr = r; *fg = g; *fb = b; + return true; } -bool Blender::Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel0, int special_bsel1) +bool BlenderT::Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel0, int special_bsel1) { - ColorInputs* ci = m_rdp->GetColorInputs(); - if (!m_other_modes->alpha_cvg_select) + if (!m_rdp->OtherModes.alpha_cvg_select) { - DitherA(&m_rdp->GetPixelColor()->i.a, adseed); + DitherA(&m_rdp->PixelColor.i.a, adseed); } - DitherA(&m_rdp->GetShadeColor()->i.a, adseed); + DitherA(&m_rdp->ShadeColor.i.a, adseed); - if (!AlphaCompare(m_rdp->GetPixelColor()->i.a)) + if (!AlphaCompare(m_rdp->PixelColor.i.a)) { return false; } - if (m_other_modes->antialias_en ? (!m_misc_state->m_curpixel_cvg) : (!m_misc_state->m_curpixel_cvbit)) + if (m_rdp->OtherModes.antialias_en ? (!m_rdp->MiscState.CurrentPixCvg) : (!m_rdp->MiscState.CurrentCvgBit)) { return false; } - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[0]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[0]; INT32 r, g, b; BlendEquationCycle0(&r, &g, &b, special_bsel0); - m_rdp->GetBlendedColor()->i.r = r; - m_rdp->GetBlendedColor()->i.g = g; - m_rdp->GetBlendedColor()->i.b = b; - m_rdp->GetBlendedColor()->i.a = m_rdp->GetPixelColor()->i.a; + m_rdp->BlendedPixelColor.i.r = r; + m_rdp->BlendedPixelColor.i.g = g; + m_rdp->BlendedPixelColor.i.b = b; + m_rdp->BlendedPixelColor.i.a = m_rdp->PixelColor.i.a; - bool dontblend = (partialreject && m_rdp->GetPixelColor()->i.a >= 0xff); - if (!m_blend_enable || dontblend) + bool dontblend = (partialreject && m_rdp->PixelColor.i.a >= 0xff); + if (!BlendEnable || dontblend) { - r = *ci->blender1a_r[1]; - g = *ci->blender1a_g[1]; - b = *ci->blender1a_b[1]; + r = *m_rdp->ColorInputs.blender1a_r[1]; + g = *m_rdp->ColorInputs.blender1a_g[1]; + b = *m_rdp->ColorInputs.blender1a_b[1]; } else { - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[1]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[1]; BlendEquationCycle1(&r, &g, &b, special_bsel1); } - if (m_other_modes->rgb_dither_sel < 3) + if (m_rdp->OtherModes.rgb_dither_sel < 3) { DitherRGB(&r, &g, &b, dith); } @@ -108,47 +107,46 @@ bool Blender::Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adse return true; } -void Blender::BlendEquationCycle0(int* r, int* g, int* b, int bsel_special) +void BlenderT::BlendEquationCycle0(int* r, int* g, int* b, int bsel_special) { - ColorInputs* ci = m_rdp->GetColorInputs(); - UINT8 blend1a = *ci->blender1b_a[0] >> 3; - UINT8 blend2a = *ci->blender2b_a[0] >> 3; + UINT8 blend1a = *m_rdp->ColorInputs.blender1b_a[0] >> 3; + UINT8 blend2a = *m_rdp->ColorInputs.blender2b_a[0] >> 3; if (bsel_special) { - blend1a = (blend1a >> m_shift_a) & 0x1C; - blend2a = (blend2a >> m_shift_b) & 0x1C; + blend1a = (blend1a >> ShiftA) & 0x1C; + blend2a = (blend2a >> ShiftB) & 0x1C; } UINT32 sum = ((blend1a >> 2) + (blend2a >> 2) + 1) & 0xf; - *r = (((int)(*ci->blender1a_r[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_r[0]) * (int)(blend2a))); + *r = (((int)(*m_rdp->ColorInputs.blender1a_r[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_r[0]) * (int)(blend2a))); - *g = (((int)(*ci->blender1a_g[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_g[0]) * (int)(blend2a))); + *g = (((int)(*m_rdp->ColorInputs.blender1a_g[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_g[0]) * (int)(blend2a))); - *b = (((int)(*ci->blender1a_b[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_b[0]) * (int)(blend2a))); + *b = (((int)(*m_rdp->ColorInputs.blender1a_b[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_b[0]) * (int)(blend2a))); if (bsel_special) { - *r += (((int)*ci->blender2a_r[0]) << 2); - *g += (((int)*ci->blender2a_g[0]) << 2); - *b += (((int)*ci->blender2a_b[0]) << 2); + *r += (((int)*m_rdp->ColorInputs.blender2a_r[0]) << 2); + *g += (((int)*m_rdp->ColorInputs.blender2a_g[0]) << 2); + *b += (((int)*m_rdp->ColorInputs.blender2a_b[0]) << 2); } else { - *r += (int)*ci->blender2a_r[0]; - *g += (int)*ci->blender2a_g[0]; - *b += (int)*ci->blender2a_b[0]; + *r += (int)*m_rdp->ColorInputs.blender2a_r[0]; + *g += (int)*m_rdp->ColorInputs.blender2a_g[0]; + *b += (int)*m_rdp->ColorInputs.blender2a_b[0]; } *r >>= 2; *g >>= 2; *b >>= 2; - if (m_other_modes->force_blend) + if (m_rdp->OtherModes.force_blend) { *r >>= 3; *g >>= 3; @@ -173,47 +171,46 @@ void Blender::BlendEquationCycle0(int* r, int* g, int* b, int bsel_special) if (*b > 255) *b = 255; } -void Blender::BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special) +void BlenderT::BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special) { - ColorInputs* ci = m_rdp->GetColorInputs(); - UINT8 blend1a = *ci->blender1b_a[1] >> 3; - UINT8 blend2a = *ci->blender2b_a[1] >> 3; + UINT8 blend1a = *m_rdp->ColorInputs.blender1b_a[1] >> 3; + UINT8 blend2a = *m_rdp->ColorInputs.blender2b_a[1] >> 3; if (bsel_special) { - blend1a = (blend1a >> m_shift_a) & 0x1C; - blend2a = (blend2a >> m_shift_b) & 0x1C; + blend1a = (blend1a >> ShiftA) & 0x1C; + blend2a = (blend2a >> ShiftB) & 0x1C; } UINT32 sum = ((blend1a >> 2) + (blend2a >> 2) + 1) & 0xf; - *r = (((int)(*ci->blender1a_r[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_r[1]) * (int)(blend2a))); + *r = (((int)(*m_rdp->ColorInputs.blender1a_r[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_r[1]) * (int)(blend2a))); - *g = (((int)(*ci->blender1a_g[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_g[1]) * (int)(blend2a))); + *g = (((int)(*m_rdp->ColorInputs.blender1a_g[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_g[1]) * (int)(blend2a))); - *b = (((int)(*ci->blender1a_b[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_b[1]) * (int)(blend2a))); + *b = (((int)(*m_rdp->ColorInputs.blender1a_b[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_b[1]) * (int)(blend2a))); if (bsel_special) { - *r += (((int)*ci->blender2a_r[1]) << 2); - *g += (((int)*ci->blender2a_g[1]) << 2); - *b += (((int)*ci->blender2a_b[1]) << 2); + *r += (((int)*m_rdp->ColorInputs.blender2a_r[1]) << 2); + *g += (((int)*m_rdp->ColorInputs.blender2a_g[1]) << 2); + *b += (((int)*m_rdp->ColorInputs.blender2a_b[1]) << 2); } else { - *r += (int)*ci->blender2a_r[1]; - *g += (int)*ci->blender2a_g[1]; - *b += (int)*ci->blender2a_b[1]; + *r += (int)*m_rdp->ColorInputs.blender2a_r[1]; + *g += (int)*m_rdp->ColorInputs.blender2a_g[1]; + *b += (int)*m_rdp->ColorInputs.blender2a_b[1]; } *r >>= 2; *g >>= 2; *b >>= 2; - if (m_other_modes->force_blend) + if (m_rdp->OtherModes.force_blend) { *r >>= 3; *g >>= 3; @@ -238,12 +235,12 @@ void Blender::BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special if (*b > 255) *b = 255; } -bool Blender::AlphaCompare(UINT8 alpha) +bool BlenderT::AlphaCompare(UINT8 alpha) { INT32 threshold; - if (m_other_modes->alpha_compare_en) + if (m_rdp->OtherModes.alpha_compare_en) { - threshold = (m_other_modes->dither_alpha_en) ? (machine().rand() & 0xff) : m_rdp->GetBlendColor()->i.a; + threshold = (m_rdp->OtherModes.dither_alpha_en) ? m_rdp->GetRandom() : m_rdp->BlendColor.i.a; if (alpha < threshold) { return false; @@ -253,7 +250,7 @@ bool Blender::AlphaCompare(UINT8 alpha) return true; } -void Blender::DitherA(UINT8 *a, int dith) +void BlenderT::DitherA(UINT8 *a, int dith) { INT32 new_a = *a + dith; if(new_a & 0x100) @@ -263,7 +260,7 @@ void Blender::DitherA(UINT8 *a, int dith) *a = (UINT8)new_a; } -void Blender::DitherRGB(INT32 *r, INT32 *g, INT32 *b, int dith) +void BlenderT::DitherRGB(INT32 *r, INT32 *g, INT32 *b, int dith) { if ((*r & 7) > dith) { diff --git a/src/mame/video/rdpblend.h b/src/mame/video/rdpblend.h index 778ea18e68f..1f36096e27d 100644 --- a/src/mame/video/rdpblend.h +++ b/src/mame/video/rdpblend.h @@ -9,45 +9,35 @@ namespace N64 namespace RDP { -class OtherModes; -class MiscState; +class OtherModesT; +class MiscStateT; class Processor; class Color; -class Blender +class BlenderT { public: - Blender() + BlenderT() { - m_blend_enable = false; + BlendEnable = false; } bool Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int bsel0, int bsel1); bool Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel); - void SetOtherModes(OtherModes* other_modes) { m_other_modes = other_modes; } - void SetMiscState(MiscState* misc_state) { m_misc_state = misc_state; } void SetMachine(running_machine& machine) { m_machine = &machine; } void SetProcessor(Processor* rdp) { m_rdp = rdp; } - void SetBlendEnable(bool enable) { m_blend_enable = enable; } - bool GetBlendEnable() { return m_blend_enable; } - - void SetShiftA(INT32 shift) { m_shift_a = shift; } - void SetShiftB(INT32 shift) { m_shift_b = shift; } - running_machine &machine() const { assert(m_machine != NULL); return *m_machine; } + bool BlendEnable; + INT32 ShiftA; + INT32 ShiftB; + private: running_machine* m_machine; - OtherModes* m_other_modes; - MiscState* m_misc_state; Processor* m_rdp; - bool m_blend_enable; - INT32 m_shift_a; - INT32 m_shift_b; - void BlendEquationCycle0(INT32* r, INT32* g, INT32* b, int bsel_special); void BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special); diff --git a/src/mame/video/rdpfb.c b/src/mame/video/rdpfb.c index e4b04d0adb7..6db69b99353 100644 --- a/src/mame/video/rdpfb.c +++ b/src/mame/video/rdpfb.c @@ -8,9 +8,9 @@ namespace N64 namespace RDP { -void Framebuffer::Write(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Write16Bit(curpixel, r, g, b); @@ -21,51 +21,51 @@ void Framebuffer::Write(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { #undef CVG_DRAW #ifdef CVG_DRAW - int covdraw = (curpixel_cvg - 1) << 5; + int covdraw = (CurrentPixCvg - 1) << 5; r = covdraw; g = covdraw; b = covdraw; #endif - UINT32 fb = (m_misc_state->m_fb_address >> 1) + curpixel; + UINT32 fb = (m_rdp->MiscState.FBAddress >> 1) + curpixel; UINT32 hb = fb; #if 0 - if (m_misc_state->m_curpixel_cvg > 8 && m_other_modes->z_mode != 1) + if (m_rdp->MiscState.CurrentPixCvg > 8 && m_rdp->OtherModes.z_mode != 1) { - stricterror("FBWRITE_16: curpixel_cvg %d", m_misc_state->m_curpixel_cvg); + stricterror("FBWRITE_16: CurrentPixCvg %d", m_rdp->MiscState.CurrentPixCvg); } #endif UINT16 finalcolor = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1); UINT32 finalcvg = 0; - if (m_other_modes->color_on_cvg && !m_pre_wrap) + if (m_rdp->OtherModes.color_on_cvg && !m_pre_wrap) { finalcolor = RREADIDX16(fb) & 0xfffe; } - switch(m_other_modes->cvg_dest) + switch(m_rdp->OtherModes.cvg_dest) { case 0: - if (!m_rdp->GetBlender()->GetBlendEnable()) + if (!m_rdp->Blender.BlendEnable) { - finalcvg = (m_misc_state->m_curpixel_cvg - 1) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg - 1) & 7; RWRITEIDX16(fb, finalcolor | ((finalcvg >> 2) & 1)); HWRITEADDR8(hb, finalcvg & 3); } else { - finalcvg = m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg; + finalcvg = m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg; if (finalcvg & 8) { finalcvg = 7; @@ -75,7 +75,7 @@ void Framebuffer::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) } break; case 1: - finalcvg = (m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg) & 7; RWRITEIDX16(fb, finalcolor | ((finalcvg >> 2) & 1)); HWRITEADDR8(hb, finalcvg & 3); break; @@ -84,42 +84,42 @@ void Framebuffer::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) HWRITEADDR8(hb, 3); break; case 3: - RWRITEIDX16(fb, finalcolor | ((m_misc_state->m_curpixel_memcvg >> 2) & 1)); - HWRITEADDR8(hb, m_misc_state->m_curpixel_memcvg & 3); + RWRITEIDX16(fb, finalcolor | ((m_rdp->MiscState.CurrentMemCvg >> 2) & 1)); + HWRITEADDR8(hb, m_rdp->MiscState.CurrentMemCvg & 3); break; } } -void Framebuffer::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT32 fb = (m_misc_state->m_fb_address >> 2) + curpixel; + UINT32 fb = (m_rdp->MiscState.FBAddress >> 2) + curpixel; UINT32 finalcolor = (r << 24) | (g << 16) | (b << 8);//cvg as 3 MSBs of alpha channel; UINT32 finalcvg = 0; #if 0 - if (curpixel_cvg > 8 && m_other_modes->z_mode != 1) + if (CurrentPixCvg > 8 && m_rdp->OtherModes.z_mode != 1) { - stricterror("FBWRITE_16: curpixel_cvg %d", curpixel_cvg); + stricterror("FBWRITE_16: CurrentPixCvg %d", CurrentPixCvg); } #endif - if (m_other_modes->color_on_cvg && !m_pre_wrap) + if (m_rdp->OtherModes.color_on_cvg && !m_pre_wrap) { finalcolor = RREADIDX32(fb) & 0xffffff00; } - switch(m_other_modes->cvg_dest) + switch(m_rdp->OtherModes.cvg_dest) { case 0: //normal - if (!m_rdp->GetBlender()->GetBlendEnable()) + if (!m_rdp->Blender.BlendEnable) { - finalcvg = (m_misc_state->m_curpixel_cvg - 1) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg - 1) & 7; finalcolor |= (finalcvg << 5); RWRITEIDX32(fb, finalcolor); } else { - finalcvg = m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg; + finalcvg = m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg; if (finalcvg & 8) { finalcvg = 7; @@ -129,7 +129,7 @@ void Framebuffer::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) } break; case 1: - finalcvg = (m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg) & 7; finalcolor |= (finalcvg << 5); RWRITEIDX32(fb, finalcolor); break; @@ -137,15 +137,15 @@ void Framebuffer::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) RWRITEIDX32(fb, finalcolor | 0xE0); break; case 3: - finalcolor |= (m_misc_state->m_curpixel_memcvg << 5); + finalcolor |= (m_rdp->MiscState.CurrentMemCvg << 5); RWRITEIDX32(fb, finalcolor); break; } } -void Framebuffer::Read(UINT32 curpixel) +void FramebufferT::Read(UINT32 curpixel) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Read16Bit(curpixel); @@ -156,51 +156,51 @@ void Framebuffer::Read(UINT32 curpixel) break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Read16Bit(UINT32 curpixel) +void FramebufferT::Read16Bit(UINT32 curpixel) { - UINT16 fword = RREADIDX16((m_misc_state->m_fb_address >> 1) + curpixel); - UINT8 hbyte = HREADADDR8((m_misc_state->m_fb_address >> 1) + curpixel); - m_rdp->GetMemoryColor()->i.r = GETHICOL(fword); - m_rdp->GetMemoryColor()->i.g = GETMEDCOL(fword); - m_rdp->GetMemoryColor()->i.b = GETLOWCOL(fword); - if (m_other_modes->image_read_en) + UINT16 fword = RREADIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel); + UINT8 hbyte = HREADADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel); + m_rdp->MemoryColor.i.r = GETHICOL(fword); + m_rdp->MemoryColor.i.g = GETMEDCOL(fword); + m_rdp->MemoryColor.i.b = GETLOWCOL(fword); + if (m_rdp->OtherModes.image_read_en) { - m_misc_state->m_curpixel_memcvg = ((fword & 1) << 2) | (hbyte & 3); - m_rdp->GetMemoryColor()->i.a = m_misc_state->m_curpixel_memcvg << 5; + m_rdp->MiscState.CurrentMemCvg = ((fword & 1) << 2) | (hbyte & 3); + m_rdp->MemoryColor.i.a = m_rdp->MiscState.CurrentMemCvg << 5; } else { - m_misc_state->m_curpixel_memcvg = 7; - m_rdp->GetMemoryColor()->i.a = 0xff; + m_rdp->MiscState.CurrentMemCvg = 7; + m_rdp->MemoryColor.i.a = 0xff; } } -void Framebuffer::Read32Bit(UINT32 curpixel) +void FramebufferT::Read32Bit(UINT32 curpixel) { - UINT32 mem = RREADIDX32((m_misc_state->m_fb_address >> 2) + curpixel); - m_rdp->GetMemoryColor()->i.r = (mem >> 24) & 0xff; - m_rdp->GetMemoryColor()->i.g = (mem >> 16) & 0xff; - m_rdp->GetMemoryColor()->i.b = (mem >> 8) & 0xff; - if (m_other_modes->image_read_en) + UINT32 mem = RREADIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel); + m_rdp->MemoryColor.i.r = (mem >> 24) & 0xff; + m_rdp->MemoryColor.i.g = (mem >> 16) & 0xff; + m_rdp->MemoryColor.i.b = (mem >> 8) & 0xff; + if (m_rdp->OtherModes.image_read_en) { - m_misc_state->m_curpixel_memcvg = (mem >> 5) & 7; - m_rdp->GetMemoryColor()->i.a = (mem) & 0xff; + m_rdp->MiscState.CurrentMemCvg = (mem >> 5) & 7; + m_rdp->MemoryColor.i.a = (mem) & 0xff; } else { - m_misc_state->m_curpixel_memcvg = 7; - m_rdp->GetMemoryColor()->i.a = 0xff; + m_rdp->MiscState.CurrentMemCvg = 7; + m_rdp->MemoryColor.i.a = 0xff; } } -void Framebuffer::Copy(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Copy16Bit(curpixel, r, g, b); @@ -211,27 +211,27 @@ void Framebuffer::Copy(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Copy16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT16 val = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((m_misc_state->m_curpixel_cvg >> 2) & 1); - RWRITEIDX16((m_misc_state->m_fb_address >> 1) + curpixel, val); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + curpixel, m_misc_state->m_curpixel_cvg & 3); + UINT16 val = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((m_rdp->MiscState.CurrentPixCvg >> 2) & 1); + RWRITEIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel, val); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel, m_rdp->MiscState.CurrentPixCvg & 3); } -void Framebuffer::Copy32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT32 val = (r << 24) | (g << 16) | (b << 8) | (m_misc_state->m_curpixel_cvg << 5); - RWRITEIDX32((m_misc_state->m_fb_address >> 2) + curpixel, val); + UINT32 val = (r << 24) | (g << 16) | (b << 8) | (m_rdp->MiscState.CurrentPixCvg << 5); + RWRITEIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel, val); } -void Framebuffer::Fill(UINT32 curpixel) +void FramebufferT::Fill(UINT32 curpixel) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Fill16Bit(curpixel); @@ -242,32 +242,32 @@ void Framebuffer::Fill(UINT32 curpixel) break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Fill16Bit(UINT32 curpixel) +void FramebufferT::Fill16Bit(UINT32 curpixel) { UINT16 val; if (curpixel & 1) { - val = m_rdp->GetFillColor32() & 0xffff; + val = m_rdp->FillColor & 0xffff; } else { - val = (m_rdp->GetFillColor32() >> 16) & 0xffff; + val = (m_rdp->FillColor >> 16) & 0xffff; } - RWRITEIDX16((m_misc_state->m_fb_address >> 1) + curpixel, val); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + curpixel, ((val & 1) << 1) | (val & 1)); + RWRITEIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel, val); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel, ((val & 1) << 1) | (val & 1)); } -void Framebuffer::Fill32Bit(UINT32 curpixel) +void FramebufferT::Fill32Bit(UINT32 curpixel) { - UINT32 fill_color = m_rdp->GetFillColor32(); - RWRITEIDX32((m_misc_state->m_fb_address >> 2) + curpixel, fill_color); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + (curpixel << 1), (fill_color & 0x10000) ? 3 : 0); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + (curpixel << 1) + 1, (fill_color & 0x1) ? 3 : 0); + UINT32 FillColor = m_rdp->FillColor; + RWRITEIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel, FillColor); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + (curpixel << 1), (FillColor & 0x10000) ? 3 : 0); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + (curpixel << 1) + 1, (FillColor & 0x1) ? 3 : 0); } } // namespace RDP diff --git a/src/mame/video/rdpfb.h b/src/mame/video/rdpfb.h index 2cb8e23458a..b099e65cbe3 100644 --- a/src/mame/video/rdpfb.h +++ b/src/mame/video/rdpfb.h @@ -12,10 +12,10 @@ namespace RDP class OtherModes; class MiscState; -class Framebuffer +class FramebufferT { public: - Framebuffer() + FramebufferT() { m_pre_wrap = false; } diff --git a/src/mame/video/rdpspn16.c b/src/mame/video/rdpspn16.c index 09105a1240c..cd5ba2fdb9f 100644 --- a/src/mame/video/rdpspn16.c +++ b/src/mame/video/rdpspn16.c @@ -34,13 +34,12 @@ void Processor::RenderSpans(int start, int end, int tilenum, bool flip) for(int i = start; i <= end; i++) { - m_span[i].SetMachine(machine()); - switch(m_other_modes.cycle_type) + switch(OtherModes.cycle_type) { - case CYCLE_TYPE_1: m_span[i].Draw1Cycle(i, tilenum, flip); break; - case CYCLE_TYPE_2: m_span[i].Draw2Cycle(i, tilenum, flip); break; - case CYCLE_TYPE_COPY: m_span[i].DrawCopy(i, tilenum, flip); break; - case CYCLE_TYPE_FILL: m_span[i].DrawFill(i, tilenum, flip); break; + case CYCLE_TYPE_1: Spans[i].Draw1Cycle(i, tilenum, flip); break; + case CYCLE_TYPE_2: Spans[i].Draw2Cycle(i, tilenum, flip); break; + case CYCLE_TYPE_COPY: Spans[i].DrawCopy(i, tilenum, flip); break; + case CYCLE_TYPE_FILL: Spans[i].DrawFill(i, tilenum, flip); break; } } @@ -73,16 +72,14 @@ void Span::SetMachine(running_machine &machine) m_machine = &machine; m_rdp = &state->m_rdp; - m_other_modes = m_rdp->GetOtherModes(); - m_misc_state = m_rdp->GetMiscState(); } void Span::RGBAZClip(int sr, int sg, int sb, int sa, int *sz) { - m_rdp->GetShadeColor()->i.r = m_rdp->GetSpecial9BitClampTable()[sr & 0x1ff]; - m_rdp->GetShadeColor()->i.g = m_rdp->GetSpecial9BitClampTable()[sg & 0x1ff]; - m_rdp->GetShadeColor()->i.b = m_rdp->GetSpecial9BitClampTable()[sb & 0x1ff]; - m_rdp->GetShadeColor()->i.a = m_rdp->GetSpecial9BitClampTable()[sa & 0x1ff]; + m_rdp->ShadeColor.i.r = m_rdp->GetSpecial9BitClampTable()[sr & 0x1ff]; + m_rdp->ShadeColor.i.g = m_rdp->GetSpecial9BitClampTable()[sg & 0x1ff]; + m_rdp->ShadeColor.i.b = m_rdp->GetSpecial9BitClampTable()[sb & 0x1ff]; + m_rdp->ShadeColor.i.a = m_rdp->GetSpecial9BitClampTable()[sa & 0x1ff]; INT32 zanded = (*sz) & 0x60000; @@ -98,7 +95,7 @@ void Span::RGBAZClip(int sr, int sg, int sb, int sa, int *sz) void Span::RGBAZCorrectTriangle(INT32 offx, INT32 offy, INT32* r, INT32* g, INT32* b, INT32* a, INT32* z) { - if (m_rdp->GetMiscState()->m_curpixel_cvg == 8) + if (m_rdp->MiscState.CurrentPixCvg == 8) { *r >>= 2; *g >>= 2; @@ -142,17 +139,17 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) SpanParam t = m_t; SpanParam w = m_w; - UINT32 zb = m_misc_state->m_zb_address >> 1; + UINT32 zb = m_rdp->MiscState.ZBAddress >> 1; UINT32 zhb = zb; UINT8 offx = 0, offy = 0; INT32 tile1 = tilenum; - m_rdp->GetTexPipe()->CalculateClampDiffs(tile1); + m_rdp->TexPipe.CalculateClampDiffs(tile1); - bool noisecompute = m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1] == &m_rdp->GetNoiseColor()->i.r; - bool partialreject = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetInvPixelColor()->i.a && m_rdp->GetColorInputs()->blender1b_a[0] == &m_rdp->GetPixelColor()->i.a); - bool bsel0 = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetMemoryColor()->i.a); + bool noisecompute = m_rdp->ColorInputs.combiner_rgbsub_a_r[1] == &m_rdp->NoiseColor.i.r; + bool partialreject = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->InvPixelColor.i.a && m_rdp->ColorInputs.blender1b_a[0] == &m_rdp->PixelColor.i.a); + bool bsel0 = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->MemoryColor.i.a); int drinc = flip ? (m_rdp->m_span_dr) : -m_rdp->m_span_dr; int dginc = flip ? (m_rdp->m_span_dg) : -m_rdp->m_span_dg; @@ -165,7 +162,7 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) int dzpix = m_rdp->m_span_dzpix; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int cdith = 0; int adith = 0; @@ -177,7 +174,7 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) int x = xend; int length = flip ? (xstart - xend) : (xend - xstart); - m_rdp->GetTexPipe()->m_start_span = true; + m_rdp->TexPipe.m_start_span = true; UINT32 fir, fig, fib; for (int j = 0; j <= length; j++) @@ -193,10 +190,10 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) INT32 sss = 0; INT32 sst = 0; - if (m_other_modes->z_source_sel) + if (m_rdp->OtherModes.z_source_sel) { - sz = (((UINT32)m_misc_state->m_primitive_z) << 6) & 0x3fffff; - dzpix = m_misc_state->m_primitive_delta_z; + sz = (((UINT32)m_rdp->MiscState.PrimitiveZ) << 6) & 0x3fffff; + dzpix = m_rdp->MiscState.PrimitiveDZ; dzinc = m_rdp->m_span_dz = m_rdp->m_span_dzdy = 0; } @@ -206,9 +203,9 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) { m_rdp->lookup_cvmask_derivatives(m_cvg[x], &offx, &offy); - if (m_rdp->GetTexPipe()->m_start_span) + if (m_rdp->TexPipe.m_start_span) { - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(ss, st, sw, &sss, &sst); } @@ -219,16 +216,16 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) } else { - sss = m_rdp->GetTexPipe()->m_precomp_s; - sst = m_rdp->GetTexPipe()->m_precomp_t; + sss = m_rdp->TexPipe.m_precomp_s; + sst = m_rdp->TexPipe.m_precomp_t; } - m_rdp->GetTexPipe()->LOD1Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc); + m_rdp->TexPipe.LOD1Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc); RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz); RGBAZClip(sr, sg, sb, sa, &sz); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel0Color(), m_rdp->GetTexel0Color(), sss, sst, tilenum, 0); + m_rdp->TexPipe.Cycle(&m_rdp->Texel0Color, &m_rdp->Texel0Color, sss, sst, tilenum, 0); m_rdp->ColorCombiner1Cycle(noisecompute); @@ -236,18 +233,18 @@ void Span::Draw1Cycle(int index, int tilenum, bool flip) UINT32 zbcur = zb + curpixel; UINT32 zhbcur = zhb + curpixel; - m_rdp->GetFramebuffer()->Read(curpixel); + m_rdp->Framebuffer.Read(curpixel); if(m_rdp->ZCompare(zbcur, zhbcur, sz, dzpix)) { m_rdp->GetDitherValues(index, j, &cdith, &adith); - bool rendered = m_rdp->GetBlender()->Blend1Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0); + bool rendered = m_rdp->Blender.Blend1Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0); if (rendered) { - m_rdp->GetFramebuffer()->Write(curpixel, fir, fig, fib); - if (m_other_modes->z_update_en) + m_rdp->Framebuffer.Write(curpixel, fir, fig, fib); + if (m_rdp->OtherModes.z_update_en) { m_rdp->ZStore(zbcur, zhbcur, sz); } @@ -282,7 +279,7 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) SpanParam t = m_t; SpanParam w = m_w; - UINT32 zb = m_misc_state->m_zb_address >> 1; + UINT32 zb = m_rdp->MiscState.ZBAddress >> 1; UINT32 zhb = zb; UINT8 offx = 0, offy = 0; @@ -294,12 +291,12 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) INT32 news = 0; INT32 newt = 0; - m_rdp->GetTexPipe()->CalculateClampDiffs(tile1); + m_rdp->TexPipe.CalculateClampDiffs(tile1); - bool noisecompute = (m_rdp->GetColorInputs()->combiner_rgbsub_a_r[0] == &m_rdp->GetNoiseColor()->i.r || m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1] == &m_rdp->GetPixelColor()->i.r); - bool partialreject = (m_rdp->GetColorInputs()->blender2b_a[1] == &m_rdp->GetInvPixelColor()->i.a && m_rdp->GetColorInputs()->blender1b_a[1] == &m_rdp->GetPixelColor()->i.a); - bool bsel0 = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetMemoryColor()->i.a); - bool bsel1 = (m_rdp->GetColorInputs()->blender2b_a[1] == &m_rdp->GetMemoryColor()->i.a); + bool noisecompute = (m_rdp->ColorInputs.combiner_rgbsub_a_r[0] == &m_rdp->NoiseColor.i.r || m_rdp->ColorInputs.combiner_rgbsub_a_r[1] == &m_rdp->PixelColor.i.r); + bool partialreject = (m_rdp->ColorInputs.blender2b_a[1] == &m_rdp->InvPixelColor.i.a && m_rdp->ColorInputs.blender1b_a[1] == &m_rdp->PixelColor.i.a); + bool bsel0 = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->MemoryColor.i.a); + bool bsel1 = (m_rdp->ColorInputs.blender2b_a[1] == &m_rdp->MemoryColor.i.a); int dzpix = m_rdp->m_span_dzpix; int drinc = flip ? (m_rdp->m_span_dr) : -m_rdp->m_span_dr; @@ -312,7 +309,7 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) int dwinc = flip ? (m_rdp->m_span_dw) : -m_rdp->m_span_dw; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int cdith = 0; int adith = 0; @@ -324,7 +321,7 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) int x = xend; int length = flip ? (xstart - xend) : (xend - xstart); - m_rdp->GetTexPipe()->m_start_span = true; + m_rdp->TexPipe.m_start_span = true; UINT32 fir, fig, fib; //printf( "Span length: %d\n", length); @@ -344,10 +341,10 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) Color c1; Color c2; - if (m_other_modes->z_source_sel) + if (m_rdp->OtherModes.z_source_sel) { - sz = (((UINT32)m_misc_state->m_primitive_z) << 6) & 0x3fffff; - dzpix = m_misc_state->m_primitive_delta_z; + sz = (((UINT32)m_rdp->MiscState.PrimitiveZ) << 6) & 0x3fffff; + dzpix = m_rdp->MiscState.PrimitiveDZ; dzinc = m_rdp->m_span_dz = m_rdp->m_span_dzdy = 0; } @@ -357,9 +354,9 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) { m_rdp->lookup_cvmask_derivatives(m_cvg[x], &offx, &offy); - if (m_rdp->GetTexPipe()->m_start_span) + if (m_rdp->TexPipe.m_start_span) { - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(ss, st, sw, &sss, &sst); } @@ -370,23 +367,23 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) } else { - sss = m_rdp->GetTexPipe()->m_precomp_s; - sst = m_rdp->GetTexPipe()->m_precomp_t; + sss = m_rdp->TexPipe.m_precomp_s; + sst = m_rdp->TexPipe.m_precomp_t; } - m_rdp->GetTexPipe()->LOD2Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc, prim_tile, &tile1, &tile2); + m_rdp->TexPipe.LOD2Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc, prim_tile, &tile1, &tile2); - news = m_rdp->GetTexPipe()->m_precomp_s; - newt = m_rdp->GetTexPipe()->m_precomp_t; - m_rdp->GetTexPipe()->LOD2CycleLimited(&news, &newt, s.w + dsinc, t.w + dtinc, w.w + dwinc, dsinc, dtinc, dwinc, prim_tile, &newtile1); + news = m_rdp->TexPipe.m_precomp_s; + newt = m_rdp->TexPipe.m_precomp_t; + m_rdp->TexPipe.LOD2CycleLimited(&news, &newt, s.w + dsinc, t.w + dtinc, w.w + dwinc, dsinc, dtinc, dwinc, prim_tile, &newtile1); RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz); RGBAZClip(sr, sg, sb, sa, &sz); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel0Color(), m_rdp->GetTexel0Color(), sss, sst, tile1, 0); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel1Color(), m_rdp->GetTexel0Color(), sss, sst, tile2, 1); + m_rdp->TexPipe.Cycle(&m_rdp->Texel0Color, &m_rdp->Texel0Color, sss, sst, tile1, 0); + m_rdp->TexPipe.Cycle(&m_rdp->Texel1Color, &m_rdp->Texel0Color, sss, sst, tile2, 1); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetNextTexelColor(), m_rdp->GetNextTexelColor(), sss, sst, tile2, 1); + m_rdp->TexPipe.Cycle(&m_rdp->NextTexelColor, &m_rdp->NextTexelColor, sss, sst, tile2, 1); m_rdp->ColorCombiner2Cycle(noisecompute); @@ -394,18 +391,18 @@ void Span::Draw2Cycle(int index, int tilenum, bool flip) UINT32 zbcur = zb + curpixel; UINT32 zhbcur = zhb + curpixel; - m_rdp->GetFramebuffer()->Read(curpixel); + m_rdp->Framebuffer.Read(curpixel); if(m_rdp->ZCompare(zbcur, zhbcur, sz, dzpix)) { m_rdp->GetDitherValues(index, j, &cdith, &adith); - bool rendered = m_rdp->GetBlender()->Blend2Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0, bsel1); + bool rendered = m_rdp->Blender.Blend2Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0, bsel1); if (rendered) { - m_rdp->GetFramebuffer()->Write(curpixel, fir, fig, fib); - if (m_other_modes->z_update_en) + m_rdp->Framebuffer.Write(curpixel, fir, fig, fib); + if (m_rdp->OtherModes.z_update_en) { m_rdp->ZStore(zbcur, zhbcur, sz); } @@ -440,7 +437,7 @@ void Span::DrawCopy(int index, int tilenum, bool flip) int dtinc = flip ? (dt) : -dt; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int xstart = m_lx; int xend = m_unscissored_rx; @@ -458,13 +455,13 @@ void Span::DrawCopy(int index, int tilenum, bool flip) { INT32 sss = s.h.h; INT32 sst = t.h.h; - m_rdp->GetTexPipe()->Copy(m_rdp->GetTexel0Color(), sss, sst, tilenum); + m_rdp->TexPipe.Copy(&m_rdp->Texel0Color, sss, sst, tilenum); UINT32 curpixel = fb_index + x; - m_misc_state->m_curpixel_cvg = m_rdp->GetTexel0Color()->i.a ? 7 : 0; - if ((m_rdp->GetTexel0Color()->i.a != 0) || (!m_other_modes->alpha_compare_en)) + m_rdp->MiscState.CurrentPixCvg = m_rdp->Texel0Color.i.a ? 7 : 0; + if ((m_rdp->Texel0Color.i.a != 0) || (!m_rdp->OtherModes.alpha_compare_en)) { - m_rdp->GetFramebuffer()->Copy(curpixel, m_rdp->GetTexel0Color()->i.r, m_rdp->GetTexel0Color()->i.g, m_rdp->GetTexel0Color()->i.b); + m_rdp->Framebuffer.Copy(curpixel, m_rdp->Texel0Color.i.r, m_rdp->Texel0Color.i.g, m_rdp->Texel0Color.i.b); } } @@ -481,7 +478,7 @@ void Span::DrawFill(int index, int tilenum, bool flip) int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int xstart = m_lx; int xend_scissored = m_rx; @@ -495,7 +492,7 @@ void Span::DrawFill(int index, int tilenum, bool flip) if (x >= clipx1 && x < clipx2) { UINT32 curpixel = fb_index + x; - m_rdp->GetFramebuffer()->Fill(curpixel); + m_rdp->Framebuffer.Fill(curpixel); } x += xinc; diff --git a/src/mame/video/rdptpipe.c b/src/mame/video/rdptpipe.c index 2a2ac82044f..a50257f6bab 100644 --- a/src/mame/video/rdptpipe.c +++ b/src/mame/video/rdptpipe.c @@ -10,17 +10,25 @@ namespace RDP #define RELATIVE(x, y) ((((x) >> 3) - (y)) << 3) | (x & 7); -void TexturePipe::SetMachine(running_machine &machine) +void TexturePipeT::SetMachine(running_machine &machine) { _n64_state *state = machine.driver_data<_n64_state>(); m_machine = &machine; m_rdp = &state->m_rdp; - m_other_modes = m_rdp->GetOtherModes(); - m_misc_state = m_rdp->GetMiscState(); + + for(int i = 0; i < 0x10000; i++) + { + Color c; + c.i.r = m_rdp->ReplicatedRGBA[(i >> 11) & 0x1f]; + c.i.g = m_rdp->ReplicatedRGBA[(i >> 6) & 0x1f]; + c.i.b = m_rdp->ReplicatedRGBA[(i >> 1) & 0x1f]; + c.i.a = (i & 1) ? 0xff : 0x00; + Expand16To32Table[i] = c.c; + } } -void TexturePipe::Mask(INT32* S, INT32* T, INT32 num) +void TexturePipeT::Mask(INT32* S, INT32* T, INT32 num) { Tile* tile = m_rdp->GetTiles(); @@ -47,7 +55,7 @@ void TexturePipe::Mask(INT32* S, INT32* T, INT32 num) } } -void TexturePipe::MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num) +void TexturePipeT::MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num) { Tile* tile = m_rdp->GetTiles(); @@ -94,7 +102,7 @@ void TexturePipe::MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 nu } } -void TexturePipe::ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT32 num) +void TexturePipeT::ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT32 num) { Tile* tile = m_rdp->GetTiles(); *S = SIGN16(*S); @@ -122,7 +130,7 @@ void TexturePipe::ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT3 *maxt = ((*T >> 3) >= tile[num].th); } -void TexturePipe::ShiftCopy(INT32* S, INT32* T, UINT32 num) +void TexturePipeT::ShiftCopy(INT32* S, INT32* T, UINT32 num) { Tile* tile = m_rdp->GetTiles(); *S = SIGN16(*S); @@ -147,7 +155,7 @@ void TexturePipe::ShiftCopy(INT32* S, INT32* T, UINT32 num) *T = SIGN16(*T); } -void TexturePipe::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num) +void TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num) { Tile* tile = m_rdp->GetTiles(); int dos = tile[num].cs || !tile[num].mask_s; @@ -198,7 +206,7 @@ void TexturePipe::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT } } -void TexturePipe::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num) +void TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num) { Tile* tile = m_rdp->GetTiles(); int dos = tile[num].cs || !tile[num].mask_s; @@ -245,18 +253,18 @@ void TexturePipe::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT3 } } -void TexturePipe::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle) +void TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle) { Tile* tile = m_rdp->GetTiles(); #define TRELATIVE(x, y) ((((x) >> 3) - (y)) << 3) | (x & 7); - INT32 bilerp = cycle ? m_other_modes->bi_lerp1 : m_other_modes->bi_lerp0; - int convert = m_other_modes->convert_one && cycle; + INT32 bilerp = cycle ? m_rdp->OtherModes.bi_lerp1 : m_rdp->OtherModes.bi_lerp0; + int convert = m_rdp->OtherModes.convert_one && cycle; Color t0; Color t1; Color t2; Color t3; - if (m_other_modes->sample_type) + if (m_rdp->OtherModes.sample_type) { int sss1, sst1, sss2, sst2; @@ -293,7 +301,7 @@ void TexturePipe::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 ti invtf = 0x20 - tfrac; } - center = (sfrac == 0x10) && (tfrac == 0x10) && m_other_modes->mid_texel; + center = (sfrac == 0x10) && (tfrac == 0x10) && m_rdp->OtherModes.mid_texel; invsf <<= 3; invtf <<= 3; @@ -411,7 +419,7 @@ void TexturePipe::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 ti } } -void TexturePipe::Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum) +void TexturePipeT::Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum) { Tile* tile = m_rdp->GetTiles(); INT32 sss1 = SSS; @@ -425,13 +433,13 @@ void TexturePipe::Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum) TEX->c = Fetch(sss1, sst1, tilenum); } -void TexturePipe::LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc) +void TexturePipeT::LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -496,13 +504,13 @@ void TexturePipe::LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, I } } -void TexturePipe::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, INT32* t2) +void TexturePipeT::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, INT32* t2) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -585,44 +593,44 @@ void TexturePipe::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, I { lod = 0x7fff; } - else if (lod < m_misc_state->m_min_level) + else if (lod < m_rdp->MiscState.MinLevel) { - lod = m_misc_state->m_min_level; + lod = m_rdp->MiscState.MinLevel; } bool magnify = (lod < 32); INT32 l_tile = m_rdp->GetLog2((lod >> 5) & 0xff); - bool distant = ((lod & 0x6000) || (l_tile >= m_misc_state->m_max_level)); + bool distant = ((lod & 0x6000) || (l_tile >= m_rdp->MiscState.MaxLevel)); - m_rdp->SetLODFrac(((lod << 3) >> l_tile) & 0xff); + m_rdp->LODFraction = ((lod << 3) >> l_tile) & 0xff; - if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en) + if(!m_rdp->OtherModes.sharpen_tex_en && !m_rdp->OtherModes.detail_tex_en) { if (distant) { - m_rdp->SetLODFrac(0xff); + m_rdp->LODFraction = 0xff; } else if (magnify) { - m_rdp->SetLODFrac(0); + m_rdp->LODFraction = 0; } } - if(m_other_modes->sharpen_tex_en && magnify) + if(m_rdp->OtherModes.sharpen_tex_en && magnify) { - m_rdp->SetLODFrac(m_rdp->GetLODFrac() | 0x100); + m_rdp->LODFraction = m_rdp->LODFraction | 0x100; } - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { if (distant) { - l_tile = m_misc_state->m_max_level; + l_tile = m_rdp->MiscState.MaxLevel; } - if (!m_other_modes->detail_tex_en) + if (!m_rdp->OtherModes.detail_tex_en) { *t1 = (prim_tile + l_tile) & 7; - if (!(distant || (!m_other_modes->sharpen_tex_en && magnify))) + if (!(distant || (!m_rdp->OtherModes.sharpen_tex_en && magnify))) { *t2 = (*t1 + 1) & 7; } @@ -654,13 +662,13 @@ void TexturePipe::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, I } } -void TexturePipe::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1) +void TexturePipeT::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -739,22 +747,22 @@ void TexturePipe::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT { lod = 0x7fff; } - else if (lod < m_misc_state->m_min_level) + else if (lod < m_rdp->MiscState.MinLevel) { - lod = m_misc_state->m_min_level; + lod = m_rdp->MiscState.MinLevel; } bool magnify = (lod < 32); INT32 l_tile = m_rdp->GetLog2((lod >> 5) & 0xff); - bool distant = (lod & 0x6000) || (l_tile >= m_misc_state->m_max_level); + bool distant = (lod & 0x6000) || (l_tile >= m_rdp->MiscState.MaxLevel); - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { if (distant) { - l_tile = m_misc_state->m_max_level; + l_tile = m_rdp->MiscState.MaxLevel; } - if (!m_other_modes->detail_tex_en) + if (!m_rdp->OtherModes.detail_tex_en) { *t1 = (prim_tile + l_tile) & 7; } @@ -773,12 +781,12 @@ void TexturePipe::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT } } -void TexturePipe::CalculateClampDiffs(UINT32 prim_tile) +void TexturePipeT::CalculateClampDiffs(UINT32 prim_tile) { Tile* tile = m_rdp->GetTiles(); - if (m_other_modes->cycle_type == CYCLE_TYPE_2) + if (m_rdp->OtherModes.cycle_type == CYCLE_TYPE_2) { - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { int start = 0; int end = 7; @@ -805,454 +813,575 @@ void TexturePipe::CalculateClampDiffs(UINT32 prim_tile) } } -UINT32 TexturePipe::Fetch(INT32 s, INT32 t, INT32 tilenum) +#define USE_64K_LUT (1) + +static INT32 sTexAddrSwap16[2] = { WORD_ADDR_XOR, WORD_XOR_DWORD_SWAP }; +static INT32 sTexAddrSwap8[2] = { BYTE_ADDR_XOR, BYTE_XOR_DWORD_SWAP }; + +UINT32 TexturePipeT::_FetchRGBA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + + UINT16 c = m_rdp->GetTMEM16()[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchRGBA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + + UINT16 c = m_rdp->GetTMEM16()[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + return color.c; +} + +UINT32 TexturePipeT::_FetchRGBA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + +#if USE_64K_LUT + return Expand16To32Table[m_rdp->GetTMEM16()[taddr]]; +#else + UINT16 c = m_rdp->GetTMEM16()[taddr]; + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchRGBA_32_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT32 *tc = m_rdp->GetTMEM32(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x3ff; + UINT32 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 24) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchRGBA_32_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT32 *tc = m_rdp->GetTMEM32(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x3ff; + UINT32 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 24) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchRGBA_32_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x3ff; + + UINT32 c = m_rdp->GetTMEM16()[taddr]; + Color color; + color.i.r = (c >> 8) & 0xff; + color.i.g = c & 0xff; + c = m_rdp->GetTMEM16()[taddr | 0x400]; + color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchNOP(INT32 s, INT32 t, INT32 tbase, INT32 tpal) { return 0; } + +UINT32 TexturePipeT::_FetchYUV(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + + int taddr = (tbase << 3) + s; + int taddrlow = taddr >> 1; + + taddr ^= sTexAddrSwap8[t & 1]; + taddrlow ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x7ff; + taddrlow &= 0x3ff; + + UINT16 c = tc[taddrlow]; + + INT32 y = m_rdp->GetTMEM()[taddr | 0x800]; + INT32 u = c >> 8; + INT32 v = c & 0xff; + + v ^= 0x80; u ^= 0x80; + u |= ((u & 0x80) << 1); + v |= ((v & 0x80) << 1); + + Color color; + color.i.r = u; + color.i.g = v; + color.i.b = y; + color.i.a = y; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + taddr &= 0x7ff; + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchCI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + taddr &= 0x7ff; + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + p = (tpal << 4) | p; + + Color color; + color.i.r = color.i.g = color.i.b = color.i.a = p; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchCI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = tc[taddr]; + + Color color; + color.i.r = color.i.g = color.i.b = color.i.a = p; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT8 i = p & 0xe; + i = (i << 4) | (i << 1) | (i >> 2); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = (p & 1) & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = tc[taddr]; + UINT8 i = p & 0xf0; + i |= (i >> 4); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = ((p & 0xf) << 4) | (p & 0xf); + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x3ff; + + UINT16 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x3ff; + + UINT16 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + + UINT16 c = tc[taddr]; + UINT8 i = (c >> 8); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[k]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(k); + color.i.g = GET_MED_RGBA16_TMEM(k); + color.i.b = GET_LOW_RGBA16_TMEM(k); + color.i.a = (k & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; + color.i.a = k & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + c |= (c << 4); + + Color color; + color.i.r = c; + color.i.g = c; + color.i.b = c; + color.i.a = c; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 c = tc[taddr]; + UINT16 k = m_rdp->GetTLUT()[c << 2]; + +#if USE_64K_LUT + return Expand16To32Table[k]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(k); + color.i.g = GET_MED_RGBA16_TMEM(k); + color.i.b = GET_LOW_RGBA16_TMEM(k); + color.i.a = (k & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 c = tc[taddr]; + UINT16 k = m_rdp->GetTLUT()[c << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; + color.i.a = k & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 c = tc[taddr]; + + Color color; + color.i.r = c; + color.i.g = c; + color.i.b = c; + color.i.a = c; + + return color.c; +} + +UINT32 TexturePipeT::Fetch(INT32 s, INT32 t, INT32 tilenum) { Tile* tile = m_rdp->GetTiles(); - Color color; - UINT32 tbase = (tile[tilenum].line * t) & 0x1ff; UINT32 tformat = tile[tilenum].format; UINT32 tsize = tile[tilenum].size; + + UINT32 tbase = (tile[tilenum].line * t) & 0x1ff; tbase += tile[tilenum].tmem; UINT32 tpal = tile[tilenum].palette; - if (tformat == FORMAT_I && tsize > PIXEL_SIZE_8BIT) - { - tformat = FORMAT_RGBA; // Used by Supercross 2000 (in-game) - } - if (tformat == FORMAT_CI && tsize > PIXEL_SIZE_8BIT) - { - tformat = FORMAT_RGBA; // Used by Clay Fighter - Sculptor's Cut - } + UINT32 index = (tformat << 4) | (tsize << 2) | (m_rdp->OtherModes.en_tlut << 1) | m_rdp->OtherModes.tlut_type; - if (tformat == FORMAT_RGBA && tsize < PIXEL_SIZE_16BIT) - { - tformat = FORMAT_CI; // Used by Exterem-G2, Madden Football 64, and Rat Attack - } - - UINT16 *tc16 = m_rdp->GetTMEM16(); - - switch (tformat) - { - case FORMAT_RGBA: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - break; - case PIXEL_SIZE_8BIT: - break; - case PIXEL_SIZE_16BIT: - { - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - taddr &= 0x7ff; - - if (!m_other_modes->en_tlut) - { - UINT16 c = tc16[taddr]; - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - UINT16 c = tc16[taddr]; - c = m_rdp->GetTLUT()[(c >> 8) << 2]; - if (m_other_modes->tlut_type == 0) // Used by Goldeneye 007 (ocean in Frigate) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else // Used by Beetle Adventure Racing (Mount Mayhem level) - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_32BIT: - { - UINT32 *tc = m_rdp->GetTMEM32(); - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - - if (!m_other_modes->en_tlut) - { - taddr &= 0x3ff; - UINT32 c = tc16[taddr]; - color.i.r = (c >> 8) & 0xff; - color.i.g = c & 0xff; - c = tc16[taddr | 0x400]; - color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - else // Used by California Speed, attract mode - { - taddr &= 0x3ff; - UINT32 c = tc[taddr]; - c = m_rdp->GetTLUT()[(c >> 24) << 2]; - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - - break; - } - default: - fatalerror("FETCH_TEXEL: unknown RGBA texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_YUV: // Used by: Bottom of the 9th, Pokemon Stadium, Ogre Battle, Major League Baseball, Ken Griffey Jr.'s Slugfest, Vigilante 8 Second Offense - { - switch(tsize) - { - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = m_rdp->GetTMEM16(); - - int taddr = (tbase << 3) + s; - int taddrlow = taddr >> 1; - - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddrlow ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - - taddr &= 0x7ff; - taddrlow &= 0x3ff; - - UINT16 c = tc[taddrlow]; - - INT32 y = m_rdp->GetTMEM()[taddr | 0x800]; - INT32 u = c >> 8; - INT32 v = c & 0xff; - - v ^= 0x80; u ^= 0x80; - if (v & 0x80) - { - v |= 0x100; - } - if (u & 0x80) - { - u |= 0x100; - } - - color.i.r = u; - color.i.g = v; - color.i.b = y; - color.i.a = y; - break; - } - default: - fatalerror("FETCH_TEXEL: unknown YUV texture size %d\n",tsize); - break; - } - break; - } - case FORMAT_CI: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: // Madden Football 64, Bust-A-Move 2 - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (m_other_modes->en_tlut) - { - taddr &= 0x7ff; - UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; - - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - else - { - UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - p = (tpal << 4) | p; - color.i.r = color.i.g = color.i.b = color.i.a = p; - } - - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (m_other_modes->en_tlut) - { - taddr &= 0x7ff; - UINT8 p = tc[taddr]; - UINT16 c = m_rdp->GetTLUT()[p << 2]; - - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - else - { - UINT8 p = tc[taddr]; - color.i.r = p; - color.i.g = p; - color.i.b = p; - color.i.a = p; - } - break; - } - default: - fatalerror("FETCH_TEXEL: unknown CI texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_IA: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT8 i = p & 0xe; - i = (i << 4) | (i << 1) | (i >> 2); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = (p & 0x1) ? 0xff : 0; - } - else - { - taddr &= 0x7ff; - UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - if (!m_other_modes->en_tlut) - { - UINT8 p = tc[taddr]; - UINT8 i = p & 0xf0; - i |= (i >> 4); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = ((p & 0xf) << 4) | (p & 0xf); - } - else - { - UINT8 p = tc[taddr & 0x7ff]; - UINT16 c = m_rdp->GetTLUT()[p << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = m_rdp->GetTMEM16(); - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - taddr &= 0x7ff; - - if (!m_other_modes->en_tlut) - { - UINT16 c = tc[taddr]; - UINT8 i = (c >> 8); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = c & 0xff; - } - else - { - UINT16 c = tc[taddr & 0x3ff]; - c = m_rdp->GetTLUT()[(c >> 8) << 2]; - if (m_other_modes->tlut_type == 1) - { - color.i.r = c >> 8; - color.i.g = c >> 8; - color.i.b = c >> 8; - color.i.a = c & 0xff; - } - else - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - } - break; - } - default: - color.i.r = color.i.g = color.i.b = color.i.a = 0xff; - fatalerror("FETCH_TEXEL: unknown IA texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_I: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 byteval = tc[taddr]; - UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); - c |= (c << 4); - color.i.r = c; - color.i.g = c; - color.i.b = c; - color.i.a = c; - } - else - { - UINT8 byteval = tc[taddr & 0x7ff]; - UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); - UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(k); - color.i.g = GET_MED_RGBA16_TMEM(k); - color.i.b = GET_LOW_RGBA16_TMEM(k); - color.i.a = (k & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; - color.i.a = k & 0xff; - } - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 c = tc[taddr]; - color.i.r = c; - color.i.g = c; - color.i.b = c; - color.i.a = c; - } - else - { - UINT8 c = tc[taddr & 0x7ff]; - UINT16 k = m_rdp->GetTLUT()[c << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(k); - color.i.g = GET_MED_RGBA16_TMEM(k); - color.i.b = GET_LOW_RGBA16_TMEM(k); - color.i.a = (k & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; - color.i.a = k & 0xff; - } - } - - break; - } - default: - fatalerror("FETCH_TEXEL: unknown I texture size %d\n", tsize); - break; - } - break; - } - default: - { - fatalerror("FETCH_TEXEL: unknown texture format %d, tilenum %d\n", tformat, tilenum); - break; - } - } - - return color.c; + return ((this)->*(TexelFetch[index]))(s, t, tbase, tpal); } } // namespace RDP diff --git a/src/mame/video/rdptpipe.h b/src/mame/video/rdptpipe.h index 35c081aa73b..100f64b7a7c 100644 --- a/src/mame/video/rdptpipe.h +++ b/src/mame/video/rdptpipe.h @@ -14,10 +14,12 @@ class MiscState; class Processor; class Color; -class TexturePipe +class TexturePipeT { public: - TexturePipe() + typedef UINT32 (N64::RDP::TexturePipeT::*TexelFetcher) (INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + TexturePipeT() { m_maskbits_table[0] = 0x3ff; for(int i = 1; i < 16; i++) @@ -27,6 +29,56 @@ class TexturePipe m_start_span = false; m_precomp_s = 0; m_precomp_t = 0; + + for (int idx = 0; idx < 80; idx++) + { + TexelFetch[idx] = &N64::RDP::TexturePipeT::_FetchNOP; + } + + TexelFetch[ 8] = &N64::RDP::TexturePipeT::_FetchRGBA_16_RAW; + TexelFetch[ 9] = &N64::RDP::TexturePipeT::_FetchRGBA_16_RAW; + TexelFetch[10] = &N64::RDP::TexturePipeT::_FetchRGBA_16_TLUT0; + TexelFetch[11] = &N64::RDP::TexturePipeT::_FetchRGBA_16_TLUT1; + TexelFetch[12] = &N64::RDP::TexturePipeT::_FetchRGBA_32_RAW; + TexelFetch[13] = &N64::RDP::TexturePipeT::_FetchRGBA_32_RAW; + TexelFetch[14] = &N64::RDP::TexturePipeT::_FetchRGBA_32_TLUT0; + TexelFetch[15] = &N64::RDP::TexturePipeT::_FetchRGBA_32_TLUT1; + + TexelFetch[24] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[25] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[26] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[27] = &N64::RDP::TexturePipeT::_FetchYUV; + + TexelFetch[32] = &N64::RDP::TexturePipeT::_FetchCI_4_RAW; + TexelFetch[33] = &N64::RDP::TexturePipeT::_FetchCI_4_RAW; + TexelFetch[34] = &N64::RDP::TexturePipeT::_FetchCI_4_TLUT0; + TexelFetch[35] = &N64::RDP::TexturePipeT::_FetchCI_4_TLUT1; + TexelFetch[36] = &N64::RDP::TexturePipeT::_FetchCI_8_RAW; + TexelFetch[37] = &N64::RDP::TexturePipeT::_FetchCI_8_RAW; + TexelFetch[38] = &N64::RDP::TexturePipeT::_FetchCI_8_TLUT0; + TexelFetch[39] = &N64::RDP::TexturePipeT::_FetchCI_8_TLUT1; + + TexelFetch[48] = &N64::RDP::TexturePipeT::_FetchIA_4_RAW; + TexelFetch[49] = &N64::RDP::TexturePipeT::_FetchIA_4_RAW; + TexelFetch[50] = &N64::RDP::TexturePipeT::_FetchIA_4_TLUT0; + TexelFetch[51] = &N64::RDP::TexturePipeT::_FetchIA_4_TLUT1; + TexelFetch[52] = &N64::RDP::TexturePipeT::_FetchIA_8_RAW; + TexelFetch[53] = &N64::RDP::TexturePipeT::_FetchIA_8_RAW; + TexelFetch[54] = &N64::RDP::TexturePipeT::_FetchIA_8_TLUT0; + TexelFetch[55] = &N64::RDP::TexturePipeT::_FetchIA_8_TLUT1; + TexelFetch[56] = &N64::RDP::TexturePipeT::_FetchIA_16_RAW; + TexelFetch[57] = &N64::RDP::TexturePipeT::_FetchIA_16_RAW; + TexelFetch[58] = &N64::RDP::TexturePipeT::_FetchIA_16_TLUT0; + TexelFetch[59] = &N64::RDP::TexturePipeT::_FetchIA_16_TLUT1; + + TexelFetch[64] = &N64::RDP::TexturePipeT::_FetchI_4_RAW; + TexelFetch[65] = &N64::RDP::TexturePipeT::_FetchI_4_RAW; + TexelFetch[66] = &N64::RDP::TexturePipeT::_FetchI_4_TLUT0; + TexelFetch[67] = &N64::RDP::TexturePipeT::_FetchI_4_TLUT1; + TexelFetch[68] = &N64::RDP::TexturePipeT::_FetchI_8_RAW; + TexelFetch[69] = &N64::RDP::TexturePipeT::_FetchI_8_RAW; + TexelFetch[70] = &N64::RDP::TexturePipeT::_FetchI_8_TLUT0; + TexelFetch[71] = &N64::RDP::TexturePipeT::_FetchI_8_TLUT1; } void Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle); @@ -44,6 +96,8 @@ class TexturePipe INT32 m_precomp_t; private: + UINT32 Expand16To32Table[0x10000]; + void Mask(INT32* S, INT32* T, INT32 num); void MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num); @@ -53,6 +107,43 @@ class TexturePipe void ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num); void ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num); + UINT32 _FetchNOP(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchRGBA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchYUV(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchCI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchIA_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + TexelFetcher TexelFetch[16*5]; + running_machine* m_machine; OtherModes* m_other_modes; MiscState* m_misc_state; diff --git a/src/mame/video/rdptri.h b/src/mame/video/rdptri.h index 0415549058c..19f186e7700 100644 --- a/src/mame/video/rdptri.h +++ b/src/mame/video/rdptri.h @@ -27,7 +27,6 @@ class Triangle running_machine* m_machine; UINT32* m_cmd_data; - MiscState* m_misc_state; Processor* m_rdp; bool m_shade; bool m_texture;