diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/swrast/s_fragprog.c | 131 |
1 files changed, 41 insertions, 90 deletions
diff --git a/src/mesa/swrast/s_fragprog.c b/src/mesa/swrast/s_fragprog.c index 090fd6dd97d..343cdf5bc53 100644 --- a/src/mesa/swrast/s_fragprog.c +++ b/src/mesa/swrast/s_fragprog.c @@ -274,31 +274,18 @@ fetch_vector4_deriv( GLcontext *ctx, } break; case FRAG_ATTRIB_COL0: - if (xOrY == 'X') { - src[0] = span->attrStepX[FRAG_ATTRIB_COL0][0] * (1.0F / CHAN_MAXF); - src[1] = span->attrStepX[FRAG_ATTRIB_COL0][1] * (1.0F / CHAN_MAXF); - src[2] = span->attrStepX[FRAG_ATTRIB_COL0][2] * (1.0F / CHAN_MAXF); - src[3] = span->attrStepX[FRAG_ATTRIB_COL0][3] * (1.0F / CHAN_MAXF); - } - else { - src[0] = span->attrStepY[FRAG_ATTRIB_COL0][0] * (1.0F / CHAN_MAXF); - src[1] = span->attrStepY[FRAG_ATTRIB_COL0][1] * (1.0F / CHAN_MAXF); - src[2] = span->attrStepY[FRAG_ATTRIB_COL0][2] * (1.0F / CHAN_MAXF); - src[3] = span->attrStepY[FRAG_ATTRIB_COL0][3] * (1.0F / CHAN_MAXF); - } - break; case FRAG_ATTRIB_COL1: if (xOrY == 'X') { - src[0] = span->attrStepX[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF); - src[1] = span->attrStepX[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF); - src[2] = span->attrStepX[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF); - src[3] = span->attrStepX[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF); + src[0] = span->attrStepX[source->Index][0] * (1.0F / CHAN_MAXF); + src[1] = span->attrStepX[source->Index][1] * (1.0F / CHAN_MAXF); + src[2] = span->attrStepX[source->Index][2] * (1.0F / CHAN_MAXF); + src[3] = span->attrStepX[source->Index][3] * (1.0F / CHAN_MAXF); } else { - src[0] = span->attrStepY[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF); - src[1] = span->attrStepY[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF); - src[2] = span->attrStepY[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF); - src[3] = span->attrStepY[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF); + src[0] = span->attrStepY[source->Index][0] * (1.0F / CHAN_MAXF); + src[1] = span->attrStepY[source->Index][1] * (1.0F / CHAN_MAXF); + src[2] = span->attrStepY[source->Index][2] * (1.0F / CHAN_MAXF); + src[3] = span->attrStepY[source->Index][3] * (1.0F / CHAN_MAXF); } break; case FRAG_ATTRIB_FOGC: @@ -315,14 +302,9 @@ fetch_vector4_deriv( GLcontext *ctx, src[3] = 0.0; } break; - case FRAG_ATTRIB_TEX0: - case FRAG_ATTRIB_TEX1: - case FRAG_ATTRIB_TEX2: - case FRAG_ATTRIB_TEX3: - case FRAG_ATTRIB_TEX4: - case FRAG_ATTRIB_TEX5: - case FRAG_ATTRIB_TEX6: - case FRAG_ATTRIB_TEX7: + default: + assert(source->Index < FRAG_ATTRIB_MAX); + /* texcoord or varying */ if (xOrY == 'X') { /* this is a little tricky - I think I've got it right */ const GLfloat invQ = 1.0f / (span->attrStart[source->Index][3] @@ -342,8 +324,6 @@ fetch_vector4_deriv( GLcontext *ctx, src[3] = span->attrStepY[source->Index][3] * invQ; } break; - default: - return GL_FALSE; } result[0] = src[GET_SWZ(source->Swizzle, 0)]; @@ -543,7 +523,7 @@ init_machine_deriv( GLcontext *ctx, const SWspan *span, char xOrY, struct fp_machine *dMachine ) { - GLuint u, v; + GLuint attr; ASSERT(xOrY == 'X' || xOrY == 'Y'); @@ -572,34 +552,23 @@ init_machine_deriv( GLcontext *ctx, wpos[3] += span->attrStepY[FRAG_ATTRIB_WPOS][3]; } } - if (program->Base.InputsRead & FRAG_BIT_COL0) { - GLfloat *col0 = machine->Attribs[FRAG_ATTRIB_COL0][machine->CurFrag]; - if (xOrY == 'X') { - col0[0] += span->attrStepX[FRAG_ATTRIB_COL0][0] * (1.0F / CHAN_MAXF); - col0[1] += span->attrStepX[FRAG_ATTRIB_COL0][1] * (1.0F / CHAN_MAXF); - col0[2] += span->attrStepX[FRAG_ATTRIB_COL0][2] * (1.0F / CHAN_MAXF); - col0[3] += span->attrStepX[FRAG_ATTRIB_COL0][3] * (1.0F / CHAN_MAXF); - } - else { - col0[0] += span->attrStepY[FRAG_ATTRIB_COL0][0] * (1.0F / CHAN_MAXF); - col0[1] += span->attrStepY[FRAG_ATTRIB_COL0][1] * (1.0F / CHAN_MAXF); - col0[2] += span->attrStepY[FRAG_ATTRIB_COL0][2] * (1.0F / CHAN_MAXF); - col0[3] += span->attrStepY[FRAG_ATTRIB_COL0][3] * (1.0F / CHAN_MAXF); - } - } - if (program->Base.InputsRead & FRAG_BIT_COL1) { - GLfloat *col1 = machine->Attribs[FRAG_ATTRIB_COL1][machine->CurFrag]; - if (xOrY == 'X') { - col1[0] += span->attrStepX[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF); - col1[1] += span->attrStepX[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF); - col1[2] += span->attrStepX[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF); - col1[3] += span->attrStepX[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF); - } - else { - col1[0] += span->attrStepY[FRAG_ATTRIB_COL1][0] * (1.0F / CHAN_MAXF); - col1[1] += span->attrStepY[FRAG_ATTRIB_COL1][1] * (1.0F / CHAN_MAXF); - col1[2] += span->attrStepY[FRAG_ATTRIB_COL1][2] * (1.0F / CHAN_MAXF); - col1[3] += span->attrStepY[FRAG_ATTRIB_COL1][3] * (1.0F / CHAN_MAXF); + + /* primary, secondary colors */ + for (attr = FRAG_ATTRIB_COL0; attr <= FRAG_ATTRIB_COL1; attr++) { + if (program->Base.InputsRead & (1 << attr)) { + GLfloat *col = machine->Attribs[attr][machine->CurFrag]; + if (xOrY == 'X') { + col[0] += span->attrStepX[attr][0] * (1.0F / CHAN_MAXF); + col[1] += span->attrStepX[attr][1] * (1.0F / CHAN_MAXF); + col[2] += span->attrStepX[attr][2] * (1.0F / CHAN_MAXF); + col[3] += span->attrStepX[attr][3] * (1.0F / CHAN_MAXF); + } + else { + col[0] += span->attrStepY[attr][0] * (1.0F / CHAN_MAXF); + col[1] += span->attrStepY[attr][1] * (1.0F / CHAN_MAXF); + col[2] += span->attrStepY[attr][2] * (1.0F / CHAN_MAXF); + col[3] += span->attrStepY[attr][3] * (1.0F / CHAN_MAXF); + } } } if (program->Base.InputsRead & FRAG_BIT_FOGC) { @@ -611,40 +580,22 @@ init_machine_deriv( GLcontext *ctx, fogc[0] += span->attrStepY[FRAG_ATTRIB_FOGC][0]; } } - for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) { - if (program->Base.InputsRead & FRAG_BIT_TEX(u)) { - GLfloat *tex = machine->Attribs[FRAG_ATTRIB_TEX0 + u][machine->CurFrag]; + /* texcoord and varying vars */ + for (attr = FRAG_ATTRIB_TEX0; attr < FRAG_ATTRIB_MAX; attr++) { + if (program->Base.InputsRead & (1 << attr)) { + GLfloat *val = machine->Attribs[attr][machine->CurFrag]; /* XXX perspective-correct interpolation */ if (xOrY == 'X') { - tex[0] += span->attrStepX[FRAG_ATTRIB_TEX0 + u][0]; - tex[1] += span->attrStepX[FRAG_ATTRIB_TEX0 + u][1]; - tex[2] += span->attrStepX[FRAG_ATTRIB_TEX0 + u][2]; - tex[3] += span->attrStepX[FRAG_ATTRIB_TEX0 + u][3]; - } - else { - tex[0] += span->attrStepY[FRAG_ATTRIB_TEX0 + u][0]; - tex[1] += span->attrStepY[FRAG_ATTRIB_TEX0 + u][1]; - tex[2] += span->attrStepY[FRAG_ATTRIB_TEX0 + u][2]; - tex[3] += span->attrStepY[FRAG_ATTRIB_TEX0 + u][3]; - } - } - } - - for (v = 0; v < ctx->Const.MaxVarying; v++) { - if (program->Base.InputsRead & FRAG_BIT_VAR(v)) { - GLfloat *var = machine->Attribs[FRAG_ATTRIB_VAR0 + v][machine->CurFrag]; - GLuint attr = FRAG_ATTRIB_VAR0 + v; - if (xOrY == 'X') { - var[0] += span->attrStepX[attr][0]; - var[1] += span->attrStepX[attr][1]; - var[2] += span->attrStepX[attr][2]; - var[3] += span->attrStepX[attr][3]; + val[0] += span->attrStepX[attr][0]; + val[1] += span->attrStepX[attr][1]; + val[2] += span->attrStepX[attr][2]; + val[3] += span->attrStepX[attr][3]; } else { - var[0] += span->attrStepY[attr][0]; - var[1] += span->attrStepY[attr][1]; - var[2] += span->attrStepY[attr][2]; - var[3] += span->attrStepY[attr][3]; + val[0] += span->attrStepY[attr][0]; + val[1] += span->attrStepY[attr][1]; + val[2] += span->attrStepY[attr][2]; + val[3] += span->attrStepY[attr][3]; } } } |