Improved Voodoo subpixel correction.
This commit is contained in:
parent
2624745c67
commit
9954a29348
1 changed files with 34 additions and 28 deletions
|
|
@ -1423,10 +1423,10 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
|
||||||
x2 -= (1 << 16);
|
x2 -= (1 << 16);
|
||||||
else
|
else
|
||||||
x -= (1 << 16);
|
x -= (1 << 16);
|
||||||
dx = ((x + 0x7fff) >> 16) - (((params->vertexAx << 12) + 0x7fff) >> 16);
|
dx = ((x + 0x7000) >> 16) - (((params->vertexAx << 12) + 0x7000) >> 16);
|
||||||
start_x2 = x + 0x7fff;
|
start_x2 = x + 0x7000;
|
||||||
x = (x + 0x7fff) >> 16;
|
x = (x + 0x7000) >> 16;
|
||||||
x2 = (x2 + 0x7fff) >> 16;
|
x2 = (x2 + 0x7000) >> 16;
|
||||||
|
|
||||||
if (voodoo_output)
|
if (voodoo_output)
|
||||||
pclog("%03i:%03i : Ax=%08x start_x=%08x dSdX=%016llx dx=%08x s=%08x -> ", x, state->y, params->vertexAx << 8, start_x, params->tmu[0].dTdX, dx, tmu0_t);
|
pclog("%03i:%03i : Ax=%08x start_x=%08x dSdX=%016llx dx=%08x s=%08x -> ", x, state->y, params->vertexAx << 8, start_x, params->tmu[0].dTdX, dx, tmu0_t);
|
||||||
|
|
@ -1445,7 +1445,9 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
|
||||||
pclog("%08llx %lli %lli\n", tmu0_t, tmu0_t >> (18+state->lod), (tmu0_t + (1 << 17+state->lod)) >> (18+state->lod));
|
pclog("%08llx %lli %lli\n", tmu0_t, tmu0_t >> (18+state->lod), (tmu0_t + (1 << 17+state->lod)) >> (18+state->lod));
|
||||||
|
|
||||||
if (params->fbzMode & (1 << 17))
|
if (params->fbzMode & (1 << 17))
|
||||||
state->y = voodoo->v_disp - state->y;
|
real_y = voodoo->v_disp - (real_y >> 4);
|
||||||
|
else
|
||||||
|
real_y >>= 4;
|
||||||
|
|
||||||
if (params->fbzMode & 1)
|
if (params->fbzMode & 1)
|
||||||
{
|
{
|
||||||
|
|
@ -1498,8 +1500,8 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
|
||||||
if (x2 > x && state->xdir < 0)
|
if (x2 > x && state->xdir < 0)
|
||||||
goto next_line;
|
goto next_line;
|
||||||
|
|
||||||
fb_mem = &voodoo->fb_mem[params->draw_offset + (state->y * voodoo->row_width)];
|
fb_mem = &voodoo->fb_mem[params->draw_offset + (real_y * voodoo->row_width)];
|
||||||
aux_mem = &voodoo->fb_mem[params->aux_offset + (state->y * voodoo->row_width)];
|
aux_mem = &voodoo->fb_mem[params->aux_offset + (real_y * voodoo->row_width)];
|
||||||
|
|
||||||
if (voodoo_output)
|
if (voodoo_output)
|
||||||
pclog("%03i: x=%08x x2=%08x xstart=%08x xend=%08x dx=%08x start_x2=%08x\n", state->y, x, x2, state->xstart, state->xend, dx, start_x2);
|
pclog("%03i: x=%08x x2=%08x xstart=%08x xend=%08x dx=%08x start_x2=%08x\n", state->y, x, x2, state->xstart, state->xend, dx, start_x2);
|
||||||
|
|
@ -2057,15 +2059,15 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood
|
||||||
{
|
{
|
||||||
if (dither2x2)
|
if (dither2x2)
|
||||||
{
|
{
|
||||||
src_r = dither_rb2x2[src_r][state->y & 1][x & 1];
|
src_r = dither_rb2x2[src_r][real_y & 1][x & 1];
|
||||||
src_g = dither_g2x2[src_g][state->y & 1][x & 1];
|
src_g = dither_g2x2[src_g][real_y & 1][x & 1];
|
||||||
src_b = dither_rb2x2[src_b][state->y & 1][x & 1];
|
src_b = dither_rb2x2[src_b][real_y & 1][x & 1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
src_r = dither_rb[src_r][state->y & 3][x & 3];
|
src_r = dither_rb[src_r][real_y & 3][x & 3];
|
||||||
src_g = dither_g[src_g][state->y & 3][x & 3];
|
src_g = dither_g[src_g][real_y & 3][x & 3];
|
||||||
src_b = dither_rb[src_b][state->y & 3][x & 3];
|
src_b = dither_rb[src_b][real_y & 3][x & 3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2112,9 +2114,6 @@ skip_pixel:
|
||||||
} while (start_x != x2);
|
} while (start_x != x2);
|
||||||
|
|
||||||
next_line:
|
next_line:
|
||||||
if (params->fbzMode & (1 << 17))
|
|
||||||
state->y = voodoo->v_disp - state->y;
|
|
||||||
|
|
||||||
state->base_r += params->dRdY;
|
state->base_r += params->dRdY;
|
||||||
state->base_g += params->dGdY;
|
state->base_g += params->dGdY;
|
||||||
state->base_b += params->dBdY;
|
state->base_b += params->dBdY;
|
||||||
|
|
@ -2144,22 +2143,29 @@ static void voodoo_triangle(voodoo_t *voodoo, voodoo_params_t *params)
|
||||||
|
|
||||||
voodoo->tri_count++;
|
voodoo->tri_count++;
|
||||||
|
|
||||||
dx = 8 - ((params->vertexAx + 7) & 0xf);
|
dx = 8 - (params->vertexAx & 0xf);
|
||||||
dy = 8 - ((params->vertexAy + 7) & 0xf);
|
if ((params->vertexAx & 0xf) > 8)
|
||||||
|
dx += 16;
|
||||||
|
dy = 8 - (params->vertexAy & 0xf);
|
||||||
|
if ((params->vertexAy & 0xf) > 8)
|
||||||
|
dy += 16;
|
||||||
|
|
||||||
/* pclog("voodoo_triangle %i : vA %f, %f vB %f, %f vC %f, %f f %i\n", tris, (float)params->vertexAx / 16.0, (float)params->vertexAy / 16.0,
|
/* pclog("voodoo_triangle %i : vA %f, %f vB %f, %f vC %f, %f f %i\n", tris, (float)params->vertexAx / 16.0, (float)params->vertexAy / 16.0,
|
||||||
(float)params->vertexBx / 16.0, (float)params->vertexBy / 16.0,
|
(float)params->vertexBx / 16.0, (float)params->vertexBy / 16.0,
|
||||||
(float)params->vertexCx / 16.0, (float)params->vertexCy / 16.0, params->tformat);*/
|
(float)params->vertexCx / 16.0, (float)params->vertexCy / 16.0, params->tformat);*/
|
||||||
|
|
||||||
params->startR += (dx*params->dRdX + dy*params->dRdY) >> 4;
|
if (params->fbzColorPath & FBZ_PARAM_ADJUST)
|
||||||
params->startG += (dx*params->dGdX + dy*params->dGdY) >> 4;
|
{
|
||||||
params->startB += (dx*params->dBdX + dy*params->dBdY) >> 4;
|
params->startR += (dx*params->dRdX + dy*params->dRdY) >> 4;
|
||||||
params->startA += (dx*params->dAdX + dy*params->dAdY) >> 4;
|
params->startG += (dx*params->dGdX + dy*params->dGdY) >> 4;
|
||||||
params->startZ += (dx*params->dZdX + dy*params->dZdY) >> 4;
|
params->startB += (dx*params->dBdX + dy*params->dBdY) >> 4;
|
||||||
params->tmu[0].startS += (dx*params->tmu[0].dSdX + dy*params->tmu[0].dSdY) >> 4;
|
params->startA += (dx*params->dAdX + dy*params->dAdY) >> 4;
|
||||||
params->tmu[0].startT += (dx*params->tmu[0].dTdX + dy*params->tmu[0].dTdY) >> 4;
|
params->startZ += (dx*params->dZdX + dy*params->dZdY) >> 4;
|
||||||
params->tmu[0].startW += (dx*params->tmu[0].dWdX + dy*params->tmu[0].dWdY) >> 4;
|
params->tmu[0].startS += (dx*params->tmu[0].dSdX + dy*params->tmu[0].dSdY) >> 4;
|
||||||
params->startW += (dx*params->dWdX + dy*params->dWdY) >> 4;
|
params->tmu[0].startT += (dx*params->tmu[0].dTdX + dy*params->tmu[0].dTdY) >> 4;
|
||||||
|
params->tmu[0].startW += (dx*params->tmu[0].dWdX + dy*params->tmu[0].dWdY) >> 4;
|
||||||
|
params->startW += (dx*params->dWdX + dy*params->dWdY) >> 4;
|
||||||
|
}
|
||||||
|
|
||||||
tris++;
|
tris++;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue