diff options
author | Brian Paul <[email protected]> | 2001-09-13 22:12:54 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 2001-09-13 22:12:54 +0000 |
commit | dcbe4d6d2f3eb2c099838875780991da34884646 (patch) | |
tree | d1c074b2d7e458f3459c96ce2a6385ad20e8e27c /src/mesa/swrast/s_triangle.c | |
parent | d22554d2cec07d6a8c11d5aef07835aef8d9a030 (diff) |
minor optimizations for flat shading (Klaus Niederkrueger)
Diffstat (limited to 'src/mesa/swrast/s_triangle.c')
-rw-r--r-- | src/mesa/swrast/s_triangle.c | 117 |
1 files changed, 79 insertions, 38 deletions
diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index 1781c993d97..c1aa1facf14 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -1,4 +1,4 @@ -/* $Id: s_triangle.c,v 1.36 2001/07/26 15:57:49 brianp Exp $ */ +/* $Id: s_triangle.c,v 1.37 2001/09/13 22:12:54 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1011,57 +1011,98 @@ rasterize_span(GLcontext *ctx, const struct triangle_span *span) CHECKARRAY(mLambda, return); if (span->activeMask & SPAN_RGBA) { + if (span->activeMask & SPAN_FLAT) { + GLuint i; + GLchan color[4]; + color[RCOMP] = FixedToChan(span->red); + color[GCOMP] = FixedToChan(span->green); + color[BCOMP] = FixedToChan(span->blue); + color[ACOMP] = FixedToChan(span->alpha); + for (i = 0; i < span->count; i++) { + COPY_CHAN4(rgba[i], color); + } + } + else { + /* smooth interpolation */ #if CHAN_TYPE == GL_FLOAT - GLfloat r = span->red; - GLfloat g = span->green; - GLfloat b = span->blue; - GLfloat a = span->alpha; + GLfloat r = span->red; + GLfloat g = span->green; + GLfloat b = span->blue; + GLfloat a = span->alpha; #else - GLfixed r = span->red; - GLfixed g = span->green; - GLfixed b = span->blue; - GLfixed a = span->alpha; + GLfixed r = span->red; + GLfixed g = span->green; + GLfixed b = span->blue; + GLfixed a = span->alpha; #endif - GLuint i; - for (i = 0; i < span->count; i++) { - rgba[i][RCOMP] = FixedToChan(r); - rgba[i][GCOMP] = FixedToChan(g); - rgba[i][BCOMP] = FixedToChan(b); - rgba[i][ACOMP] = FixedToChan(a); - r += span->redStep; - g += span->greenStep; - b += span->blueStep; - a += span->alphaStep; + GLuint i; + for (i = 0; i < span->count; i++) { + rgba[i][RCOMP] = FixedToChan(r); + rgba[i][GCOMP] = FixedToChan(g); + rgba[i][BCOMP] = FixedToChan(b); + rgba[i][ACOMP] = FixedToChan(a); + r += span->redStep; + g += span->greenStep; + b += span->blueStep; + a += span->alphaStep; + } } } + if (span->activeMask & SPAN_SPEC) { + if (span->activeMask & SPAN_FLAT) { + const GLchan r = FixedToChan(span->specRed); + const GLchan g = FixedToChan(span->specGreen); + const GLchan b = FixedToChan(span->specBlue); + GLuint i; + for (i = 0; i < span->count; i++) { + spec[i][RCOMP] = r; + spec[i][GCOMP] = g; + spec[i][BCOMP] = b; + } + } + else { + /* smooth interpolation */ #if CHAN_TYPE == GL_FLOAT - GLfloat r = span->specRed; - GLfloat g = span->specGreen; - GLfloat b = span->specBlue; + GLfloat r = span->specRed; + GLfloat g = span->specGreen; + GLfloat b = span->specBlue; #else - GLfixed r = span->specRed; - GLfixed g = span->specGreen; - GLfixed b = span->specBlue; + GLfixed r = span->specRed; + GLfixed g = span->specGreen; + GLfixed b = span->specBlue; #endif - GLuint i; - for (i = 0; i < span->count; i++) { - spec[i][RCOMP] = FixedToChan(r); - spec[i][GCOMP] = FixedToChan(g); - spec[i][BCOMP] = FixedToChan(b); - r += span->specRedStep; - g += span->specGreenStep; - b += span->specBlueStep; + GLuint i; + for (i = 0; i < span->count; i++) { + spec[i][RCOMP] = FixedToChan(r); + spec[i][GCOMP] = FixedToChan(g); + spec[i][BCOMP] = FixedToChan(b); + r += span->specRedStep; + g += span->specGreenStep; + b += span->specBlueStep; + } } } + if (span->activeMask & SPAN_INDEX) { - GLuint i; - GLfixed ind = span->index; - for (i = 0; i < span->count; i++) { - index[i] = FixedToInt(ind); - ind += span->indexStep; + if (span->activeMask & SPAN_FLAT) { + GLuint i; + const GLint indx = FixedToInt(span->index); + for (i = 0; i < span->count; i++) { + index[i] = indx; + } + } + else { + /* smooth interpolation */ + GLuint i; + GLfixed ind = span->index; + for (i = 0; i < span->count; i++) { + index[i] = FixedToInt(ind); + ind += span->indexStep; + } } } + if (span->activeMask & SPAN_Z) { if (ctx->Visual.depthBits <= 16) { GLuint i; |