Rework of shader constant buffers.
[mesa.git] / src / mesa / pipe / softpipe / sp_quad_stipple.c
index e77bbb81eec4b290345f90dcc90658b259633203..cb127095d700c1786a23e204cd56e94b7f6cf7ce 100644 (file)
@@ -3,45 +3,42 @@
  * quad polygon stipple stage
  */
 
-#include "glheader.h"
-#include "imports.h"
 #include "sp_context.h"
 #include "sp_headers.h"
 #include "sp_quad.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_util.h"
 
 
 /**
  * Apply polygon stipple to quads produced by triangle rasterization
- * XXX we need to skip this for lines and points!!!
  */
 static void
 stipple_quad(struct quad_stage *qs, struct quad_header *quad)
 {
-   struct softpipe_context *softpipe = qs->softpipe;
-   const GLint col0 = quad->x0 % 32;
-   const GLint row0 = quad->y0 % 32;
-   const GLuint stipple0 = softpipe->poly_stipple.stipple[row0];
-   const GLuint stipple1 = softpipe->poly_stipple.stipple[row0 + 1];
-   GLbitfield mask = 0x0;
-
-   /* XXX this could be optimize a bit to use just two conditionals */
-   if ((1 << col0) & stipple0)
-      mask |= MASK_BOTTOM_LEFT;
-
-   if ((2 << col0) & stipple0)
-      mask |= MASK_BOTTOM_RIGHT;
-
-   if ((1 << col0) & stipple1)
-      mask |= MASK_TOP_LEFT;
-
-   if ((2 << col0) & stipple1)
-      mask |= MASK_TOP_RIGHT;
+   if (quad->prim == PRIM_TRI) {
+      struct softpipe_context *softpipe = qs->softpipe;
+      const int col0 = quad->x0 % 32;
+      const int row0 = quad->y0 % 32;
+      const unsigned stipple0 = softpipe->poly_stipple.stipple[row0];
+      const unsigned stipple1 = softpipe->poly_stipple.stipple[row0 + 1];
+
+      /* XXX there may be a better way to lay out the stored stipple
+       * values to further simplify this computation.
+       */
+      quad->mask &= (((stipple0 >> col0) & 0x3) | 
+                     (((stipple1 >> col0) & 0x3) << 2));
+
+      if (quad->mask)
+         qs->next->run(qs->next, quad);
+   }
+}
 
-   quad->mask &= mask;
 
-   if (quad->mask)
-      qs->next->run(qs->next, quad);
+static void stipple_begin(struct quad_stage *qs)
+{
+   if (qs->next)
+      qs->next->begin(qs->next);
 }
 
 
@@ -51,6 +48,7 @@ sp_quad_polygon_stipple_stage( struct softpipe_context *softpipe )
    struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
 
    stage->softpipe = softpipe;
+   stage->begin = stipple_begin;
    stage->run = stipple_quad;
 
    return stage;