From: Brian Date: Tue, 16 Oct 2007 23:37:46 +0000 (-0600) Subject: Fix broken polygon stippling (see comments for details). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bd35c53143560177a045b314c9b4196c229f4a4c;p=mesa.git Fix broken polygon stippling (see comments for details). --- diff --git a/src/mesa/pipe/softpipe/sp_quad_stipple.c b/src/mesa/pipe/softpipe/sp_quad_stipple.c index cb127095d70..b2658ff158b 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);