diff --git a/src/vid_voodoo_codegen_x86-64.h b/src/vid_voodoo_codegen_x86-64.h index ba11ce5..5f61b2c 100644 --- a/src/vid_voodoo_codegen_x86-64.h +++ b/src/vid_voodoo_codegen_x86-64.h @@ -34,6 +34,7 @@ typedef struct voodoo_x86_data_t uint32_t textureMode[2]; uint32_t tLOD[2]; uint32_t trexInit1; + int is_tiled; } voodoo_x86_data_t; //static voodoo_x86_data_t voodoo_x86_data[2][BLOCK_NUM]; @@ -790,7 +791,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x4c); /*MOV RSI, R15*/ addbyte(0x89); addbyte(0xfe); - if (voodoo->col_tiled || voodoo->aux_tiled) + if (params->col_tiled || params->aux_tiled) { addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ addbyte(0x87); @@ -929,7 +930,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo { addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ addbyte(0x9f); - if (voodoo->aux_tiled) + if (params->aux_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2516,7 +2517,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addquad((uintptr_t)rgb565); addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ addbyte(0x87); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2901,7 +2902,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2971,7 +2972,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo } addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -3062,7 +3063,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo { addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->aux_tiled) + if (params->aux_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -3357,7 +3358,8 @@ static inline void *voodoo_get_block(voodoo_t *voodoo, voodoo_params_t *params, params->textureMode[0] == data->textureMode[0] && params->textureMode[1] == data->textureMode[1] && (params->tLOD[0] & LOD_MASK) == data->tLOD[0] && - (params->tLOD[1] & LOD_MASK) == data->tLOD[1]) + (params->tLOD[1] & LOD_MASK) == data->tLOD[1] && + ((params->col_tiled || params->aux_tiled) ? 1 : 0) == data->is_tiled) { last_block[odd_even] = b; return data->code_block; @@ -3381,6 +3383,7 @@ voodoo_recomp++; data->textureMode[1] = params->textureMode[1]; data->tLOD[0] = params->tLOD[0] & LOD_MASK; data->tLOD[1] = params->tLOD[1] & LOD_MASK; + data->is_tiled = (params->col_tiled || params->aux_tiled) ? 1 : 0; next_block_to_write[odd_even] = (next_block_to_write[odd_even] + 1) & 7; diff --git a/src/vid_voodoo_codegen_x86.h b/src/vid_voodoo_codegen_x86.h index d49c6ed..fc2be0c 100644 --- a/src/vid_voodoo_codegen_x86.h +++ b/src/vid_voodoo_codegen_x86.h @@ -34,6 +34,7 @@ typedef struct voodoo_x86_data_t uint32_t textureMode[2]; uint32_t tLOD[2]; uint32_t trexInit1; + int is_tiled; } voodoo_x86_data_t; static int last_block[4] = {0, 0}; @@ -702,7 +703,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x74); addbyte(0x24); addbyte(8+16); - if (voodoo->col_tiled || voodoo->aux_tiled) + if (params->col_tiled || params->aux_tiled) { addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ addbyte(0x87); @@ -856,7 +857,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo { addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ addbyte(0x9f); - if (voodoo->aux_tiled) + if (params->aux_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2469,7 +2470,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo { addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ addbyte(0x87); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2851,7 +2852,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -2923,7 +2924,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo } addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->col_tiled) + if (params->col_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -3012,7 +3013,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo { addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ addbyte(0x97); - if (voodoo->aux_tiled) + if (params->aux_tiled) addlong(offsetof(voodoo_state_t, x_tiled)); else addlong(offsetof(voodoo_state_t, x)); @@ -3297,7 +3298,8 @@ static inline void *voodoo_get_block(voodoo_t *voodoo, voodoo_params_t *params, params->textureMode[0] == data->textureMode[0] && params->textureMode[1] == data->textureMode[1] && (params->tLOD[0] & LOD_MASK) == data->tLOD[0] && - (params->tLOD[1] & LOD_MASK) == data->tLOD[1]) + (params->tLOD[1] & LOD_MASK) == data->tLOD[1] && + ((params->col_tiled || params->aux_tiled) ? 1 : 0) == data->is_tiled) { last_block[odd_even] = b; return data->code_block; @@ -3321,6 +3323,7 @@ voodoo_recomp++; data->textureMode[1] = params->textureMode[1]; data->tLOD[0] = params->tLOD[0] & LOD_MASK; data->tLOD[1] = params->tLOD[1] & LOD_MASK; + data->is_tiled = (params->col_tiled || params->aux_tiled) ? 1 : 0; next_block_to_write[odd_even] = (next_block_to_write[odd_even] + 1) & 7; diff --git a/src/vid_voodoo_common.h b/src/vid_voodoo_common.h index 9fb9c05..cf62410 100644 --- a/src/vid_voodoo_common.h +++ b/src/vid_voodoo_common.h @@ -156,6 +156,9 @@ typedef struct voodoo_params_t uint32_t swapbufferCMD; uint32_t stipple; + + int col_tiled, aux_tiled; + int row_width, aux_row_width; } voodoo_params_t; typedef struct texture_t diff --git a/src/vid_voodoo_reg.c b/src/vid_voodoo_reg.c index d413130..63e590b 100644 --- a/src/vid_voodoo_reg.c +++ b/src/vid_voodoo_reg.c @@ -567,6 +567,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) if (voodoo->type >= VOODOO_BANSHEE) { voodoo->col_tiled = val & (1 << 15); + voodoo->params.col_tiled = voodoo->col_tiled; if (voodoo->col_tiled) { voodoo->row_width = (val & 0x7f) * 128*32; @@ -577,6 +578,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) voodoo->row_width = val & 0x3fff; // pclog("colBufferStride linear = %i bytes, linear\n", voodoo->row_width); } + voodoo->params.row_width = voodoo->row_width; } break; case SST_auxBufferAddr: @@ -590,6 +592,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) if (voodoo->type >= VOODOO_BANSHEE) { voodoo->aux_tiled = val & (1 << 15); + voodoo->params.aux_tiled = voodoo->aux_tiled; if (voodoo->aux_tiled) { voodoo->aux_row_width = (val & 0x7f) * 128*32; @@ -600,6 +603,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) voodoo->aux_row_width = val & 0x3fff; // pclog("auxBufferStride linear = %i bytes, linear\n", voodoo->aux_row_width); } + voodoo->params.aux_row_width = voodoo->aux_row_width; } break; diff --git a/src/vid_voodoo_render.c b/src/vid_voodoo_render.c index 4815db9..2116180 100644 --- a/src/vid_voodoo_render.c +++ b/src/vid_voodoo_render.c @@ -915,19 +915,19 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood if (SLI_ENABLED) { - state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + ((real_y >> 1) * voodoo->row_width)]; - state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + ((real_y >> 1) * voodoo->row_width)) & voodoo->fb_mask]; + state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + ((real_y >> 1) * params->row_width)]; + state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + ((real_y >> 1) * params->row_width)) & voodoo->fb_mask]; } else { - if (voodoo->col_tiled) - state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + (real_y >> 5) * voodoo->row_width + (real_y & 31) * 128]; + if (params->col_tiled) + state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + (real_y >> 5) * params->row_width + (real_y & 31) * 128]; else - state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + (real_y * voodoo->row_width)]; - if (voodoo->aux_tiled) - state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + (real_y >> 5) * voodoo->aux_row_width + (real_y & 31) * 128) & voodoo->fb_mask]; + state->fb_mem = fb_mem = (uint16_t *)&voodoo->fb_mem[params->draw_offset + (real_y * params->row_width)]; + if (params->aux_tiled) + state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + (real_y >> 5) * params->aux_row_width + (real_y & 31) * 128) & voodoo->fb_mask]; else - state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + (real_y * voodoo->row_width)) & voodoo->fb_mask]; + state->aux_mem = aux_mem = (uint16_t *)&voodoo->fb_mem[(params->aux_offset + (real_y * params->row_width)) & voodoo->fb_mask]; } if (voodoo_output) @@ -992,12 +992,12 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood if (params->fbzMode & FBZ_DEPTH_ENABLE) { - uint16_t old_depth = voodoo->aux_tiled ? aux_mem[x_tiled] : aux_mem[x]; + uint16_t old_depth = voodoo->params.aux_tiled ? aux_mem[x_tiled] : aux_mem[x]; DEPTH_TEST((params->fbzMode & FBZ_DEPTH_SOURCE) ? (params->zaColor & 0xffff) : new_depth); } - dat = voodoo->col_tiled ? fb_mem[x_tiled] : fb_mem[x]; + dat = voodoo->params.col_tiled ? fb_mem[x_tiled] : fb_mem[x]; dest_r = (dat >> 8) & 0xf8; dest_g = (dat >> 3) & 0xfc; dest_b = (dat << 3) & 0xf8; @@ -1308,14 +1308,14 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood if (params->fbzMode & FBZ_RGB_WMASK) { - if (voodoo->col_tiled) + if (voodoo->params.col_tiled) fb_mem[x_tiled] = src_b | (src_g << 5) | (src_r << 11); else fb_mem[x] = src_b | (src_g << 5) | (src_r << 11); } if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) { - if (voodoo->aux_tiled) + if (voodoo->params.aux_tiled) aux_mem[x_tiled] = new_depth; else aux_mem[x] = new_depth;