Move Voodoo colour/aux buffer tiled mode flags to params structure. Fixed
crash in 3DMark 2001 demo mode.
This commit is contained in:
parent
8cfb60608e
commit
09a7b468c3
5 changed files with 39 additions and 26 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue