gallium: fix two-side stencil handling
authorRoland Scheidegger <sroland@tungstengraphics.com>
Thu, 3 Apr 2008 23:59:38 +0000 (01:59 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Fri, 4 Apr 2008 10:44:13 +0000 (12:44 +0200)
Previously all drivers were in twosided mode since they checked for
stencil.enable[1] flag which was a copy of stencil.enable[0]. Note that drivers
should not reference stencil[1] state (other than the enable) if twosided
stenciling is disabled (for now the stencil state is still copied but for
instance clear_with_quads won't provide useful values in there).
Also, use _TestTwoSide instead of TestTwoSide since results would be
bogus otherwise if using APIs with implicit two side stencil enable
(i.e. core ogl 2.0).

src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_atom_depth.c

index 3593446e1c4a2aab9a2ec3235ea2cabd26ba5b63..2dc9a921862c8471cb3a7ae740d6e9f8199fdcda 100644 (file)
@@ -181,7 +181,7 @@ struct pipe_depth_stencil_alpha_state
       unsigned occlusion_count:1; /**< do occlusion counting? */
    } depth;
    struct {
-      unsigned enabled:1;
+      unsigned enabled:1;  /**< stencil[0]: stencil enabled, stencil[1]: two-side enabled */
       unsigned func:3;     /**< PIPE_FUNC_x */
       unsigned fail_op:3;  /**< PIPE_STENCIL_OP_x */
       unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
index 03057e37fa0fe8c64423ff71c43e2588de0dbdd2..ef467582c00346c469462f6c03f7da9fbdd98085 100644 (file)
@@ -115,7 +115,7 @@ update_depth_stencil_alpha(struct st_context *st)
       dsa->stencil[0].value_mask = st->ctx->Stencil.ValueMask[0] & 0xff;
       dsa->stencil[0].write_mask = st->ctx->Stencil.WriteMask[0] & 0xff;
 
-      if (st->ctx->Stencil.TestTwoSide) {
+      if (st->ctx->Stencil._TestTwoSide) {
          dsa->stencil[1].enabled = 1;
          dsa->stencil[1].func = st_compare_func_to_pipe(st->ctx->Stencil.Function[1]);
          dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.FailFunc[1]);
@@ -127,6 +127,7 @@ update_depth_stencil_alpha(struct st_context *st)
       }
       else {
          dsa->stencil[1] = dsa->stencil[0];
+         dsa->stencil[1].enabled = 0;
       }
    }