summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-10-16 17:37:46 -0600
committerBrian <brian.paul@tungstengraphics.com>2007-10-16 17:37:46 -0600
commitbd35c53143560177a045b314c9b4196c229f4a4c (patch)
treee19a35191f30721de580b81797aeec62cffc6cc8 /src/mesa
parent0edd490a96a53f83d2fb18a570cf20a4a0c5ee40 (diff)
Fix broken polygon stippling (see comments for details).
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/pipe/softpipe/sp_quad_stipple.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/mesa/pipe/softpipe/sp_quad_stipple.c b/src/mesa/pipe/softpipe/sp_quad_stipple.c
index cb127095d7..b2658ff158 100644
--- a/src/mesa/pipe/softpipe/sp_quad_stipple.c
+++ b/src/mesa/pipe/softpipe/sp_quad_stipple.c
@@ -16,18 +16,40 @@
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);