Fix broken polygon stippling (see comments for details).
authorBrian <brian.paul@tungstengraphics.com>
Tue, 16 Oct 2007 23:37:46 +0000 (17:37 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 16 Oct 2007 23:37:46 +0000 (17:37 -0600)
src/mesa/pipe/softpipe/sp_quad_stipple.c

index cb127095d700c1786a23e204cd56e94b7f6cf7ce..b2658ff158b3f0a09c68bc1a9b829a6a87a3a738 100644 (file)
 static void
 stipple_quad(struct quad_stage *qs, struct quad_header *quad)
 {
+   static const uint bit31 = 1 << 31;
+   static const uint bit30 = 1 << 30;
+
    if (quad->prim == PRIM_TRI) {
       struct softpipe_context *softpipe = qs->softpipe;
+      /* need to invert Y to index into OpenGL's stipple pattern */
+      const int y0 = softpipe->framebuffer.cbufs[0]->height - 1 - quad->y0;
+      const int y1 = y0 - 1;
+      const unsigned stipple0 = softpipe->poly_stipple.stipple[y0 % 32];
+      const unsigned stipple1 = softpipe->poly_stipple.stipple[y1 % 32];
+
+#if 1
       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];
+      if ((stipple0 & (bit31 >> col0)) == 0)
+         quad->mask &= ~MASK_TOP_LEFT;
+
+      if ((stipple0 & (bit30 >> col0)) == 0)
+         quad->mask &= ~MASK_TOP_RIGHT;
+
+      if ((stipple1 & (bit31 >> col0)) == 0)
+         quad->mask &= ~MASK_BOTTOM_LEFT;
 
-      /* XXX there may be a better way to lay out the stored stipple
-       * values to further simplify this computation.
+      if ((stipple1 & (bit30 >> col0)) == 0)
+         quad->mask &= ~MASK_BOTTOM_RIGHT;
+#else
+      /* We'd like to use this code, but we'd need to redefine
+       * MASK_TOP_LEFT to be (1 << 1) and MASK_TOP_RIGHT to be (1 << 0),
+       * and similarly for the BOTTOM bits.  But that may have undesirable
+       * side effects elsewhere.
        */
+      const int col0 = 30 - (quad->x0 % 32);
       quad->mask &= (((stipple0 >> col0) & 0x3) | 
                      (((stipple1 >> col0) & 0x3) << 2));
+#endif
 
       if (quad->mask)
          qs->next->run(qs->next, quad);