/** * 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" /** * Apply polygon stipple to quads produced by triangle rasterization */ static void stipple_quad(struct quad_stage *qs, struct quad_header *quad) { if (quad->prim == PRIM_TRI) { 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]; /* 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); } } struct quad_stage * sp_quad_polygon_stipple_stage( struct softpipe_context *softpipe ) { struct quad_stage *stage = CALLOC_STRUCT(quad_stage); stage->softpipe = softpipe; stage->run = stipple_quad; return stage; }