fix stencil logic error, use proper front/back face value
authorBrian <brian.paul@tungstengraphics.com>
Wed, 11 Jul 2007 15:52:32 +0000 (09:52 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Wed, 11 Jul 2007 15:52:32 +0000 (09:52 -0600)
src/mesa/pipe/softpipe/sp_quad_stencil.c

index 5b59addce246d124da0e3af9a83e456ad2df575d..0b37474c1a885c903e6b1817f60b98811c52961d 100644 (file)
@@ -203,12 +203,12 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)
    struct softpipe_context *softpipe = qs->softpipe;
    struct softpipe_surface *s_surf = softpipe_surface(softpipe->framebuffer.sbuf);
    GLuint func, zFailOp, zPassOp, failOp;
-   GLuint face = 0;
    GLubyte ref, wrtMask, valMask;
    GLubyte stencilVals[QUAD_SIZE];
 
    /* choose front or back face function, operator, etc */
-   if (softpipe->stencil.back_enabled && face == 1) {
+   /* XXX we could do these initializations once per primitive */
+   if (softpipe->stencil.back_enabled && quad->facing) {
       func = softpipe->stencil.back_func;
       failOp = softpipe->stencil.back_fail_op;
       zFailOp = softpipe->stencil.back_zfail_op;
@@ -242,29 +242,30 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)
       }
    }
 
-   if (!quad->mask)
-      return;
+   if (quad->mask) {
 
-   /* now the pixels that passed the stencil test are depth tested */
-   if (softpipe->depth_test.enabled) {
-      const GLbitfield origMask = quad->mask;
+      /* now the pixels that passed the stencil test are depth tested */
+      if (softpipe->depth_test.enabled) {
+         const GLbitfield origMask = quad->mask;
 
-      sp_depth_test_quad(qs, quad);  /* quad->mask is updated */
+         sp_depth_test_quad(qs, quad);  /* quad->mask is updated */
 
-      /* update stencil buffer values according to z pass/fail result */
-      if (zFailOp != PIPE_STENCIL_OP_KEEP) {
-         const GLbitfield failMask = origMask & ~quad->mask;
-         apply_stencil_op(stencilVals, failMask, zFailOp, ref, wrtMask);
-      }
+         /* update stencil buffer values according to z pass/fail result */
+         if (zFailOp != PIPE_STENCIL_OP_KEEP) {
+            const GLbitfield failMask = origMask & ~quad->mask;
+            apply_stencil_op(stencilVals, failMask, zFailOp, ref, wrtMask);
+         }
 
-      if (zPassOp != PIPE_STENCIL_OP_KEEP) {
-         const GLbitfield passMask = origMask & quad->mask;
-         apply_stencil_op(stencilVals, passMask, zPassOp, ref, wrtMask);
+         if (zPassOp != PIPE_STENCIL_OP_KEEP) {
+            const GLbitfield passMask = origMask & quad->mask;
+            apply_stencil_op(stencilVals, passMask, zPassOp, ref, wrtMask);
+         }
       }
-   }
-   else {
-      /* no depth test, apply Zpass operator to stencil buffer values */
-      apply_stencil_op(stencilVals, quad->mask, zPassOp, ref, wrtMask);
+      else {
+         /* no depth test, apply Zpass operator to stencil buffer values */
+         apply_stencil_op(stencilVals, quad->mask, zPassOp, ref, wrtMask);
+      }
+
    }
 
    s_surf->write_quad_stencil(s_surf, quad->x0, quad->y0, stencilVals);