Mesa (master): mesa: support GL_EXT_stencil_two_side in gallium/ mesa state tracker

Brian Paul brianp at kemper.freedesktop.org
Thu Feb 19 21:45:50 UTC 2009


Module: Mesa
Branch: master
Commit: 2b32c7dff51fa9853ba528744bd191400aa4b206
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2b32c7dff51fa9853ba528744bd191400aa4b206

Author: Brian Paul <brianp at vmware.com>
Date:   Thu Feb 19 14:37:43 2009 -0700

mesa: support GL_EXT_stencil_two_side in gallium/mesa state tracker

Since Ian's patch of a few weeks ago, we can enable all three variations
of two-sided stencil.  Update the state tracker to handle the extra back-
face state and turn on the EXT.

Note: there's a new Glean test for two-sided stencil now...

---

 src/mesa/state_tracker/st_atom_depth.c |   52 ++++++++++++++++---------------
 src/mesa/state_tracker/st_extensions.c |    1 +
 2 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_depth.c b/src/mesa/state_tracker/st_atom_depth.c
index 2d617bd..a6156df 100644
--- a/src/mesa/state_tracker/st_atom_depth.c
+++ b/src/mesa/state_tracker/st_atom_depth.c
@@ -94,36 +94,38 @@ static void
 update_depth_stencil_alpha(struct st_context *st)
 {
    struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil;
+   GLcontext *ctx = st->ctx;
 
    memset(dsa, 0, sizeof(*dsa));
 
-   dsa->depth.enabled = st->ctx->Depth.Test;
-   dsa->depth.writemask = st->ctx->Depth.Mask;
-   dsa->depth.func = st_compare_func_to_pipe(st->ctx->Depth.Func);
+   dsa->depth.enabled = ctx->Depth.Test;
+   dsa->depth.writemask = ctx->Depth.Mask;
+   dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func);
 
-   if (st->ctx->Query.CurrentOcclusionObject &&
-       st->ctx->Query.CurrentOcclusionObject->Active)
+   if (ctx->Query.CurrentOcclusionObject &&
+       ctx->Query.CurrentOcclusionObject->Active)
       dsa->depth.occlusion_count = 1;
 
-   if (st->ctx->Stencil.Enabled && st->ctx->Visual.stencilBits > 0) {
+   if (ctx->Stencil.Enabled && ctx->Visual.stencilBits > 0) {
       dsa->stencil[0].enabled = 1;
-      dsa->stencil[0].func = st_compare_func_to_pipe(st->ctx->Stencil.Function[0]);
-      dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.FailFunc[0]);
-      dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZFailFunc[0]);
-      dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZPassFunc[0]);
-      dsa->stencil[0].ref_value = st->ctx->Stencil.Ref[0] & 0xff;
-      dsa->stencil[0].valuemask = st->ctx->Stencil.ValueMask[0] & 0xff;
-      dsa->stencil[0].writemask = st->ctx->Stencil.WriteMask[0] & 0xff;
-
-      if (st->ctx->Stencil._TestTwoSide) {
+      dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]);
+      dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]);
+      dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]);
+      dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]);
+      dsa->stencil[0].ref_value = ctx->Stencil.Ref[0] & 0xff;
+      dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff;
+      dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff;
+
+      if (ctx->Stencil._TestTwoSide) {
+         const GLuint back = ctx->Stencil._BackFace;
          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]);
-         dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZFailFunc[1]);
-         dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZPassFunc[1]);
-         dsa->stencil[1].ref_value = st->ctx->Stencil.Ref[1] & 0xff;
-         dsa->stencil[1].valuemask = st->ctx->Stencil.ValueMask[1] & 0xff;
-         dsa->stencil[1].writemask = st->ctx->Stencil.WriteMask[1] & 0xff;
+         dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]);
+         dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]);
+         dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]);
+         dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]);
+         dsa->stencil[1].ref_value = ctx->Stencil.Ref[back] & 0xff;
+         dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff;
+         dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff;
       }
       else {
          dsa->stencil[1] = dsa->stencil[0];
@@ -131,10 +133,10 @@ update_depth_stencil_alpha(struct st_context *st)
       }
    }
 
-   if (st->ctx->Color.AlphaEnabled) {
+   if (ctx->Color.AlphaEnabled) {
       dsa->alpha.enabled = 1;
-      dsa->alpha.func = st_compare_func_to_pipe(st->ctx->Color.AlphaFunc);
-      dsa->alpha.ref_value = st->ctx->Color.AlphaRef;
+      dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc);
+      dsa->alpha.ref_value = ctx->Color.AlphaRef;
    }
 
    cso_set_depth_stencil_alpha(st->cso_context, dsa);
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index cd34529..8f6be50 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -208,6 +208,7 @@ void st_init_extensions(struct st_context *st)
 
    if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
       ctx->Extensions.ATI_separate_stencil = GL_TRUE;
+      ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
    }
 
    if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {




More information about the mesa-commit mailing list