diff options
author | Brian <brian.paul@tungstengraphics.com> | 2007-10-16 17:37:46 -0600 |
---|---|---|
committer | Brian <brian.paul@tungstengraphics.com> | 2007-10-16 17:37:46 -0600 |
commit | bd35c53143560177a045b314c9b4196c229f4a4c (patch) | |
tree | e19a35191f30721de580b81797aeec62cffc6cc8 /src/mesa/pipe | |
parent | 0edd490a96a53f83d2fb18a570cf20a4a0c5ee40 (diff) |
Fix broken polygon stippling (see comments for details).
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_quad_stipple.c | 32 |
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); |