diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/swrast/s_aatritemp.h | 130 | ||||
| -rw-r--r-- | src/mesa/swrast/s_alpha.c | 4 | ||||
| -rw-r--r-- | src/mesa/swrast/s_depth.c | 5 | ||||
| -rw-r--r-- | src/mesa/swrast/s_drawpix.c | 3 | ||||
| -rw-r--r-- | src/mesa/swrast/s_fog.c | 11 | ||||
| -rw-r--r-- | src/mesa/swrast/s_span.c | 855 | ||||
| -rw-r--r-- | src/mesa/swrast/s_span.h | 20 | ||||
| -rw-r--r-- | src/mesa/swrast/s_stencil.c | 4 | ||||
| -rw-r--r-- | src/mesa/swrast/s_texture.c | 52 | ||||
| -rw-r--r-- | src/mesa/swrast/s_texture.h | 5 | ||||
| -rw-r--r-- | src/mesa/swrast/s_triangle.c | 121 | ||||
| -rw-r--r-- | src/mesa/swrast/s_zoom.c | 7 | ||||
| -rw-r--r-- | src/mesa/swrast/swrast.h | 13 | 
13 files changed, 249 insertions, 981 deletions
| diff --git a/src/mesa/swrast/s_aatritemp.h b/src/mesa/swrast/s_aatritemp.h index 91571cb374..e142c6fb27 100644 --- a/src/mesa/swrast/s_aatritemp.h +++ b/src/mesa/swrast/s_aatritemp.h @@ -1,4 +1,4 @@ -/* $Id: s_aatritemp.h,v 1.24 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_aatritemp.h,v 1.25 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -268,7 +268,7 @@        GLint iy;        for (iy = iyMin; iy < iyMax; iy++, x += dxdy) {           GLint ix, startX = (GLint) (x - xAdj); -         GLuint count, n; +         GLuint count;           GLfloat coverage = 0.0F;           SW_SPAN_RESET(span); @@ -343,42 +343,15 @@           if (ix <= startX)              continue; -         n = (GLuint) ix - (GLuint) startX; - -#ifdef DO_MULTITEX -#  ifdef DO_SPEC -         _old_write_multitexture_span(ctx, n, startX, iy, span.zArray, -                                      span.fogArray, -				      span.texcoords, -				      span.lambda, span.color.rgba, -				      span.specArray, -				      span.coverage,  GL_POLYGON); -#  else -         _old_write_multitexture_span(ctx, n, startX, iy, span.zArray, -                                      span.fogArray, -				      span.texcoords, -				      span.lambda, span.color.rgba, -				      NULL, span.coverage, -				      GL_POLYGON); -#  endif -#elif defined(DO_TEX) -           span.x = startX;           span.y = iy; -         span.end = n; +         span.end = (GLuint) ix - (GLuint) startX; +         ASSERT(span.interpMask == 0); +#if defined(DO_MULTITEX) || defined(DO_TEX)           _mesa_write_texture_span(ctx, &span, GL_POLYGON); -  #elif defined(DO_RGBA) -         span.x = startX; -         span.y = iy; -         span.end = n; -         ASSERT(span.interpMask == 0);           _mesa_write_rgba_span(ctx, &span, GL_POLYGON);  #elif defined(DO_INDEX) -         span.x = startX; -         span.y = iy; -         span.end = n; -         ASSERT(span.interpMask == 0);           _mesa_write_index_span(ctx, &span, GL_POLYGON);  #endif        } @@ -479,7 +452,38 @@           n = (GLuint) startX - (GLuint) ix;           left = ix + 1; + +         /* shift all values to the left */ +         /* XXX this is temporary */ +         { +            GLint j; +            for (j = 0; j < (GLint) n; j++) { +#ifdef DO_RGBA +               COPY_4V(span.color.rgba[j], span.color.rgba[j + left]); +#endif +#ifdef DO_SPEC +               COPY_4V(span.specArray[j], span.specArray[j + left]); +#endif +#ifdef DO_INDEX +               span.color.index[j] = span.color.index[j + left]; +#endif +#ifdef DO_Z +               span.zArray[j] = span.zArray[j + left]; +#endif +#ifdef DO_FOG +               span.fogArray[j] = span.fogArray[j + left]; +#endif +#ifdef DO_TEX +               COPY_4V(span.texcoords[0][j], span.texcoords[0][j + left]); +#endif +#if defined(DO_MULTITEX) || defined(DO_TEX) +               span.lambda[0][j] = span.lambda[0][j + left]; +#endif +               span.coverage[j] = span.coverage[j + left]; +            } +         }  #ifdef DO_MULTITEX +         /* shift texcoords */           {              GLuint unit;              for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { @@ -494,73 +498,17 @@                 }              }           } -#  ifdef DO_SPEC -         _old_write_multitexture_span(ctx, n, left, iy, span.zArray + left, -                                      span.fogArray + left, -				      span.texcoords, span.lambda, -				      span.color.rgba + left, -				      span.specArray + left, -				      span.coverage + left, -				      GL_POLYGON); -#  else -         _old_write_multitexture_span(ctx, n, left, iy, span.zArray + left, -                                      span.fogArray + left, -				      span.texcoords, span.lambda, -				      span.color.rgba + left, NULL, -				      span.coverage + left, -				      GL_POLYGON); -#  endif -#elif defined(DO_TEX) +#endif -         /* XXX this is temporary */ -         { -            GLint j; -            for (j = 0; j < (GLint) n; j++) { -               span.fogArray[j] = span.fogArray[j + left]; -               span.zArray[j] = span.zArray[j + left]; -               COPY_4V(span.color.rgba[j], span.color.rgba[j + left]); -               COPY_4V(span.specArray[j], span.specArray[j + left]); -               COPY_4V(span.texcoords[0][j], span.texcoords[0][j + left]); -               span.lambda[0][j] = span.lambda[0][j + left]; -               span.coverage[j] = span.coverage[j + left]; -            } -         }           span.x = left;           span.y = iy;           span.end = n; +         ASSERT(span.interpMask == 0); +#if defined(DO_MULTITEX) || defined(DO_TEX)           _mesa_write_texture_span(ctx, &span, GL_POLYGON); -  #elif defined(DO_RGBA) -         /* XXX this is temporary */ -         { -            GLint j; -            for (j = 0; j < (GLint) n; j++) { -               span.fogArray[j] = span.fogArray[j + left]; -               span.zArray[j] = span.zArray[j + left]; -               COPY_4V(span.color.rgba[j], span.color.rgba[j + left]); -               span.coverage[j] = span.coverage[j + left]; -            } -         } -         span.x = left; -         span.y = iy; -         span.end = n; -         ASSERT(span.interpMask == 0);           _mesa_write_rgba_span(ctx, &span, GL_POLYGON);  #elif defined(DO_INDEX) -         /* XXX this is temporary */ -         { -            GLint j; -            for (j = 0; j < (GLint) n; j++) { -               span.fogArray[j] = span.fogArray[j + left]; -               span.zArray[j] = span.zArray[j + left]; -               span.color.index[j] = span.color.index[j + left]; -               span.coverage[j] = span.coverage[j + left]; -            } -         } -         span.x = left; -         span.y = iy; -         span.end = n; -         ASSERT(span.interpMask == 0);           _mesa_write_index_span(ctx, &span, GL_POLYGON);  #endif        } diff --git a/src/mesa/swrast/s_alpha.c b/src/mesa/swrast/s_alpha.c index ca34c120b4..7ee0f1b118 100644 --- a/src/mesa/swrast/s_alpha.c +++ b/src/mesa/swrast/s_alpha.c @@ -1,4 +1,4 @@ -/* $Id: s_alpha.c,v 1.6 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_alpha.c,v 1.7 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -49,7 +49,7 @@ _mesa_alpha_test( const GLcontext *ctx, struct sw_span *span,     const GLchan ref = ctx->Color.AlphaRef;     GLubyte *mask = span->mask; -   ASSERT (span->filledAlpha == GL_TRUE || (span->arrayMask & SPAN_RGBA)); +   ASSERT(span->arrayMask & SPAN_RGBA);     /* switch cases ordered from most frequent to less frequent */     switch (ctx->Color.AlphaFunc) { diff --git a/src/mesa/swrast/s_depth.c b/src/mesa/swrast/s_depth.c index 3a3f1904d0..1962dbef78 100644 --- a/src/mesa/swrast/s_depth.c +++ b/src/mesa/swrast/s_depth.c @@ -1,4 +1,4 @@ -/* $Id: s_depth.c,v 1.12 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_depth.c,v 1.13 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -572,8 +572,7 @@ _mesa_depth_test_span( GLcontext *ctx, struct sw_span *span)  {     SWcontext *swrast = SWRAST_CONTEXT(ctx); -   ASSERT((span->interpMask & SPAN_Z) || (span->arrayMask & SPAN_Z)); -   ASSERT((span->filledDepth == GL_TRUE) || (span->arrayMask & SPAN_Z)); +   ASSERT(span->arrayMask & SPAN_Z);     if (swrast->Driver.ReadDepthSpan) {        /* hardware-based depth buffer */ diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index 4be186bb91..94dea3d510 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -1,4 +1,4 @@ -/* $Id: s_drawpix.c,v 1.26 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_drawpix.c,v 1.27 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -634,7 +634,6 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,           span.x = x;           span.y = y;           span.end = drawWidth; -         span.filledDepth = GL_TRUE;  /* XXX temporary */           _mesa_write_rgba_span(ctx, &span, GL_BITMAP);        }     } diff --git a/src/mesa/swrast/s_fog.c b/src/mesa/swrast/s_fog.c index 4d9af9bb52..e123ff5d9a 100644 --- a/src/mesa/swrast/s_fog.c +++ b/src/mesa/swrast/s_fog.c @@ -1,4 +1,4 @@ -/* $Id: s_fog.c,v 1.18 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_fog.c,v 1.19 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -85,7 +85,6 @@ _mesa_fog_rgba_pixels( const GLcontext *ctx, struct sw_span *span,     GLfloat fog = span->fog, Dfog = span->fogStep;     GLchan rFog, gFog, bFog; -   /*   printf("%s\n", __FUNCTION__);*/     ASSERT(ctx->Fog.Enabled);     ASSERT(span->interpMask & SPAN_FOG);     ASSERT(span->filledColor == GL_TRUE || (span->arrayMask & SPAN_RGBA)); @@ -119,7 +118,6 @@ _mesa_fog_rgba_pixels_with_array( const GLcontext *ctx, struct sw_span *span,     GLuint i;     GLchan rFog, gFog, bFog; -   /*   printf("%s\n", __FUNCTION__);*/     ASSERT(fog != NULL);     ASSERT(ctx->Fog.Enabled);     ASSERT(span->filledColor == GL_TRUE || (span->arrayMask & SPAN_RGBA)); @@ -153,7 +151,6 @@ _old_fog_rgba_pixels( const GLcontext *ctx,     GLuint i;     GLchan rFog, gFog, bFog; -   /*   printf("%s\n", __FUNCTION__);*/     UNCLAMPED_FLOAT_TO_CHAN(rFog, ctx->Fog.Color[RCOMP]);     UNCLAMPED_FLOAT_TO_CHAN(gFog, ctx->Fog.Color[GCOMP]);     UNCLAMPED_FLOAT_TO_CHAN(bFog, ctx->Fog.Color[BCOMP]); @@ -185,7 +182,7 @@ _mesa_fog_ci_pixels( const GLcontext *ctx, struct sw_span *span,     ASSERT(ctx->Fog.Enabled);     ASSERT(span->interpMask & SPAN_FOG); -   ASSERT(span->interpMask & SPAN_INDEX); +   ASSERT(span->arrayMask & SPAN_INDEX);     for (i = 0; i < span->end; i++) {        const GLfloat f = CLAMP(fog, 0.0F, 1.0F); @@ -396,11 +393,9 @@ _mesa_depth_fog_rgba_pixels(const GLcontext *ctx, struct sw_span *span,  {     GLfloat fogFact[PB_SIZE]; -   /*   printf("%s\n", __FUNCTION__);*/     ASSERT(ctx->Fog.Enabled);     ASSERT(span->arrayMask & SPAN_Z);     ASSERT(span->end <= PB_SIZE); -   ASSERT((span->filledDepth) == GL_TRUE || (span->arrayMask & SPAN_Z));     compute_fog_factors_from_z(ctx, span->end, span->zArray, fogFact );     _mesa_fog_rgba_pixels_with_array( ctx, span, fogFact, rgba ); @@ -420,7 +415,6 @@ _old_depth_fog_rgba_pixels( const GLcontext *ctx,  {     GLfloat fogFact[PB_SIZE];     ASSERT(n <= PB_SIZE); -   /*   printf("%s\n", __FUNCTION__);*/     compute_fog_factors_from_z( ctx, n, z, fogFact );     _old_fog_rgba_pixels( ctx, n, fogFact, rgba );  } @@ -442,7 +436,6 @@ _mesa_depth_fog_ci_pixels( const GLcontext *ctx, struct sw_span *span,     ASSERT(ctx->Fog.Enabled);     ASSERT(span->arrayMask & SPAN_Z);     ASSERT(span->end <= PB_SIZE); -   ASSERT((span->filledDepth == GL_TRUE) || (span->arrayMask & SPAN_Z));     compute_fog_factors_from_z(ctx, span->end, span->zArray, fogFact );     _mesa_fog_ci_pixels_with_array( ctx, span, fogFact, index ); diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index 4e4bdf298f..489a494a7f 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -1,4 +1,4 @@ -/* $Id: s_span.c,v 1.24 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_span.c,v 1.25 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -139,11 +139,6 @@ interpolate_colors(GLcontext *ctx, struct sw_span *span)     ASSERT(span->interpMask & SPAN_RGBA); -   /* -   SW_SPAN_SET_FLAG(span->filledColor); -   SW_SPAN_SET_FLAG(span->filledAlpha); -   */ -     if (span->interpMask & SPAN_FLAT) {        /* constant color */        GLchan color[4]; @@ -251,8 +246,6 @@ interpolate_z(GLcontext *ctx, struct sw_span *span)     ASSERT(span->interpMask & SPAN_Z); -   /*   SW_SPAN_SET_FLAG(span->filledDepth);*/ -           if (ctx->Visual.depthBits <= 16) {        GLfixed zval = span->z;        for (i = 0; i < n; i++) { @@ -294,8 +287,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)                 GLfloat r = span->tex[u][2];                 GLfloat q = span->tex[u][3];                 GLuint i; -               SW_SPAN_SET_FLAG(span->filledLambda[u]); -               SW_SPAN_SET_FLAG(span->filledTex[u]);                 for (i = 0; i < span->end; i++) {                    const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);                    span->texcoords[u][i][0] = s * invQ; @@ -326,7 +317,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)                 GLfloat r = span->tex[u][2];                 GLfloat q = span->tex[u][3];                 GLuint i; -               SW_SPAN_SET_FLAG(span->filledTex[u]);                 for (i = 0; i < span->end; i++) {                    const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);                    span->texcoords[u][i][0] = s * invQ; @@ -342,13 +332,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)        }     }     else { -#ifdef DEBUG -      {GLint i; -      for (i=0; i<ctx->Const.MaxTextureUnits; i++) { -         ASSERT(span->filledTex[i] == GL_FALSE  && -                span->filledLambda[i] == GL_FALSE); -      }} -#endif        if (span->interpMask & SPAN_LAMBDA) {           /* just texture unit 0, with lambda */           const GLfloat ds = span->texStep[0][0]; @@ -360,8 +343,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)           GLfloat r = span->tex[0][2];           GLfloat q = span->tex[0][3];           GLuint i; -         SW_SPAN_SET_FLAG(span->filledLambda[0]); -         SW_SPAN_SET_FLAG(span->filledTex[0]);           for (i = 0; i < span->end; i++) {              const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);              span->texcoords[0][i][0] = s * invQ; @@ -387,7 +368,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)           GLfloat r = span->tex[0][2];           GLfloat q = span->tex[0][3];           GLuint i; -         SW_SPAN_SET_FLAG(span->filledTex[0]);           for (i = 0; i < span->end; i++) {              const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q);              span->texcoords[0][i][0] = s * invQ; @@ -407,31 +387,6 @@ interpolate_texcoords(GLcontext *ctx, struct sw_span *span)   * Apply the current polygon stipple pattern to a span of pixels.   */  static void -old_stipple_polygon_span( GLcontext *ctx, GLuint n, GLint x, GLint y, -                      GLubyte mask[] ) -{ -   const GLuint highbit = 0x80000000; -   GLuint i, m, stipple; - -   stipple = ctx->PolygonStipple[y % 32]; -   m = highbit >> (GLuint) (x % 32); - -   for (i = 0; i < n; i++) { -      if ((m & stipple) == 0) { -         mask[i] = 0; -      } -      m = m >> 1; -      if (m == 0) { -         m = highbit; -      } -   } -} - - -/* - * Apply the current polygon stipple pattern to a span of pixels. - */ -static void  stipple_polygon_span( GLcontext *ctx, struct sw_span *span)  {     const GLuint highbit = 0x80000000; @@ -453,49 +408,6 @@ stipple_polygon_span( GLcontext *ctx, struct sw_span *span)  } - -/* - * Clip a pixel span to the current buffer/window boundaries. - * Return:  'n' such that pixel 'n', 'n+1' etc. are clipped, - *           as a special case: - *           0 = all pixels clipped - */ -static GLuint -old_clip_span( GLcontext *ctx, GLint n, GLint x, GLint y, GLubyte mask[] ) -{ -   /* Clip to top and bottom */ -   if (y < 0 || y >= ctx->DrawBuffer->Height) { -      return 0; -   } - -   /* Clip to the left */ -   if (x < 0) { -      if (x + n <= 0) { -         /* completely off left side */ -         return 0; -      } -      else { -         /* partially off left side */ -         BZERO(mask, -x * sizeof(GLubyte)); -      } -   } - -   /* Clip to right */ -   if (x + n > ctx->DrawBuffer->Width) { -      if (x >= ctx->DrawBuffer->Width) { -         /* completely off right side */ -         return 0; -      } -      else { -         /* partially off right side */ -         return ctx->DrawBuffer->Width - x; -      } -   } - -   return n; -} - -  /*   * Clip a pixel span to the current buffer/window boundaries.   * Return:   GL_TRUE   some pixel still visible @@ -596,6 +508,8 @@ multi_write_index_span( GLcontext *ctx, GLuint n, GLint x, GLint y,  /*   * Draw to more than one RGBA color buffer (or none). + * All fragment operations, up to (but not) blending/logicop should + * have been done first.   */  static void  multi_write_rgba_span( GLcontext *ctx, GLuint n, GLint x, GLint y, @@ -845,45 +759,26 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span,        }     } -   /* I have to think where to put this!! */ -   if (span->interpMask & SPAN_Z) { -#ifdef DEBUG -      span->filledDepth = GL_TRUE; -#endif -       -      if (ctx->Visual.depthBits <= 16) { -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = FixedToInt(zval); -            zval += span->zStep; +   /* Stencil and Z testing */ +   if (ctx->Stencil.Enabled || ctx->Depth.Test) { +      if (span->interpMask & SPAN_Z) +         interpolate_z(ctx, span); + +      if (ctx->Stencil.Enabled) { +         if (!_mesa_stencil_and_ztest_span(ctx, span)) { +            span->arrayMask = origArrayMask; +            return;           }        }        else { -         /* Deep Z buffer, no fixed->int shift */ -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = zval; -            zval += span->zStep; +         ASSERT(ctx->Depth.Test); +         ASSERT(span->arrayMask & SPAN_Z); +         /* regular depth testing */ +         if (!_mesa_depth_test_span(ctx, span)) { +            span->arrayMask = origArrayMask; +            return;           }        } -      span->arrayMask |= SPAN_Z; -   } - -   if (ctx->Stencil.Enabled) { -      /* first stencil test */ -      if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE) { -         span->arrayMask = origArrayMask; -         return; -      } -   } -   else if (ctx->Depth.Test) { -      /* regular depth testing */ -      if (_mesa_depth_test_span(ctx, span) == GL_FALSE) { -         span->arrayMask = origArrayMask; -	 return; -      }     }     /* if we get here, something passed the depth test */ @@ -895,8 +790,11 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span,  	 _mesa_fog_rgba_pixels_with_array( ctx, span, span->fogArray, rgba);        else if ((span->interpMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog)           _mesa_fog_rgba_pixels( ctx, span, rgba ); -      else +      else { +         if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0) +            interpolate_z(ctx, span);           _mesa_depth_fog_rgba_pixels( ctx, span, rgba ); +      }     }     /* Antialias coverage application */ @@ -985,7 +883,9 @@ _mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,     /* Do the alpha test */     if (ctx->Color.AlphaEnabled) { -      SW_SPAN_SET_FLAG(span->filledAlpha); +      if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) +         interpolate_colors(ctx, span); +        for (i = 0; i < span->end; i++) {           rgba[i][ACOMP] = color[ACOMP];        } @@ -994,29 +894,8 @@ _mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,        }     } -   /* I have to think where to put this!! */ -   if (span->interpMask & SPAN_Z) { -      SW_SPAN_SET_FLAG(span->filledDepth); -       -      if (ctx->Visual.depthBits <= 16) { -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = FixedToInt(zval); -            zval += span->zStep; -         } -      } -      else { -         /* Deep Z buffer, no fixed->int shift */ -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = zval; -            zval += span->zStep; -         } -      } -      span->arrayMask |= SPAN_Z; -   } +   if (span->interpMask & SPAN_Z) +      interpolate_z(ctx, span);     if (ctx->Stencil.Enabled) {        /* first stencil test */ @@ -1130,26 +1009,22 @@ _mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,  /*   * Add specular color to base color.  This is used only when - * GL_LIGHT_MODEL_COLOR_CONTROL = GL_SEPARATE_SPECULAR_COLOR - * or GL_COLOR_SUM_EXT is enabled. + * GL_LIGHT_MODEL_COLOR_CONTROL = GL_SEPARATE_SPECULAR_COLOR.   */  static void -add_colors(CONST struct sw_span *span, GLchan rgba[][4]) +add_colors(GLuint n, GLchan rgba[][4], GLchan specular[][4] )  {     GLuint i; -   assert(span->arrayMask & SPAN_RGBA); -   assert(span->arrayMask & SPAN_SPEC); - -   for (i = 0; i < span->end; i++) { +   for (i = 0; i < n; i++) {  #if CHAN_TYPE == GL_FLOAT        /* no clamping */ -      rgba[i][RCOMP] += span->specArray[i][RCOMP]; -      rgba[i][GCOMP] += span->specArray[i][GCOMP]; -      rgba[i][BCOMP] += span->specArray[i][BCOMP]; +      rgba[i][RCOMP] += specular[i][RCOMP]; +      rgba[i][GCOMP] += specular[i][GCOMP]; +      rgba[i][BCOMP] += specular[i][BCOMP];  #else -      GLint r = rgba[i][RCOMP] + span->specArray[i][RCOMP]; -      GLint g = rgba[i][GCOMP] + span->specArray[i][GCOMP]; -      GLint b = rgba[i][BCOMP] + span->specArray[i][BCOMP]; +      GLint r = rgba[i][RCOMP] + specular[i][RCOMP]; +      GLint g = rgba[i][GCOMP] + specular[i][GCOMP]; +      GLint b = rgba[i][BCOMP] + specular[i][BCOMP];        rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);        rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);        rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX); @@ -1159,32 +1034,32 @@ add_colors(CONST struct sw_span *span, GLchan rgba[][4])  /* - * Write a horizontal span of textured pixels to the frame buffer. - * The color of each pixel is different. - * Alpha-testing, stenciling, depth-testing, and blending are done - * as needed. - * Input:  span - contains span-data with the exception of - *         fog - array of fog factor values in [0,1] - *         primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP. + * This function may modify any of the array values in the span. + * span->arrayMask, however, will not be modified (or we'll + * restore it to the original incoming value before returning.   */  void  _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span, -			 GLenum primitive ) +                          GLenum primitive )  {     const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); -   GLchan rgbaBackup[MAX_WIDTH][4]; -   GLchan (*rgba)[4];   /* points to either rgbaIn or rgbaBackup */     SWcontext *swrast = SWRAST_CONTEXT(ctx); +   const GLuint origArrayMask = span->arrayMask; + +   /*   printf("%s()  interp 0x%x  array 0x%x\n", __FUNCTION__, span->interpMask, span->arrayMask);*/ + +   ASSERT(ctx->Texture._ReallyEnabled);     MEMSET(span->mask, 1, span->end); +   /* clip against window bounds */     if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {        if (clip_span(ctx,span) == GL_FALSE) {  	 return;        }     } -   /* Do the scissor test */ +   /* Scissor test */     if (ctx->Scissor.Enabled) {        if (_mesa_scissor_span( ctx, span ) == GL_FALSE) {           return; @@ -1196,300 +1071,109 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span,        stipple_polygon_span( ctx, span);     } - -   if (primitive==GL_BITMAP || (swrast->_RasterMask & MULTI_DRAW_BIT)) { -      /* must make a copy of the colors since they may be modified */ -      MEMCPY(rgbaBackup, span->color.rgba, 4 * span->end * sizeof(GLchan)); -      rgba = rgbaBackup; -   } -   else { -      rgba = span->color.rgba; -   } - +   /* Need texture coordinates now */ +   if ((span->interpMask & SPAN_TEXTURE) +       && (span->arrayMask & SPAN_TEXTURE) == 0) +      interpolate_texcoords(ctx, span);     /* Texture with alpha test */     if (ctx->Color.AlphaEnabled) { + +      /* Now we need the rgba array, fill it in if needed */ +      if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) +         interpolate_colors(ctx, span); +        /* Texturing without alpha is done after depth-testing which -         gives a potential speed-up. */ -      ASSERT(ctx->Texture._ReallyEnabled); -      _swrast_texture_fragments( ctx, 0, span, rgba ); +       * gives a potential speed-up. +       */ +      _swrast_multitexture_fragments( ctx, span );        /* Do the alpha test */ -      if (_mesa_alpha_test( ctx, span, (const GLchan (*)[4]) rgba ) == 0) { +      if (!_old_alpha_test(ctx, span->end, +                           (CONST GLchan (*)[4]) span->color.rgba, +                           span->mask)) { +         span->arrayMask = origArrayMask;           return;        }     } -   if (ctx->Stencil.Enabled) { -      /* first stencil test */ -      if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE) -	 return; -   } -   else if (ctx->Depth.Test) { -      /* regular depth testing */ -      if (_mesa_depth_test_span(ctx, span) == 0) -	 return; -   } - -   /* if we get here, something passed the depth test */ -   ctx->OcclusionResult = GL_TRUE; - -   /* Texture without alpha test */ -   if (! ctx->Color.AlphaEnabled) { -      ASSERT(ctx->Texture._ReallyEnabled); -      _swrast_texture_fragments( ctx, 0, span, rgba ); -   } - +   /* Stencil and Z testing */ +   if (ctx->Stencil.Enabled || ctx->Depth.Test) { +      if (span->interpMask & SPAN_Z) +         interpolate_z(ctx, span); -   /* Add base and specular colors */ -   if ((span->arrayMask & SPAN_SPEC) && /* Is this right test ???*/ -       (ctx->Fog.ColorSumEnabled || -	(ctx->Light.Enabled && -         ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))) { -      add_colors(span, rgba);   /* rgba = rgba + span->spec */ -   } - -   /* Per-pixel fog */ -   if (ctx->Fog.Enabled) { -      if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog) -	 _mesa_fog_rgba_pixels_with_array( ctx, span, span->fogArray, rgba); -      else if ((span->interpMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog) -	 _mesa_fog_rgba_pixels( ctx, span, rgba ); -      else -	 _mesa_depth_fog_rgba_pixels(ctx, span, rgba); -   } - - -   /* Antialias coverage application */ -   if (span->arrayMask & SPAN_COVERAGE) { -      GLuint i; -      for (i = 0; i < span->end; i++) { -         rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]); -      } -   } - -   if (swrast->_RasterMask & MULTI_DRAW_BIT) { -      multi_write_rgba_span( ctx, span->end, span->x, span->y, (const GLchan (*)[4]) rgba, span->mask ); -   } -   else { -      /* normal: write to exactly one buffer */ -      if (ctx->Color.ColorLogicOpEnabled) { -         _mesa_logicop_rgba_span( ctx, span->end, span->x, span->y, rgba, span->mask ); -      } -      else  if (ctx->Color.BlendEnabled) { -         _mesa_blend_span( ctx, span->end, span->x, span->y, rgba, span->mask ); -      } -      if (colorMask == 0x0) { -         return; -      } -      else if (colorMask != 0xffffffff) { -         _mesa_mask_rgba_span( ctx, span->end, span->x, span->y, rgba ); -      } - -      (*swrast->Driver.WriteRGBASpan)( ctx, span->end, span->x, span->y, -                                       (const GLchan (*)[4]) rgba, -                                       span->writeAll ? NULL : span->mask ); -      if (swrast->_RasterMask & ALPHABUF_BIT) { -         _mesa_write_alpha_span( ctx, span->end, span->x, span->y, -                                 (const GLchan (*)[4]) rgba, -                                 span->writeAll ? NULL : span->mask ); -      } -   } -} - - -/* - * Write a horizontal span of textured pixels to the frame buffer. - * The color of each pixel is different. - * Depth-testing, stenciling, scissor-testing etc. should already  - * have been done, - * only if alpha-testing is used, depth-testing is still done in this - * function. - * Input:  n - number of pixels in the span - *         x, y - location of leftmost pixel in the span - *         z - array of [n] z-values - *         s, t - array of (s,t) texture coordinates for each pixel - *         lambda - array of texture lambda values - *         rgba - array of [n] color components - *         mask - masked pixels - *         primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP. - * Contributed by Klaus Niederkrueger. - */ -static void -masked_texture_span( GLcontext *ctx, struct sw_span *span) -{ -   const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); -   GLchan rgbaBackup[MAX_WIDTH][4]; -   GLchan (*rgba)[4];   /* points to either span->color.rgba or rgbaBackup */ -   SWcontext *swrast = SWRAST_CONTEXT(ctx); - - -   if (swrast->_RasterMask & MULTI_DRAW_BIT) { -      /* must make a copy of the colors since they may be modified */ -      MEMCPY(rgbaBackup, span->color.rgba, 4 * span->end * sizeof(GLchan)); -      rgba = rgbaBackup; -   } -   else { -      rgba = span->color.rgba; -   } - - -   ASSERT(ctx->Texture._ReallyEnabled); -   _swrast_texture_fragments( ctx, 0, span, rgba ); -    -    -   /* Texture with alpha test */ -   if (ctx->Color.AlphaEnabled) { -      /* Do the alpha test */ -      if (_mesa_alpha_test( ctx, span, (const GLchan (*)[4]) rgba ) == 0) { -         return; -      } -       -      /* Depth test usually in 'rasterize_span' but if alpha test -         needed, we have to wait for that test before depth test can -         be done. */        if (ctx->Stencil.Enabled) { -         /* first stencil test */ -         if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE) +         if (!_mesa_stencil_and_ztest_span(ctx, span)) { +            span->arrayMask = origArrayMask;              return; +         }        } -      else if (ctx->Depth.Test) { +      else { +         ASSERT(ctx->Depth.Test); +         ASSERT(span->arrayMask & SPAN_Z);           /* regular depth testing */ -         if (_mesa_depth_test_span(ctx, span) == 0) +         if (!_mesa_depth_test_span(ctx, span)) { +            span->arrayMask = origArrayMask;              return; +         }        }     } -   /* if we get here, something passed the depth test */ +   /* if we get here, some fragments passed the depth test */     ctx->OcclusionResult = GL_TRUE; -    -    -   /* Add base and specular colors */ -   if ((span->interpMask & SPAN_SPEC) && /* Is this right test ???*/ -       (ctx->Fog.ColorSumEnabled || -	(ctx->Light.Enabled && -         ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))) -      add_colors(span, rgba);   /* rgba = rgba + span->spec */ -    -   /* Per-pixel fog */ -   if (ctx->Fog.Enabled) { -      /* Is this the right 'if' ?? */ -      if ((span->interpMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog) -	 _mesa_fog_rgba_pixels(ctx, span, rgba); -      else -	 _mesa_depth_fog_rgba_pixels(ctx, span, rgba); -   } -   /* Antialias coverage application */ -   if (span->arrayMask & SPAN_COVERAGE) { -      GLuint i; -      for (i = 0; i < span->end; i++) { -         rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]); -      } -   } - -   if (swrast->_RasterMask & MULTI_DRAW_BIT) { -      multi_write_rgba_span( ctx, span->end, span->x, span->y, (const GLchan (*)[4]) rgba, span->mask ); -   } -   else { -      /* normal: write to exactly one buffer */ -      if (ctx->Color.ColorLogicOpEnabled) { -         _mesa_logicop_rgba_span( ctx, span->end, span->x, span->y, rgba, span->mask ); -      } -      else  if (ctx->Color.BlendEnabled) { -         _mesa_blend_span( ctx, span->end, span->x, span->y, rgba, span->mask ); -      } -      if (colorMask == 0x0) { -         return; -      } -      else if (colorMask != 0xffffffff) { -         _mesa_mask_rgba_span( ctx, span->end, span->x, span->y, rgba ); -      } - -      (*swrast->Driver.WriteRGBASpan)( ctx, span->end, span->x, span->y, -                                       (const GLchan (*)[4]) rgba, -				       span->writeAll ? NULL : span->mask ); -      if (swrast->_RasterMask & ALPHABUF_BIT) { -         _mesa_write_alpha_span( ctx, span->end, span->x, span->y, -                                 (const GLchan (*)[4]) rgba, -                                 span->writeAll ? NULL : span->mask ); -      } +   /* We had to wait until now to check for glColorMask(F,F,F,F) because of +    * the occlusion test. +    */ +   if (colorMask == 0x0) { +      span->arrayMask = origArrayMask; +      return;     } -} +   /* Texture without alpha test */ +   if (!ctx->Color.AlphaEnabled) { -/* - * As above but perform multiple stages of texture application. - * Contributed by Klaus Niederkrueger. - */ -static void -masked_multitexture_span( GLcontext *ctx, struct sw_span *span) -{ -   GLchan rgbaBackup[MAX_WIDTH][4]; -   GLchan (*rgba)[4];   /* points to either span->color.rgba or rgbaBackup */ -   GLuint i; -   const GLuint texUnits = ctx->Const.MaxTextureUnits; -   SWcontext *swrast = SWRAST_CONTEXT(ctx); +      /* Now we need the rgba array, fill it in if needed */ +      if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) +         interpolate_colors(ctx, span); -    -   if ( (swrast->_RasterMask & MULTI_DRAW_BIT) || texUnits > 1) { -      /* must make a copy of the colors since they may be modified */ -      MEMCPY(rgbaBackup, span->color.rgba, 4 * span->end * sizeof(GLchan)); -      rgba = rgbaBackup; +      _swrast_multitexture_fragments( ctx, span );     } -   else { -      rgba = span->color.rgba; -   } -    -    -   ASSERT(ctx->Texture._ReallyEnabled); -   for (i = 0; i < texUnits; i++) -      _swrast_texture_fragments( ctx, i, span, rgba ); -   /* Texture with alpha test */ -   if (ctx->Color.AlphaEnabled) { -      /* Do the alpha test */ -      if (_mesa_alpha_test( ctx, span, (const GLchan (*)[4])rgba ) == 0) { -         return; -      } +   ASSERT(span->arrayMask & SPAN_RGBA); -      /* Depth test usually in 'rasterize_span' but if alpha test -         needed, we have to wait for that test before depth test can -         be done. */ -      if (ctx->Stencil.Enabled) { -         /* first stencil test */ -         if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE) -            return; -      } -      else if (ctx->Depth.Test) { -         /* regular depth testing */ -         if (_mesa_depth_test_span(ctx, span) == GL_FALSE) -            return; +   /* Add base and specular colors */ +   if (ctx->Fog.ColorSumEnabled || +       (ctx->Light.Enabled && +        ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) { +      if (span->interpMask & SPAN_SPEC) { +         interpolate_specular(ctx, span);        } +      ASSERT(span->arrayMask & SPAN_SPEC); +      add_colors( span->end, span->color.rgba, span->specArray );     } -   /* if we get here, something passed the depth test */ -   ctx->OcclusionResult = GL_TRUE; -    -    -   /* Add base and specular colors */ -   if ((span->interpMask & SPAN_SPEC) && /* Is this right test ???*/ -       (ctx->Fog.ColorSumEnabled || -	(ctx->Light.Enabled && -	 ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))) -      add_colors(span, rgba);   /* rgba = rgba + span->spec */ -        /* Per-pixel fog */     if (ctx->Fog.Enabled) { -      /* Is this the right 'if' ?? */ -      if ((span->interpMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog) -	 _mesa_fog_rgba_pixels( ctx, span, rgba ); -      else -	 _mesa_depth_fog_rgba_pixels( ctx, span, rgba ); +#if 0 +      if ((span->interpMask & SPAN_FOG) && (span->arrayMask & SPAN_FOG) == 0) +         interpolate_fog(ctx, span); +#endif +      if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog) +	 _mesa_fog_rgba_pixels_with_array( ctx, span, span->fogArray, +                                           span->color.rgba); +      else if ((span->interpMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog) +	 _mesa_fog_rgba_pixels( ctx, span, span->color.rgba ); +      else { +         if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0) +            interpolate_z(ctx, span); +	 _mesa_depth_fog_rgba_pixels(ctx, span, span->color.rgba); +      }     } -    +     /* Antialias coverage application */     if (span->arrayMask & SPAN_COVERAGE) { +      GLchan (*rgba)[4] = span->color.rgba;        GLuint i;        for (i = 0; i < span->end; i++) {           rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]); @@ -1498,325 +1182,38 @@ masked_multitexture_span( GLcontext *ctx, struct sw_span *span)     if (swrast->_RasterMask & MULTI_DRAW_BIT) {        multi_write_rgba_span( ctx, span->end, span->x, span->y, -                             (const GLchan (*)[4]) rgba, span->mask ); +                             (const GLchan (*)[4]) span->color.rgba, +                             span->mask );     }     else {        /* normal: write to exactly one buffer */ -      const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); -              if (ctx->Color.ColorLogicOpEnabled) { -         _mesa_logicop_rgba_span( ctx, span->end, span->x, span->y, rgba, span->mask ); +         _mesa_logicop_rgba_span( ctx, span->end, span->x, span->y, +                                  span->color.rgba, span->mask );        }        else  if (ctx->Color.BlendEnabled) { -         _mesa_blend_span( ctx, span->end, span->x, span->y, rgba, span->mask ); +         _mesa_blend_span( ctx, span->end, span->x, span->y, +                           span->color.rgba, span->mask);        } -      if (colorMask == 0x0) { -         return; -      } -      else if (colorMask != 0xffffffff) { -         _mesa_mask_rgba_span( ctx, span->end, span->x, span->y, rgba ); +      if (colorMask != 0xffffffff) { +         _mesa_mask_rgba_span( ctx, span->end, span->x, span->y, +                               span->color.rgba );        }        (*swrast->Driver.WriteRGBASpan)( ctx, span->end, span->x, span->y, -                                       (const GLchan (*)[4])rgba, +                                       (const GLchan (*)[4]) span->color.rgba,                                         span->writeAll ? NULL : span->mask );        if (swrast->_RasterMask & ALPHABUF_BIT) {           _mesa_write_alpha_span( ctx, span->end, span->x, span->y, -                                 (const GLchan (*)[4])rgba, +                                 (const GLchan (*)[4]) span->color.rgba,                                   span->writeAll ? NULL : span->mask );        }     } -} - - -/* - * Generate arrays of fragment colors, z, fog, texcoords, etc from a - * triangle span object.  Then call the span/fragment processsing - * functions in s_span.[ch].  This is used by a bunch of the textured - * triangle functions. - * Contributed by Klaus Niederkrueger. - */ -void -_mesa_rasterize_span(GLcontext *ctx, struct sw_span *span) -{ -   SWcontext *swrast = SWRAST_CONTEXT(ctx); - -   MEMSET(span->mask, 1, span->end); - -   if (swrast->_RasterMask & WINCLIP_BIT) { -      if (clip_span(ctx, span) == GL_FALSE) { -	 return; -      } -   } - -   /* Do the scissor test */ -   if (ctx->Scissor.Enabled) { -      if (_mesa_scissor_span( ctx, span ) == GL_FALSE) { -         return; -      } -   } - -   /* Polygon Stippling */ -   if (ctx->Polygon.StippleFlag) { -      stipple_polygon_span( ctx, span ); -   } - -   /* I have to think where to put this!! */ -   if (span->interpMask & SPAN_Z) { -      SW_SPAN_SET_FLAG(span->filledDepth); -       -      if (ctx->Visual.depthBits <= 16) { -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = FixedToInt(zval); -            zval += span->zStep; -         } -      } -      else { -         /* Deep Z buffer, no fixed->int shift */ -         GLuint i; -         GLfixed zval = span->z; -         for (i = 0; i < span->end; i++) { -            span->zArray[i] = zval; -            zval += span->zStep; -         } -      } -      span->arrayMask |= SPAN_Z; -   } - -   /* Correct order: texturing --> alpha test --> depth test.  But if -      no alpha test needed, we can do here the depth test and -      potentially avoid some of the texturing (otherwise alpha test, -      depth test etc.  happens in masked_texture_span(). */ -   if (span->interpMask & SPAN_Z  &&  !ctx->Color.AlphaEnabled) { -     if (ctx->Stencil.Enabled) { -       /* first stencil test */ -       if (_mesa_stencil_and_ztest_span(ctx, span) == GL_FALSE) -	 return; -     } -     else if (ctx->Depth.Test) { -       /* regular depth testing */ -       if (_mesa_depth_test_span( ctx, span) == 0) { -	 return; -       } -     } -   } - -   if (span->interpMask & SPAN_RGBA) -      interpolate_colors(ctx, span); - -   if (span->interpMask & SPAN_SPEC) -      interpolate_specular(ctx, span); - -   if (span->interpMask & SPAN_INDEX) -      interpolate_indexes(ctx, span); - -   if (span->interpMask & SPAN_TEXTURE) -      interpolate_texcoords(ctx, span); - -   /* examine interpMask and call a s_span.c function */ -   if (span->interpMask & SPAN_TEXTURE) { - -      if (ctx->Texture._ReallyEnabled & ~TEXTURE0_ANY) { -         /* multi texture */ -            masked_multitexture_span(ctx, span); -      } -      else { -         /* single texture */ -            masked_texture_span(ctx, span); -      } -   } -   else { -      _mesa_problem(ctx, "rasterize_span() should only be used for texturing"); -   } +   span->arrayMask = origArrayMask;  } -/* - * Add specular color to base color.  This is used only when - * GL_LIGHT_MODEL_COLOR_CONTROL = GL_SEPARATE_SPECULAR_COLOR. - */ -static void -_old_add_colors(GLuint n, GLchan rgba[][4], GLchan specular[][4] ) -{ -   GLuint i; -   for (i = 0; i < n; i++) { -#if CHAN_TYPE == GL_FLOAT -      /* no clamping */ -      rgba[i][RCOMP] += specular[i][RCOMP]; -      rgba[i][GCOMP] += specular[i][GCOMP]; -      rgba[i][BCOMP] += specular[i][BCOMP]; -#else -      GLint r = rgba[i][RCOMP] + specular[i][RCOMP]; -      GLint g = rgba[i][GCOMP] + specular[i][GCOMP]; -      GLint b = rgba[i][BCOMP] + specular[i][BCOMP]; -      rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX); -      rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX); -      rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX); -#endif -   } -} - - -/* - * As above but perform multiple stages of texture application. - */ -void -_old_write_multitexture_span( GLcontext *ctx, GLuint n, GLint x, GLint y, -			      const GLdepth z[], const GLfloat fog[], -			      GLfloat texcoord[MAX_TEXTURE_UNITS][MAX_WIDTH][4], -			      GLfloat lambda[][MAX_WIDTH], -			      GLchan rgbaIn[MAX_TEXTURE_UNITS][4], -			      GLchan spec[MAX_TEXTURE_UNITS][4], -			      const GLfloat coverage[], -			      GLenum primitive ) -{ -   GLubyte mask[MAX_WIDTH]; -   GLboolean write_all = GL_TRUE; -   GLchan rgbaBackup[MAX_WIDTH][4]; -   GLchan (*rgba)[4];   /* points to either rgbaIn or rgbaBackup */ -   GLuint i; -   const GLubyte *Null = 0; -   const GLuint texUnits = ctx->Const.MaxTextureUnits; -   SWcontext *swrast = SWRAST_CONTEXT(ctx); - -   /* init mask to 1's (all pixels are to be written) */ -   MEMSET(mask, 1, n); - -   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) { -      if ((n=old_clip_span(ctx, n, x, y, mask)) == 0) { -	 return; -      } -      if (mask[0] == 0) -	write_all = GL_FALSE; -   } - - -   if (primitive==GL_BITMAP || (swrast->_RasterMask & MULTI_DRAW_BIT) -                            || texUnits > 1) { -      /* must make a copy of the colors since they may be modified */ -      MEMCPY(rgbaBackup, rgbaIn, 4 * n * sizeof(GLchan)); -      rgba = rgbaBackup; -   } -   else { -      rgba = rgbaIn; -   } - -   /* Do the scissor test */ -   if (ctx->Scissor.Enabled) { -      if ((n = _old_scissor_span( ctx, n, x, y, mask )) == 0) { -         return; -      } -      if (mask[0] == 0) -         write_all = GL_FALSE; -   } - -   /* Polygon Stippling */ -   if (ctx->Polygon.StippleFlag && primitive==GL_POLYGON) { -      old_stipple_polygon_span( ctx, n, x, y, mask ); -      write_all = GL_FALSE; -   } - -   /* Texture with alpha test */ -   if (ctx->Color.AlphaEnabled) { -      /* Texturing without alpha is done after depth-testing which -       * gives a potential speed-up. -       */ -      ASSERT(ctx->Texture._ReallyEnabled); -      for (i = 0; i < texUnits; i++) -         _old_swrast_texture_fragments( ctx, i, n, texcoord[i], lambda[i], -                                    (CONST GLchan (*)[4]) rgbaIn, rgba ); - -      /* Do the alpha test */ -      if (_old_alpha_test( ctx, n, (const GLchan (*)[4])rgba, mask ) == 0) { -         return; -      } -      write_all = GL_FALSE; -   } - -   if (ctx->Stencil.Enabled) { -      /* first stencil test */ -      if (_old_stencil_and_ztest_span(ctx, n, x, y, z, mask) == GL_FALSE) { -	 return; -      } -      write_all = GL_FALSE; -   } -   else if (ctx->Depth.Test) { -      /* regular depth testing */ -      GLuint m = _old_depth_test_span( ctx, n, x, y, z, mask ); -      if (m == 0) { -         return; -      } -      if (m < n) { -         write_all = GL_FALSE; -      } -   } - -   /* if we get here, something passed the depth test */ -   ctx->OcclusionResult = GL_TRUE; - -   /* Texture without alpha test */ -   if (! ctx->Color.AlphaEnabled) { -      ASSERT(ctx->Texture._ReallyEnabled); -      for (i = 0; i < texUnits; i++) -         _old_swrast_texture_fragments( ctx, i, n, texcoord[i], lambda[i], -                                    (CONST GLchan (*)[4]) rgbaIn, rgba ); -   } - -   /* Add base and specular colors */ -   if (spec && -       (ctx->Fog.ColorSumEnabled || -	(ctx->Light.Enabled && -	 ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))) -      _old_add_colors( n, rgba, spec );   /* rgba = rgba + spec */ - -   /* Per-pixel fog */ -   if (ctx->Fog.Enabled) { -      if (fog && !swrast->_PreferPixelFog) -	 _old_fog_rgba_pixels( ctx, n, fog, rgba ); -      else -	 _old_depth_fog_rgba_pixels( ctx, n, z, rgba ); -   } - -   /* Antialias coverage application */ -   if (coverage) { -      GLuint i; -      for (i = 0; i < n; i++) { -         rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]); -      } -   } - -   if (swrast->_RasterMask & MULTI_DRAW_BIT) { -      multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask ); -   } -   else { -      /* normal: write to exactly one buffer */ -      const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); - -      if (ctx->Color.ColorLogicOpEnabled) { -         _mesa_logicop_rgba_span( ctx, n, x, y, rgba, mask ); -      } -      else  if (ctx->Color.BlendEnabled) { -         _mesa_blend_span( ctx, n, x, y, rgba, mask ); -      } - -      if (colorMask == 0x0) { -         return; -      } -      else if (colorMask != 0xffffffff) { -         _mesa_mask_rgba_span( ctx, n, x, y, rgba ); -      } - -      (*swrast->Driver.WriteRGBASpan)( ctx, n, x, y, (const GLchan (*)[4])rgba, -                                    write_all ? Null : mask ); -      if (swrast->_RasterMask & ALPHABUF_BIT) { -         _mesa_write_alpha_span( ctx, n, x, y, (const GLchan (*)[4])rgba, -                                 write_all ? Null : mask ); -      } -   } -}  /* diff --git a/src/mesa/swrast/s_span.h b/src/mesa/swrast/s_span.h index f6d03caf83..bceef2e44a 100644 --- a/src/mesa/swrast/s_span.h +++ b/src/mesa/swrast/s_span.h @@ -1,4 +1,4 @@ -/* $Id: s_span.h,v 1.12 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_span.h,v 1.13 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -57,30 +57,14 @@ _mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,  extern void  _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span, -                          GLenum primitive ); - - -extern void -_mesa_rasterize_span(GLcontext *ctx, struct sw_span *span); - - -extern void -_old_write_multitexture_span( GLcontext *ctx, GLuint n, GLint x, GLint y, -                              const GLdepth z[], const GLfloat fog[], -                              GLfloat texcoord[MAX_TEXTURE_UNITS][MAX_WIDTH][4], -                              GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH], -                              GLchan rgba[][4], GLchan spec[][4], -                              const GLfloat coverage[],  GLenum primitive ); - +                         GLenum primitive );  extern void  _mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,                        GLuint n, GLint x, GLint y, GLchan rgba[][4] ); -  extern void  _mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer,                         GLuint n, GLint x, GLint y, GLuint indx[] ); -  #endif diff --git a/src/mesa/swrast/s_stencil.c b/src/mesa/swrast/s_stencil.c index 3effec2af3..29d161eeb8 100644 --- a/src/mesa/swrast/s_stencil.c +++ b/src/mesa/swrast/s_stencil.c @@ -1,4 +1,4 @@ -/* $Id: s_stencil.c,v 1.16 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_stencil.c,v 1.17 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -561,7 +561,7 @@ _mesa_stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span)     ASSERT(span->end <= MAX_WIDTH);  #ifdef DEBUG     if (ctx->Depth.Test) { -      ASSERT((span->filledDepth == GL_TRUE) || (span->arrayMask & SPAN_Z)); +      ASSERT(span->arrayMask & SPAN_Z);     }  #endif diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index 5663d1d560..663fa6c757 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -1,4 +1,4 @@ -/* $Id: s_texture.c,v 1.46 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_texture.c,v 1.47 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -3100,10 +3100,6 @@ _swrast_texture_fragments( GLcontext *ctx, GLuint texUnit,        lambda = (span->arrayMask & SPAN_LAMBDA) ? span->lambda[texUnit] : NULL; -      /* XXXX -      ASSERT(span->filledTex[texUnit] == GL_TRUE); -      */ -        if (textureUnit->_Current) {   /* XXX need this? */           const struct gl_texture_object *curObj = textureUnit->_Current;           GLchan texel[PB_SIZE][4]; @@ -3149,3 +3145,49 @@ _swrast_texture_fragments( GLcontext *ctx, GLuint texUnit,        }     }  } + + +/* + * Apply multiple texture stages (or just unit 0) to the span. + * At some point in the future we'll probably modify this so that + * texels from any texture unit are available in any combiner unit. + * That'll require doing all the texture sampling first, and then + * all the application (blending) afterward. + */ +void +_swrast_multitexture_fragments( GLcontext *ctx, struct sw_span *span ) +{ +   if (ctx->Texture._ReallyEnabled & ~TEXTURE0_ANY) { +      /* multitexture */ +      GLchan primary_rgba[PB_SIZE][4]; +      GLuint unit; + +      ASSERT(span->end < PB_SIZE); + +      /* save copy of the span colors (the GL_PRIMARY_COLOR) */ +      MEMCPY(primary_rgba, span->color.rgba, 4 * span->end * sizeof(GLchan)); + +      /* loop over texture units, modifying the span->color.rgba values */ +      for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { +         if (ctx->Texture.Unit[unit]._ReallyEnabled) { +            _old_swrast_texture_fragments( ctx, unit, span->end, +                                           span->texcoords[unit], +                                           (span->arrayMask & SPAN_LAMBDA) ? +                                              span->lambda[unit] : NULL, +                                           (CONST GLchan (*)[4]) primary_rgba, +                                           span->color.rgba ); +         } +      } +   } +   else { +      /* Just unit 0 enabled */ +      ASSERT(ctx->Texture._ReallyEnabled & TEXTURE0_ANY); + +      _old_swrast_texture_fragments( ctx, 0, span->end, +                                     span->texcoords[0], +                                     (span->arrayMask & SPAN_LAMBDA) ? +                                        span->lambda[0] : NULL, +                                     (CONST GLchan (*)[4]) span->color.rgba, +                                     span->color.rgba ); +   } +} diff --git a/src/mesa/swrast/s_texture.h b/src/mesa/swrast/s_texture.h index aa86c0fa04..6c3b2b801a 100644 --- a/src/mesa/swrast/s_texture.h +++ b/src/mesa/swrast/s_texture.h @@ -1,4 +1,4 @@ -/* $Id: s_texture.h,v 1.9 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_texture.h,v 1.10 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -50,4 +50,7 @@ _old_swrast_texture_fragments( GLcontext *ctx, GLuint texSet, GLuint n,  			       CONST GLchan primary_rgba[][4],                                 GLchan rgba[][4] ); +extern void +_swrast_multitexture_fragments( GLcontext *ctx, struct sw_span *span ); +  #endif diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index fc82485874..37e6d12c94 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.49 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_triangle.c,v 1.50 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -131,6 +131,17 @@ static void flat_rgba_triangle( GLcontext *ctx,  #define INTERP_FOG 1  #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE +#define SETUP_CODE				\ +   span.interpMask |= SPAN_RGBA;		\ +   span.red = ChanToFixed(v2->color[0]);	\ +   span.green = ChanToFixed(v2->color[1]);	\ +   span.blue = ChanToFixed(v2->color[2]);	\ +   span.alpha = ChanToFixed(v2->color[3]);	\ +   span.redStep = 0;				\ +   span.greenStep = 0;				\ +   span.blueStep = 0;				\ +   span.alphaStep = 0; +  #define RENDER_SPAN( span )						\     _mesa_write_monocolor_span(ctx, &span, v2->color, GL_POLYGON ); @@ -274,7 +285,6 @@ static void simple_z_textured_triangle( GLcontext *ctx,     span.intTex[0] -= FIXED_HALF; /* off-by-one error? */		\     span.intTex[1] -= FIXED_HALF;					\     SW_SPAN_SET_FLAG(span.filledColor);					\ -   SW_SPAN_SET_FLAG(span.filledDepth);					\     for (i = 0; i < span.end; i++) {					\        const GLdepth z = FixedToDepth(span.z);				\        if (z < zRow[i]) {						\ @@ -940,63 +950,6 @@ static void general_textured_triangle( GLcontext *ctx,  #define INTERP_FOG 1  #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE  #define INTERP_RGB 1 -#define INTERP_ALPHA 1 -#define INTERP_TEX 1 - -#define SETUP_CODE							\ -   const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;	\ -   const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];\ -   span.texWidth[0] = (GLfloat) texImage->Width;			\ -   span.texHeight[0] = (GLfloat) texImage->Height;			\ -   (void) fixedToDepthShift; - -#define RENDER_SPAN( span )						\ -   GLuint i;								\ -   SW_SPAN_SET_FLAG(span.filledColor);					\ -   SW_SPAN_SET_FLAG(span.filledAlpha);					\ -   SW_SPAN_SET_FLAG(span.filledTex[0]);					\ -   SW_SPAN_SET_FLAG(span.filledDepth);					\ -   /* NOTE: we could just call rasterize_span() here instead */		\ -   for (i = 0; i < span.end; i++) {					\ -      GLdouble invQ = span.tex[0][3] ? (1.0 / span.tex[0][3]) : 1.0;	\ -      span.zArray[i] = FixedToDepth(span.z);				\ -      span.z += span.zStep;						\ -      span.color.rgba[i][RCOMP] = FixedToChan(span.red);		\ -      span.color.rgba[i][GCOMP] = FixedToChan(span.green);		\ -      span.color.rgba[i][BCOMP] = FixedToChan(span.blue);		\ -      span.color.rgba[i][ACOMP] = FixedToChan(span.alpha);		\ -      span.red += span.redStep;						\ -      span.green += span.greenStep;					\ -      span.blue += span.blueStep;					\ -      span.alpha += span.alphaStep;					\ -      span.texcoords[0][i][0] = (GLfloat) (span.tex[0][0] * invQ);	\ -      span.texcoords[0][i][1] = (GLfloat) (span.tex[0][1] * invQ);	\ -      span.texcoords[0][i][2] = (GLfloat) (span.tex[0][2] * invQ);	\ -      span.tex[0][0] += span.texStep[0][0];				\ -      span.tex[0][1] += span.texStep[0][1];				\ -      span.tex[0][2] += span.texStep[0][2];				\ -      span.tex[0][3] += span.texStep[0][3];				\ -   }									\ -   _mesa_write_texture_span( ctx, &span, GL_POLYGON ); - -#include "s_tritemp.h" -} - - -/* - * Render a smooth-shaded, textured, RGBA triangle with separate specular - * color interpolation. - * Interpolate texcoords with perspective correction, w/out mipmapping. - */ -static void general_textured_spec_triangle( GLcontext *ctx, -					    const SWvertex *v0, -					    const SWvertex *v1, -					    const SWvertex *v2 ) -{ -#define INTERP_Z 1 -#define INTERP_FOG 1 -#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define INTERP_RGB 1  #define INTERP_SPEC 1  #define INTERP_ALPHA 1  #define INTERP_TEX 1 @@ -1008,12 +961,13 @@ static void general_textured_spec_triangle( GLcontext *ctx,     span.texHeight[0] = (GLfloat) texImage->Height;			\     (void) fixedToDepthShift; -#define RENDER_SPAN( span )   _mesa_rasterize_span(ctx, &span); +#define RENDER_SPAN( span )   _mesa_write_texture_span(ctx, &span, GL_POLYGON);  #include "s_tritemp.h"  } +  /*   * Render a smooth-shaded, textured, RGBA triangle.   * Interpolate S,T,R with perspective correction and compute lambda for @@ -1030,40 +984,6 @@ static void lambda_textured_triangle( GLcontext *ctx,  #define INTERP_FOG 1  #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE  #define INTERP_RGB 1 -#define INTERP_ALPHA 1 -#define INTERP_TEX 1 -#define INTERP_LAMBDA 1 - -#define SETUP_CODE							\ -   const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;	\ -   const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];\ -   span.texWidth[0] = (GLfloat) texImage->Width;			\ -   span.texHeight[0] = (GLfloat) texImage->Height;			\ -   (void) fixedToDepthShift; - -#define RENDER_SPAN( span )   _mesa_rasterize_span(ctx, &span); - -#include "s_tritemp.h" -} - - -/* - * Render a smooth-shaded, textured, RGBA triangle with separate specular - * interpolation. - * Interpolate S,T,R with perspective correction and compute lambda for - * each fragment.  Lambda is used to determine whether to use the - * minification or magnification filter.  If minification and using - * mipmaps, lambda is also used to select the texture level of detail. - */ -static void lambda_textured_spec_triangle( GLcontext *ctx, -					   const SWvertex *v0, -					   const SWvertex *v1, -					   const SWvertex *v2 ) -{ -#define INTERP_Z 1 -#define INTERP_FOG 1 -#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define INTERP_RGB 1  #define INTERP_SPEC 1  #define INTERP_ALPHA 1  #define INTERP_TEX 1 @@ -1076,7 +996,7 @@ static void lambda_textured_spec_triangle( GLcontext *ctx,     span.texHeight[0] = (GLfloat) texImage->Height;			\     (void) fixedToDepthShift; -#define RENDER_SPAN( span )   _mesa_rasterize_span(ctx, &span); +#define RENDER_SPAN( span )   _mesa_write_texture_span(ctx, &span, GL_POLYGON);  #include "s_tritemp.h"  } @@ -1118,7 +1038,7 @@ lambda_multitextured_triangle( GLcontext *ctx,     }									\     (void) fixedToDepthShift; -#define RENDER_SPAN( span )   _mesa_rasterize_span(ctx, &span); +#define RENDER_SPAN( span )   _mesa_write_texture_span(ctx, &span, GL_POLYGON);  #include "s_tritemp.h" @@ -1347,15 +1267,6 @@ _swrast_choose_triangle( GLcontext *ctx )              if (ctx->Texture._ReallyEnabled > TEXTURE0_ANY) {                 USE(lambda_multitextured_triangle);              } -            else if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) { -               /* separate specular color interpolation */ -               if (needLambda) { -                  USE(lambda_textured_spec_triangle); -	       } -               else { -                  USE(general_textured_spec_triangle); -	       } -            }              else {                 if (needLambda) {  		  USE(lambda_textured_triangle); diff --git a/src/mesa/swrast/s_zoom.c b/src/mesa/swrast/s_zoom.c index 4fba332890..749730caed 100644 --- a/src/mesa/swrast/s_zoom.c +++ b/src/mesa/swrast/s_zoom.c @@ -1,4 +1,4 @@ -/* $Id: s_zoom.c,v 1.9 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: s_zoom.c,v 1.10 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -86,7 +86,7 @@ _mesa_write_zoomed_rgba_span( GLcontext *ctx,     struct sw_span zoomed;     const GLint maxwidth = MIN2( ctx->DrawBuffer->Width, MAX_WIDTH ); -   SW_SPAN_RESET (zoomed); +   SW_SPAN_RESET(zoomed);     INIT_SPAN(zoomed);     /* compute width of output row */ @@ -150,7 +150,6 @@ _mesa_write_zoomed_rgba_span( GLcontext *ctx,     if (ctx->Pixel.ZoomX==-1.0F) {        SW_SPAN_SET_FLAG(zoomed.filledColor);        SW_SPAN_SET_FLAG(zoomed.filledAlpha); -      SW_SPAN_SET_FLAG(zoomed.filledDepth);        /* n==m */        for (j=zoomed.start; j<zoomed.end; j++) {           i = n - j - 1; @@ -168,7 +167,6 @@ _mesa_write_zoomed_rgba_span( GLcontext *ctx,        const GLfloat xscale = 1.0F / ctx->Pixel.ZoomX;        SW_SPAN_SET_FLAG(zoomed.filledColor);        SW_SPAN_SET_FLAG(zoomed.filledAlpha); -      SW_SPAN_SET_FLAG(zoomed.filledDepth);        for (j=zoomed.start; j<zoomed.end; j++) {           i = (GLint) (j * xscale);           if (i<0)  i = n + i - 1; @@ -184,6 +182,7 @@ _mesa_write_zoomed_rgba_span( GLcontext *ctx,        }     } +   zoomed.arrayMask |= SPAN_RGBA;     zoomed.arrayMask |= SPAN_Z;     if (fog)        zoomed.arrayMask |= SPAN_FOG; diff --git a/src/mesa/swrast/swrast.h b/src/mesa/swrast/swrast.h index c65631b1c5..02b2386592 100644 --- a/src/mesa/swrast/swrast.h +++ b/src/mesa/swrast/swrast.h @@ -1,4 +1,4 @@ -/* $Id: swrast.h,v 1.16 2002/01/27 18:32:03 brianp Exp $ */ +/* $Id: swrast.h,v 1.17 2002/01/28 00:07:33 brianp Exp $ */  /*   * Mesa 3-D graphics library @@ -162,9 +162,7 @@ struct sw_span {     GLubyte mask[MAX_WIDTH];  #ifdef DEBUG -   GLboolean filledDepth, filledAlpha; -   GLboolean filledColor, filledSpecular; -   GLboolean filledLambda[MAX_TEXTURE_UNITS], filledTex[MAX_TEXTURE_UNITS]; +   GLboolean filledAlpha, filledColor;  #endif  }; @@ -180,12 +178,7 @@ do {			\  #ifdef DEBUG  #define SW_SPAN_SET_FLAG(flag) {ASSERT((flag) == GL_FALSE);(flag) = GL_TRUE;}  #define SW_SPAN_RESET(span) {                                        \ -         (span).filledDepth = (span).filledAlpha \ -         = (span).filledColor = (span).filledSpecular = GL_FALSE;    \ -         MEMSET((span).filledTex, GL_FALSE,                          \ -		MAX_TEXTURE_UNITS*sizeof(GLboolean));                \ -         MEMSET((span).filledLambda, GL_FALSE,                       \ -		MAX_TEXTURE_UNITS*sizeof(GLboolean));                \ +         (span).filledAlpha = (span).filledColor = GL_FALSE;    \           (span).start = 0; (span).writeAll = GL_TRUE;}  #else  #define SW_SPAN_SET_FLAG(flag) ; | 
