fix single-sided stencil test bug
authorBrian <brian.paul@tungstengraphics.com>
Fri, 28 Dec 2007 21:18:18 +0000 (14:18 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 1 Jan 2008 17:21:21 +0000 (10:21 -0700)
src/mesa/pipe/softpipe/sp_quad_stencil.c

index a688a06..3374088 100644 (file)
@@ -208,16 +208,22 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)
    struct softpipe_cached_tile *tile
       = sp_get_cached_tile(softpipe, softpipe->sbuf_cache, quad->x0, quad->y0);
    uint j;
+   uint face = quad->facing;
+
+   if (!softpipe->depth_stencil->stencil[1].enabled) {
+      /* single-sided stencil test, use front (face=0) state */
+      face = 0;
+   }
 
    /* choose front or back face function, operator, etc */
    /* XXX we could do these initializations once per primitive */
-   func    = softpipe->depth_stencil->stencil[quad->facing].func;
-   failOp  = softpipe->depth_stencil->stencil[quad->facing].fail_op;
-   zFailOp = softpipe->depth_stencil->stencil[quad->facing].zfail_op;
-   zPassOp = softpipe->depth_stencil->stencil[quad->facing].zpass_op;
-   ref     = softpipe->depth_stencil->stencil[quad->facing].ref_value;
-   wrtMask = softpipe->depth_stencil->stencil[quad->facing].write_mask;
-   valMask = softpipe->depth_stencil->stencil[quad->facing].value_mask;
+   func    = softpipe->depth_stencil->stencil[face].func;
+   failOp  = softpipe->depth_stencil->stencil[face].fail_op;
+   zFailOp = softpipe->depth_stencil->stencil[face].zfail_op;
+   zPassOp = softpipe->depth_stencil->stencil[face].zpass_op;
+   ref     = softpipe->depth_stencil->stencil[face].ref_value;
+   wrtMask = softpipe->depth_stencil->stencil[face].write_mask;
+   valMask = softpipe->depth_stencil->stencil[face].value_mask;
 
    assert(ps); /* shouldn't get here if there's no stencil buffer */