New span attrStart/attrStepX/attrStepY fields to replace fog, specular, etc. fields. More to come.

This commit is contained in:
Brian
2007-02-02 09:46:43 -07:00
parent 4e7fd7ad96
commit 462d8f5faf
8 changed files with 118 additions and 115 deletions

View File

@@ -72,8 +72,8 @@ _swrast_z_to_fogfactor(GLcontext *ctx, GLfloat z)
*/ */
#define FOG_LOOP(TYPE, COMPUTE_F) \ #define FOG_LOOP(TYPE, COMPUTE_F) \
do { \ do { \
const GLfloat fogStep = span->fogStep; \ const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0]; \
GLfloat fogCoord = span->fog; \ GLfloat fogCoord = span->attrStart[FRAG_ATTRIB_FOGC][0]; \
const GLfloat wStep = haveW ? span->dwdx : 0.0F; \ const GLfloat wStep = haveW ? span->dwdx : 0.0F; \
GLfloat w = haveW ? span->w : 1.0F; \ GLfloat w = haveW ? span->w : 1.0F; \
GLuint i; \ GLuint i; \
@@ -293,8 +293,8 @@ _swrast_fog_ci_span( const GLcontext *ctx, SWspan *span )
const GLfloat fogEnd = ctx->Fog.End; const GLfloat fogEnd = ctx->Fog.End;
const GLfloat fogScale = (ctx->Fog.Start == ctx->Fog.End) const GLfloat fogScale = (ctx->Fog.Start == ctx->Fog.End)
? 1.0F : 1.0F / (ctx->Fog.End - ctx->Fog.Start); ? 1.0F : 1.0F / (ctx->Fog.End - ctx->Fog.Start);
const GLfloat fogStep = span->fogStep; const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0];
GLfloat fogCoord = span->fog; GLfloat fogCoord = span->attrStart[FRAG_ATTRIB_FOGC][0];
const GLfloat wStep = haveW ? span->dwdx : 0.0F; const GLfloat wStep = haveW ? span->dwdx : 0.0F;
GLfloat w = haveW ? span->w : 1.0F; GLfloat w = haveW ? span->w : 1.0F;
GLuint i; GLuint i;
@@ -310,8 +310,8 @@ _swrast_fog_ci_span( const GLcontext *ctx, SWspan *span )
case GL_EXP: case GL_EXP:
{ {
const GLfloat density = -ctx->Fog.Density; const GLfloat density = -ctx->Fog.Density;
const GLfloat fogStep = span->fogStep; const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0];
GLfloat fogCoord = span->fog; GLfloat fogCoord = span->attrStart[FRAG_ATTRIB_FOGC][0];
const GLfloat wStep = haveW ? span->dwdx : 0.0F; const GLfloat wStep = haveW ? span->dwdx : 0.0F;
GLfloat w = haveW ? span->w : 1.0F; GLfloat w = haveW ? span->w : 1.0F;
GLuint i; GLuint i;
@@ -327,8 +327,8 @@ _swrast_fog_ci_span( const GLcontext *ctx, SWspan *span )
case GL_EXP2: case GL_EXP2:
{ {
const GLfloat negDensitySquared = -ctx->Fog.Density * ctx->Fog.Density; const GLfloat negDensitySquared = -ctx->Fog.Density * ctx->Fog.Density;
const GLfloat fogStep = span->fogStep; const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0];
GLfloat fogCoord = span->fog; GLfloat fogCoord = span->attrStart[FRAG_ATTRIB_FOGC][0];
const GLfloat wStep = haveW ? span->dwdx : 0.0F; const GLfloat wStep = haveW ? span->dwdx : 0.0F;
GLfloat w = haveW ? span->w : 1.0F; GLfloat w = haveW ? span->w : 1.0F;
GLuint i; GLuint i;
@@ -368,8 +368,8 @@ _swrast_fog_ci_span( const GLcontext *ctx, SWspan *span )
/* The span's fog start/step values are blend factors. /* The span's fog start/step values are blend factors.
* They were previously computed per-vertex. * They were previously computed per-vertex.
*/ */
const GLfloat fogStep = span->fogStep; const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0];
GLfloat fog = span->fog; GLfloat fog = span->attrStart[FRAG_ATTRIB_FOGC][0];
const GLfloat wStep = haveW ? span->dwdx : 0.0F; const GLfloat wStep = haveW ? span->dwdx : 0.0F;
GLfloat w = haveW ? span->w : 1.0F; GLfloat w = haveW ? span->w : 1.0F;
GLuint i; GLuint i;

View File

@@ -287,27 +287,27 @@ fetch_vector4_deriv( GLcontext *ctx,
break; break;
case FRAG_ATTRIB_COL1: case FRAG_ATTRIB_COL1:
if (xOrY == 'X') { if (xOrY == 'X') {
src[0] = span->dsrdx * (1.0F / CHAN_MAXF); src[0] = span->attrStepX[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF);
src[1] = span->dsgdx * (1.0F / CHAN_MAXF); src[1] = span->attrStepX[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF);
src[2] = span->dsbdx * (1.0F / CHAN_MAXF); src[2] = span->attrStepX[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF);
src[3] = 0.0; /* XXX need this */ src[3] = span->attrStepX[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF);
} }
else { else {
src[0] = span->dsrdy * (1.0F / CHAN_MAXF); src[0] = span->attrStepY[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF);
src[1] = span->dsgdy * (1.0F / CHAN_MAXF); src[1] = span->attrStepY[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF);
src[2] = span->dsbdy * (1.0F / CHAN_MAXF); src[2] = span->attrStepY[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF);
src[3] = 0.0; /* XXX need this */ src[3] = span->attrStepY[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF);
} }
break; break;
case FRAG_ATTRIB_FOGC: case FRAG_ATTRIB_FOGC:
if (xOrY == 'X') { if (xOrY == 'X') {
src[0] = span->dfogdx; src[0] = span->attrStepX[FRAG_ATTRIB_FOGC][0] * (1.0F / CHAN_MAXF);
src[1] = 0.0; src[1] = 0.0;
src[2] = 0.0; src[2] = 0.0;
src[3] = 0.0; src[3] = 0.0;
} }
else { else {
src[0] = span->dfogdy; src[0] = span->attrStepY[FRAG_ATTRIB_FOGC][0] * (1.0F / CHAN_MAXF);
src[1] = 0.0; src[1] = 0.0;
src[2] = 0.0; src[2] = 0.0;
src[3] = 0.0; src[3] = 0.0;
@@ -589,25 +589,25 @@ init_machine_deriv( GLcontext *ctx,
if (program->Base.InputsRead & FRAG_BIT_COL1) { if (program->Base.InputsRead & FRAG_BIT_COL1) {
GLfloat *col1 = machine->Attribs[FRAG_ATTRIB_COL1][machine->CurFrag]; GLfloat *col1 = machine->Attribs[FRAG_ATTRIB_COL1][machine->CurFrag];
if (xOrY == 'X') { if (xOrY == 'X') {
col1[0] += span->dsrdx * (1.0F / CHAN_MAXF); col1[0] += span->attrStepX[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF);
col1[1] += span->dsgdx * (1.0F / CHAN_MAXF); col1[1] += span->attrStepX[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF);
col1[2] += span->dsbdx * (1.0F / CHAN_MAXF); col1[2] += span->attrStepX[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF);
col1[3] += 0.0; /*XXX fix */ col1[3] += span->attrStepX[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF);
} }
else { else {
col1[0] += span->dsrdy * (1.0F / CHAN_MAXF); col1[0] += span->attrStepY[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF);
col1[1] += span->dsgdy * (1.0F / CHAN_MAXF); col1[1] += span->attrStepY[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF);
col1[2] += span->dsbdy * (1.0F / CHAN_MAXF); col1[2] += span->attrStepY[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF);
col1[3] += 0.0; /*XXX fix */ col1[3] += span->attrStepY[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF);
} }
} }
if (program->Base.InputsRead & FRAG_BIT_FOGC) { if (program->Base.InputsRead & FRAG_BIT_FOGC) {
GLfloat *fogc = machine->Attribs[FRAG_ATTRIB_FOGC][machine->CurFrag]; GLfloat *fogc = machine->Attribs[FRAG_ATTRIB_FOGC][machine->CurFrag];
if (xOrY == 'X') { if (xOrY == 'X') {
fogc[0] += span->dfogdx; fogc[0] += span->attrStepX[FRAG_ATTRIB_FOGC][0];
} }
else { else {
fogc[0] += span->dfogdy; fogc[0] += span->attrStepY[FRAG_ATTRIB_FOGC][0];
} }
} }
for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) { for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) {
@@ -632,17 +632,18 @@ init_machine_deriv( GLcontext *ctx,
for (v = 0; v < ctx->Const.MaxVarying; v++) { for (v = 0; v < ctx->Const.MaxVarying; v++) {
if (program->Base.InputsRead & FRAG_BIT_VAR(v)) { if (program->Base.InputsRead & FRAG_BIT_VAR(v)) {
GLfloat *var = machine->Attribs[FRAG_ATTRIB_VAR0 + v][machine->CurFrag]; GLfloat *var = machine->Attribs[FRAG_ATTRIB_VAR0 + v][machine->CurFrag];
GLuint attr = FRAG_ATTRIB_VAR0 + v;
if (xOrY == 'X') { if (xOrY == 'X') {
var[0] += span->varStepX[v][0]; var[0] += span->attrStepX[attr][0];
var[1] += span->varStepX[v][1]; var[1] += span->attrStepX[attr][1];
var[2] += span->varStepX[v][2]; var[2] += span->attrStepX[attr][2];
var[3] += span->varStepX[v][3]; var[3] += span->attrStepX[attr][3];
} }
else { else {
var[0] += span->varStepY[v][0]; var[0] += span->attrStepY[attr][0];
var[1] += span->varStepY[v][1]; var[1] += span->attrStepY[attr][1];
var[2] += span->varStepY[v][2]; var[2] += span->attrStepY[attr][2];
var[3] += span->varStepY[v][3]; var[3] += span->attrStepY[attr][3];
} }
} }
} }

View File

@@ -276,8 +276,8 @@ NAME( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
#endif #endif
#ifdef INTERP_FOG #ifdef INTERP_FOG
interpFlags |= SPAN_FOG; interpFlags |= SPAN_FOG;
span.fog = vert0->fog; span.attrStart[FRAG_ATTRIB_FOGC][0] = vert0->fog;
span.fogStep = (vert1->fog - vert0->fog) / numPixels; span.attrStepX[FRAG_ATTRIB_FOGC][0] = (vert1->fog - vert0->fog) / numPixels;
#endif #endif
#ifdef INTERP_TEX #ifdef INTERP_TEX
interpFlags |= SPAN_TEXTURE; interpFlags |= SPAN_TEXTURE;
@@ -345,23 +345,24 @@ NAME( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
GLuint v; GLuint v;
for (v = 0; v < MAX_VARYING; v++) { for (v = 0; v < MAX_VARYING; v++) {
if (inputsUsed & FRAG_BIT_VAR(v)) { if (inputsUsed & FRAG_BIT_VAR(v)) {
GLuint attr = FRAG_ATTRIB_VAR0 + v;
GLfloat ds, dt, dr, dq; GLfloat ds, dt, dr, dq;
span.var[v][0] = invw0 * vert0->varying[v][0]; span.attrStart[attr][0] = invw0 * vert0->varying[v][0];
span.var[v][1] = invw0 * vert0->varying[v][1]; span.attrStart[attr][1] = invw0 * vert0->varying[v][1];
span.var[v][2] = invw0 * vert0->varying[v][2]; span.attrStart[attr][2] = invw0 * vert0->varying[v][2];
span.var[v][3] = invw0 * vert0->varying[v][3]; span.attrStart[attr][3] = invw0 * vert0->varying[v][3];
ds = (invw1 * vert1->varying[v][0]) - span.var[v][0]; ds = (invw1 * vert1->varying[v][0]) - span.attrStart[attr][0];
dt = (invw1 * vert1->varying[v][1]) - span.var[v][1]; dt = (invw1 * vert1->varying[v][1]) - span.attrStart[attr][1];
dr = (invw1 * vert1->varying[v][2]) - span.var[v][2]; dr = (invw1 * vert1->varying[v][2]) - span.attrStart[attr][2];
dq = (invw1 * vert1->varying[v][3]) - span.var[v][3]; dq = (invw1 * vert1->varying[v][3]) - span.attrStart[attr][3];
span.varStepX[v][0] = ds * invLen; span.attrStepX[attr][0] = ds * invLen;
span.varStepX[v][1] = dt * invLen; span.attrStepX[attr][1] = dt * invLen;
span.varStepX[v][2] = dr * invLen; span.attrStepX[attr][2] = dr * invLen;
span.varStepX[v][3] = dq * invLen; span.attrStepX[attr][3] = dq * invLen;
span.varStepY[v][0] = 0.0F; span.attrStepY[attr][0] = 0.0F;
span.varStepY[v][1] = 0.0F; span.attrStepY[attr][1] = 0.0F;
span.varStepY[v][2] = 0.0F; span.attrStepY[attr][2] = 0.0F;
span.varStepY[v][3] = 0.0F; span.attrStepY[attr][3] = 0.0F;
} }
} }
} }

View File

@@ -107,8 +107,9 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
*/ */
span->interpMask = SPAN_FOG; span->interpMask = SPAN_FOG;
span->arrayMask = SPAN_XY | SPAN_Z; span->arrayMask = SPAN_XY | SPAN_Z;
span->fog = vert->fog; span->attrStart[FRAG_ATTRIB_FOGC][0] = vert->fog;
span->fogStep = 0.0; span->attrStepX[FRAG_ATTRIB_FOGC][0] = 0.0;
span->attrStepY[FRAG_ATTRIB_FOGC][0] = 0.0;
#if FLAGS & RGBA #if FLAGS & RGBA
span->arrayMask |= SPAN_RGBA; span->arrayMask |= SPAN_RGBA;
#endif #endif

View File

@@ -75,8 +75,9 @@ _swrast_span_default_z( GLcontext *ctx, SWspan *span )
void void
_swrast_span_default_fog( GLcontext *ctx, SWspan *span ) _swrast_span_default_fog( GLcontext *ctx, SWspan *span )
{ {
span->fog = _swrast_z_to_fogfactor(ctx, ctx->Current.RasterDistance); span->attrStart[FRAG_ATTRIB_FOGC][0] = _swrast_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
span->fogStep = span->dfogdx = span->dfogdy = 0.0F; span->attrStepX[FRAG_ATTRIB_FOGC][0] = 0.0;
span->attrStepY[FRAG_ATTRIB_FOGC][0] = 0.0;
span->interpMask |= SPAN_FOG; span->interpMask |= SPAN_FOG;
} }
@@ -431,8 +432,8 @@ static INLINE void
interpolate_fog(const GLcontext *ctx, SWspan *span) interpolate_fog(const GLcontext *ctx, SWspan *span)
{ {
GLfloat (*fog)[4] = span->array->attribs[FRAG_ATTRIB_FOGC]; GLfloat (*fog)[4] = span->array->attribs[FRAG_ATTRIB_FOGC];
const GLfloat fogStep = span->fogStep; const GLfloat fogStep = span->attrStepX[FRAG_ATTRIB_FOGC][0];
GLfloat fogCoord = span->fog; GLfloat fogCoord = span->attrStart[FRAG_ATTRIB_FOGC][0];
const GLuint haveW = (span->interpMask & SPAN_W); const GLuint haveW = (span->interpMask & SPAN_W);
const GLfloat wStep = haveW ? span->dwdx : 0.0F; const GLfloat wStep = haveW ? span->dwdx : 0.0F;
GLfloat w = haveW ? span->w : 1.0F; GLfloat w = haveW ? span->w : 1.0F;
@@ -834,16 +835,17 @@ interpolate_varying(GLcontext *ctx, SWspan *span)
for (var = 0; var < MAX_VARYING; var++) { for (var = 0; var < MAX_VARYING; var++) {
if (inputsUsed & FRAG_BIT_VAR(var)) { if (inputsUsed & FRAG_BIT_VAR(var)) {
const GLuint attr = FRAG_ATTRIB_VAR0 + var;
GLuint j; GLuint j;
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
const GLfloat dvdx = span->varStepX[var][j]; const GLfloat dvdx = span->attrStepX[attr][j];
GLfloat v = span->var[var][j]; GLfloat v = span->attrStart[attr][j];
const GLfloat dwdx = span->dwdx; const GLfloat dwdx = span->dwdx;
GLfloat w = span->w; GLfloat w = span->w;
GLuint k; GLuint k;
for (k = 0; k < span->end; k++) { for (k = 0; k < span->end; k++) {
GLfloat invW = 1.0f / w; GLfloat invW = 1.0f / w;
span->array->attribs[FRAG_ATTRIB_VAR0 + var][k][j] = v * invW; span->array->attribs[attr][k][j] = v * invW;
v += dvdx; v += dvdx;
w += dwdx; w += dwdx;
} }

View File

@@ -169,14 +169,15 @@ typedef struct sw_span
#endif #endif
GLfixed index, indexStep; GLfixed index, indexStep;
GLfixed z, zStep; /* XXX z should probably be GLuint */ GLfixed z, zStep; /* XXX z should probably be GLuint */
GLfloat fog, fogStep;
GLfloat tex[MAX_TEXTURE_COORD_UNITS][4]; /* s, t, r, q */ GLfloat tex[MAX_TEXTURE_COORD_UNITS][4]; /* s, t, r, q */
GLfloat texStepX[MAX_TEXTURE_COORD_UNITS][4]; GLfloat texStepX[MAX_TEXTURE_COORD_UNITS][4];
GLfloat texStepY[MAX_TEXTURE_COORD_UNITS][4]; GLfloat texStepY[MAX_TEXTURE_COORD_UNITS][4];
GLfixed intTex[2], intTexStep[2]; /* s, t only */ GLfixed intTex[2], intTexStep[2]; /* s, t only */
GLfloat var[MAX_VARYING][4];
GLfloat varStepX[MAX_VARYING][4]; /** Fragment attribute interpolants */
GLfloat varStepY[MAX_VARYING][4]; GLfloat attrStart[FRAG_ATTRIB_MAX][4]; /**< initial value */
GLfloat attrStepX[FRAG_ATTRIB_MAX][4]; /**< dvalue/dx */
GLfloat attrStepY[FRAG_ATTRIB_MAX][4]; /**< dvalue/dy */
/* partial derivatives wrt X and Y. */ /* partial derivatives wrt X and Y. */
GLfloat dzdx, dzdy; GLfloat dzdx, dzdy;
@@ -185,10 +186,6 @@ typedef struct sw_span
GLfloat dgdx, dgdy; GLfloat dgdx, dgdy;
GLfloat dbdx, dbdy; GLfloat dbdx, dbdy;
GLfloat dadx, dady; GLfloat dadx, dady;
GLfloat dsrdx, dsrdy;
GLfloat dsgdx, dsgdy;
GLfloat dsbdx, dsbdy;
GLfloat dfogdx, dfogdy;
/** /**
* This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates * This bitmask (of \link SpanFlags SPAN_* flags\endlink) indicates

View File

@@ -150,6 +150,7 @@
GLuint iv, ic; \ GLuint iv, ic; \
for (iv = 0; iv < MAX_VARYING; iv++) { \ for (iv = 0; iv < MAX_VARYING; iv++) { \
if (inputsUsed & FRAG_BIT_VAR(iv)) { \ if (inputsUsed & FRAG_BIT_VAR(iv)) { \
GLuint attr = FRAG_ATTRIB_VAR0 + iv; \
for (ic = 0; ic < 4; ic++) { \ for (ic = 0; ic < 4; ic++) { \
CODE \ CODE \
} \ } \
@@ -507,9 +508,8 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
const GLfloat eMaj_dfog = vMax->fog - vMin->fog; const GLfloat eMaj_dfog = vMax->fog - vMin->fog;
const GLfloat eBot_dfog = vMid->fog - vMin->fog; const GLfloat eBot_dfog = vMid->fog - vMin->fog;
# endif # endif
span.dfogdx = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog); span.attrStepX[FRAG_ATTRIB_FOGC][0] = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog);
span.dfogdy = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx); span.attrStepY[FRAG_ATTRIB_FOGC][0] = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx);
span.fogStep = span.dfogdx;
} }
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
@@ -584,26 +584,26 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
GLfloat eBot_dsg = (GLfloat) ((ColorTemp) vMid->specular[GCOMP] - (ColorTemp) vMin->specular[GCOMP]); GLfloat eBot_dsg = (GLfloat) ((ColorTemp) vMid->specular[GCOMP] - (ColorTemp) vMin->specular[GCOMP]);
GLfloat eMaj_dsb = (GLfloat) ((ColorTemp) vMax->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]); GLfloat eMaj_dsb = (GLfloat) ((ColorTemp) vMax->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]);
GLfloat eBot_dsb = (GLfloat) ((ColorTemp) vMid->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]); GLfloat eBot_dsb = (GLfloat) ((ColorTemp) vMid->specular[BCOMP] - (ColorTemp) vMin->specular[BCOMP]);
span.dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr); span.attrStepX[FRAG_ATTRIB_COL1][0] = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr);
span.dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx); span.attrStepY[FRAG_ATTRIB_COL1][0] = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx);
span.dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg); span.attrStepX[FRAG_ATTRIB_COL1][1] = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg);
span.dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx); span.attrStepY[FRAG_ATTRIB_COL1][1] = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx);
span.dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb); span.attrStepX[FRAG_ATTRIB_COL1][2] = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb);
span.dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx); span.attrStepY[FRAG_ATTRIB_COL1][2] = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx);
# if CHAN_TYPE == GL_FLOAT # if CHAN_TYPE == GL_FLOAT
span.specRedStep = span.dsrdx; span.specRedStep = span.attrStep[FRAG_ATTRIB_COL1][0];
span.specGreenStep = span.dsgdx; span.specGreenStep = span.dsgdx;
span.specBlueStep = span.dsbdx; span.specBlueStep = span.dsbdx;
# else # else
span.specRedStep = SignedFloatToFixed(span.dsrdx); span.specRedStep = SignedFloatToFixed(span.attrStepX[FRAG_ATTRIB_COL1][0]);
span.specGreenStep = SignedFloatToFixed(span.dsgdx); span.specGreenStep = SignedFloatToFixed(span.attrStepX[FRAG_ATTRIB_COL1][1]);
span.specBlueStep = SignedFloatToFixed(span.dsbdx); span.specBlueStep = SignedFloatToFixed(span.attrStepX[FRAG_ATTRIB_COL1][2]);
# endif # endif
} }
else { else {
span.dsrdx = span.dsrdy = 0.0F; span.attrStepX[FRAG_ATTRIB_COL1][0] = span.attrStepY[FRAG_ATTRIB_COL1][0] = 0.0F;
span.dsgdx = span.dsgdy = 0.0F; span.attrStepX[FRAG_ATTRIB_COL1][1] = span.attrStepY[FRAG_ATTRIB_COL1][1] = 0.0F;
span.dsbdx = span.dsbdy = 0.0F; span.attrStepX[FRAG_ATTRIB_COL1][2] = span.attrStepY[FRAG_ATTRIB_COL1][2] = 0.0F;
# if CHAN_TYPE == GL_FLOAT # if CHAN_TYPE == GL_FLOAT
span.specRedStep = 0.0F; span.specRedStep = 0.0F;
span.specGreenStep = 0.0F; span.specGreenStep = 0.0F;
@@ -678,8 +678,8 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
VARYING_LOOP( VARYING_LOOP(
GLfloat eMaj_dvar = vMax->varying[iv][ic] * wMax - vMin->varying[iv][ic] * wMin; GLfloat eMaj_dvar = vMax->varying[iv][ic] * wMax - vMin->varying[iv][ic] * wMin;
GLfloat eBot_dvar = vMid->varying[iv][ic] * wMid - vMin->varying[iv][ic] * wMin; GLfloat eBot_dvar = vMid->varying[iv][ic] * wMid - vMin->varying[iv][ic] * wMin;
span.varStepX[iv][ic] = oneOverArea * (eMaj_dvar * eBot.dy - eMaj.dy * eBot_dvar); span.attrStepX[attr][ic] = oneOverArea * (eMaj_dvar * eBot.dy - eMaj.dy * eBot_dvar);
span.varStepY[iv][ic] = oneOverArea * (eMaj.dx * eBot_dvar - eMaj_dvar * eBot.dx); span.attrStepY[attr][ic] = oneOverArea * (eMaj.dx * eBot_dvar - eMaj_dvar * eBot.dx);
) )
} }
#endif #endif
@@ -928,11 +928,11 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
#endif #endif
#ifdef INTERP_FOG #ifdef INTERP_FOG
# ifdef INTERP_W # ifdef INTERP_W
fogLeft = vLower->fog * vLower->win[3] + (span.dfogdx * adjx + span.dfogdy * adjy) * (1.0F/FIXED_SCALE); fogLeft = vLower->fog * vLower->win[3] + (span.attrStepX[FRAG_ATTRIB_FOGC][0] * adjx + span.attrStepY[FRAG_ATTRIB_FOGC][0] * adjy) * (1.0F/FIXED_SCALE);
# else # else
fogLeft = vLower->fog + (span.dfogdx * adjx + span.dfogdy * adjy) * (1.0F/FIXED_SCALE); fogLeft = vLower->fog + (span.attrStepX[FRAG_ATTRIB_FOGC][0] * adjx + span.attrStepY[FRAG_ATTRIB_FOGC][0] * adjy) * (1.0F/FIXED_SCALE);
# endif # endif
dfogOuter = span.dfogdy + dxOuter * span.dfogdx; dfogOuter = span.attrStepY[FRAG_ATTRIB_FOGC][0] + dxOuter * span.attrStepX[FRAG_ATTRIB_FOGC][0];
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
if (ctx->Light.ShadeModel == GL_SMOOTH) { if (ctx->Light.ShadeModel == GL_SMOOTH) {
@@ -990,19 +990,19 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
#ifdef INTERP_SPEC #ifdef INTERP_SPEC
if (ctx->Light.ShadeModel == GL_SMOOTH) { if (ctx->Light.ShadeModel == GL_SMOOTH) {
# if CHAN_TYPE == GL_FLOAT # if CHAN_TYPE == GL_FLOAT
srLeft = vLower->specular[RCOMP] + (span.dsrdx * adjx + span.dsrdy * adjy) * (1.0F / FIXED_SCALE); srLeft = vLower->specular[RCOMP] + (span.attrStepX[FRAG_ATTRIB_COL1][0] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][0] * adjy) * (1.0F / FIXED_SCALE);
sgLeft = vLower->specular[GCOMP] + (span.dsgdx * adjx + span.dsgdy * adjy) * (1.0F / FIXED_SCALE); sgLeft = vLower->specular[GCOMP] + (span.attrStepX[FRAG_ATTRIB_COL1][1] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][1] * adjy) * (1.0F / FIXED_SCALE);
sbLeft = vLower->specular[BCOMP] + (span.dsbdx * adjx + span.dsbdy * adjy) * (1.0F / FIXED_SCALE); sbLeft = vLower->specular[BCOMP] + (span.attrStepX[FRAG_ATTRIB_COL1][2] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][2] * adjy) * (1.0F / FIXED_SCALE);
dsrOuter = span.dsrdy + dxOuter * span.dsrdx; dsrOuter = span.attrStepY[FRAG_ATTRIB_COL1][0] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][0];
dsgOuter = span.dsgdy + dxOuter * span.dsgdx; dsgOuter = span.attrStepY[FRAG_ATTRIB_COL1][1] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][1];
dsbOuter = span.dsbdy + dxOuter * span.dsbdx; dsbOuter = span.attrStepY[FRAG_ATTRIB_COL1][2] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][2];
# else # else
srLeft = (GLfixed) (ChanToFixed(vLower->specular[RCOMP]) + span.dsrdx * adjx + span.dsrdy * adjy) + FIXED_HALF; srLeft = (GLfixed) (ChanToFixed(vLower->specular[RCOMP]) + span.attrStepX[FRAG_ATTRIB_COL1][0] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][0] * adjy) + FIXED_HALF;
sgLeft = (GLfixed) (ChanToFixed(vLower->specular[GCOMP]) + span.dsgdx * adjx + span.dsgdy * adjy) + FIXED_HALF; sgLeft = (GLfixed) (ChanToFixed(vLower->specular[GCOMP]) + span.attrStepX[FRAG_ATTRIB_COL1][1] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][1] * adjy) + FIXED_HALF;
sbLeft = (GLfixed) (ChanToFixed(vLower->specular[BCOMP]) + span.dsbdx * adjx + span.dsbdy * adjy) + FIXED_HALF; sbLeft = (GLfixed) (ChanToFixed(vLower->specular[BCOMP]) + span.attrStepX[FRAG_ATTRIB_COL1][2] * adjx + span.attrStepY[FRAG_ATTRIB_COL1][2] * adjy) + FIXED_HALF;
dsrOuter = SignedFloatToFixed(span.dsrdy + dxOuter * span.dsrdx); dsrOuter = SignedFloatToFixed(span.attrStepY[FRAG_ATTRIB_COL1][0] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][0]);
dsgOuter = SignedFloatToFixed(span.dsgdy + dxOuter * span.dsgdx); dsgOuter = SignedFloatToFixed(span.attrStepY[FRAG_ATTRIB_COL1][1] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][1]);
dsbOuter = SignedFloatToFixed(span.dsbdy + dxOuter * span.dsbdx); dsbOuter = SignedFloatToFixed(span.attrStepY[FRAG_ATTRIB_COL1][2] + dxOuter * span.attrStepX[FRAG_ATTRIB_COL1][2]);
# endif # endif
} }
else { else {
@@ -1068,9 +1068,9 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
VARYING_LOOP( VARYING_LOOP(
const GLfloat invW = vLower->win[3]; const GLfloat invW = vLower->win[3];
const GLfloat var0 = vLower->varying[iv][ic] * invW; const GLfloat var0 = vLower->varying[iv][ic] * invW;
varLeft[iv][ic] = var0 + (span.varStepX[iv][ic] * adjx + varLeft[iv][ic] = var0 + (span.attrStepX[attr][ic] * adjx +
span.varStepY[iv][ic] * adjy) * (1.0f / FIXED_SCALE); span.attrStepY[attr][ic] * adjy) * (1.0f / FIXED_SCALE);
dvarOuter[iv][ic] = span.varStepY[iv][ic] + dxOuter * span.varStepX[iv][ic]; dvarOuter[iv][ic] = span.attrStepY[attr][ic] + dxOuter * span.attrStepX[attr][ic];
) )
#endif #endif
} /*if setupLeft*/ } /*if setupLeft*/
@@ -1105,7 +1105,7 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
dwInner = dwOuter + span.dwdx; dwInner = dwOuter + span.dwdx;
#endif #endif
#ifdef INTERP_FOG #ifdef INTERP_FOG
dfogInner = dfogOuter + span.dfogdx; dfogInner = dfogOuter + span.attrStepX[FRAG_ATTRIB_FOGC][0];
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
fdrInner = fdrOuter + span.redStep; fdrInner = fdrOuter + span.redStep;
@@ -1137,7 +1137,7 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
#endif #endif
#ifdef INTERP_VARYING #ifdef INTERP_VARYING
VARYING_LOOP( VARYING_LOOP(
dvarInner[iv][ic] = dvarOuter[iv][ic] + span.varStepX[iv][ic]; dvarInner[iv][ic] = dvarOuter[iv][ic] + span.attrStepX[attr][ic];
) )
#endif #endif
@@ -1158,7 +1158,7 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
span.w = wLeft; span.w = wLeft;
#endif #endif
#ifdef INTERP_FOG #ifdef INTERP_FOG
span.fog = fogLeft; span.attrStart[FRAG_ATTRIB_FOGC][0] = fogLeft;
#endif #endif
#ifdef INTERP_RGB #ifdef INTERP_RGB
span.red = rLeft; span.red = rLeft;
@@ -1191,7 +1191,7 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
#endif #endif
#ifdef INTERP_VARYING #ifdef INTERP_VARYING
VARYING_LOOP( VARYING_LOOP(
span.var[iv][ic] = varLeft[iv][ic]; span.attrStart[attr][ic] = varLeft[iv][ic];
) )
#endif #endif

View File

@@ -159,8 +159,9 @@ zoom_span( GLcontext *ctx, GLint imgX, GLint imgY, const SWspan *span,
/* copy fog interp info */ /* copy fog interp info */
zoomed.fog = span->fog; zoomed.attrStart[FRAG_ATTRIB_FOGC][0] = span->attrStart[FRAG_ATTRIB_FOGC][0];
zoomed.fogStep = span->fogStep; zoomed.attrStepX[FRAG_ATTRIB_FOGC][0] = span->attrStepX[FRAG_ATTRIB_FOGC][0];
zoomed.attrStepY[FRAG_ATTRIB_FOGC][0] = span->attrStepY[FRAG_ATTRIB_FOGC][0];
/* XXX copy texcoord info? */ /* XXX copy texcoord info? */
if (format == GL_RGBA || format == GL_RGB) { if (format == GL_RGBA || format == GL_RGB) {