latest changes from Klaus
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 16 Jan 2002 16:00:03 +0000 (16:00 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 16 Jan 2002 16:00:03 +0000 (16:00 +0000)
src/mesa/swrast/s_span.c
src/mesa/swrast/s_span.h
src/mesa/swrast/s_triangle.c

index bd2d1838ed4258ab214c88d346f180d3a4838ac1..c00dd9f6b21a5f6624c9f172a5ffa8cef115dff5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_span.c,v 1.21 2002/01/10 16:54:29 brianp Exp $ */
+/* $Id: s_span.c,v 1.22 2002/01/16 16:00:03 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1208,6 +1208,146 @@ 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.
+ */
+void
+_mesa_write_texture_span( GLcontext *ctx, struct sw_span *span,
+                         const GLfloat fog[], 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);
+
+   SET_MASK_TO_ONE(span);
+
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+      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 && primitive==GL_POLYGON) {
+      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;
+   }
+
+
+   /* 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);
+      _swrast_texture_fragments( ctx, 0, span, rgba );
+
+      /* Do the alpha test */
+      if (_mesa_alpha_test( ctx, span->end, (const GLchan (*)[4]) rgba, span->mask ) == 0) {
+         return;
+      }
+      span->write_all = GL_FALSE;
+   }
+
+   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 );
+   }
+
+
+   /* Add base and specular colors */
+   if ((span->activeMask & 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 + spec */
+   
+   /* Per-pixel fog */
+   if (ctx->Fog.Enabled) {
+      /* Is this the right 'if' ?? */
+      if ((span->activeMask & SPAN_FOG)  &&  !swrast->_PreferPixelFog)
+        _old_fog_rgba_pixels( ctx, span->end, fog, rgba );
+      else
+        _mesa_depth_fog_rgba_pixels(ctx, span, rgba);
+   }
+
+
+   /* Antialias coverage application */
+#if 0
+   if (span->coverage) {
+      GLuint i;
+      for (i = 0; i < span->end; i++) {
+         rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]);
+      }
+   }
+#endif
+
+   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->write_all ? NULL : span->mask );
+      if (swrast->_RasterMask & ALPHABUF_BIT) {
+         _mesa_write_alpha_span( ctx, span->end, span->x, span->y, (const GLchan (*)[4]) rgba,
+                                 span->write_all ? NULL : span->mask );
+      }
+   }
+
+}
+
+
 /*
  * Write a horizontal span of textured pixels to the frame buffer.
  * The color of each pixel is different.
index b48ca02ba7ba44be9df0d3e2487ccbeb8f183af4..326d02415ae0b5db1acc846ecc81ed4e5e96cb83 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_span.h,v 1.9 2002/01/10 16:54:29 brianp Exp $ */
+/* $Id: s_span.h,v 1.10 2002/01/16 16:00:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -61,6 +61,10 @@ extern void
 _mesa_write_monocolor_span( GLcontext *ctx, struct sw_span *span,
                            const GLchan color[4], GLenum primitive );
 
+extern void
+_mesa_write_texture_span( GLcontext *ctx, struct sw_span *span,
+                         const GLfloat fog[], GLenum primitive );
+
 
 extern void
 _mesa_rasterize_span(GLcontext *ctx, struct sw_span *span);
index d61a2bb659066a001d0bbf63654d25c8df87952d..f4c1643d6b3f7725f316385d735e0120a131e07e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_triangle.c,v 1.46 2002/01/09 00:27:49 brianp Exp $ */
+/* $Id: s_triangle.c,v 1.47 2002/01/16 16:00:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -959,15 +959,8 @@ static void general_textured_triangle( GLcontext *ctx,
       span.tex[0][2] += span.texStep[0][2];                            \
       span.tex[0][3] += span.texStep[0][3];                            \
    }                                                                   \
-   _old_write_texture_span( ctx, span.end, span.x, span.y,             \
-                            span.depth, fogSpan,                       \
-                           span.texcoords[0],                          \
-                            NULL, span.color.rgba, NULL, NULL, GL_POLYGON );
-
-#define CLEANUP_CODE                           \
-   UNDEFARRAY(sSpan);  /* mac 32k limitation */        \
-   UNDEFARRAY(tSpan);                          \
-   UNDEFARRAY(uSpan);
+   _mesa_write_texture_span( ctx, &span, fogSpan,                      \
+                             GL_POLYGON );
 
 #include "s_tritemp.h"
 }