Mesa (gallium-dynamicstencilref): gallium: also save/ restore stencil_ref in cso_save/restore_depth_stencil_alpha

Roland Scheidegger sroland at kemper.freedesktop.org
Thu Feb 11 03:07:39 UTC 2010


Module: Mesa
Branch: gallium-dynamicstencilref
Commit: b75adabc89e34083ac302ac9bafc8d80b62ac14c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b75adabc89e34083ac302ac9bafc8d80b62ac14c

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Thu Feb 11 04:06:01 2010 +0100

gallium: also save/restore stencil_ref in cso_save/restore_depth_stencil_alpha

makes life of state trackers easier

---

 src/gallium/auxiliary/cso_cache/cso_context.c |    9 ++++++---
 src/mesa/state_tracker/st_cb_clear.c          |   19 ++-----------------
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
index 47867e8..e110f05 100644
--- a/src/gallium/auxiliary/cso_cache/cso_context.c
+++ b/src/gallium/auxiliary/cso_cache/cso_context.c
@@ -93,7 +93,7 @@ struct cso_context {
    struct pipe_framebuffer_state fb, fb_saved;
    struct pipe_viewport_state vp, vp_saved;
    struct pipe_blend_color blend_color;
-   struct pipe_stencil_ref stencil_ref;
+   struct pipe_stencil_ref stencil_ref, stencil_ref_saved;
 };
 
 
@@ -746,6 +746,7 @@ void cso_save_depth_stencil_alpha(struct cso_context *ctx)
 {
    assert(!ctx->depth_stencil_saved);
    ctx->depth_stencil_saved = ctx->depth_stencil;
+   ctx->stencil_ref_saved = ctx->stencil_ref;
 }
 
 void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
@@ -755,6 +756,10 @@ void cso_restore_depth_stencil_alpha(struct cso_context *ctx)
       ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, ctx->depth_stencil_saved);
    }
    ctx->depth_stencil_saved = NULL;
+   if (memcmp(&ctx->stencil_ref, &ctx->stencil_ref_saved, sizeof(ctx->stencil_ref))) {
+      ctx->stencil_ref = ctx->stencil_ref_saved;
+      ctx->pipe->set_stencil_ref(ctx->pipe, &ctx->stencil_ref);
+   }
 }
 
 
@@ -1058,8 +1063,6 @@ void cso_restore_viewport(struct cso_context *ctx)
 }
 
 
-
-
 enum pipe_error cso_set_blend_color(struct cso_context *ctx,
                                     const struct pipe_blend_color *bc)
 {
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index ed92e39..74ec851 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -192,7 +192,6 @@ clear_with_quad(GLcontext *ctx,
                 GLboolean color, GLboolean depth, GLboolean stencil)
 {
    struct st_context *st = ctx->st;
-   struct pipe_stencil_ref stencil_ref;
    const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin;
    const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax;
    GLfloat y0, y1;
@@ -248,7 +247,6 @@ clear_with_quad(GLcontext *ctx,
    {
       struct pipe_depth_stencil_alpha_state depth_stencil;
       memset(&depth_stencil, 0, sizeof(depth_stencil));
-      memset(&stencil_ref, 0, sizeof(stencil_ref));
       if (depth) {
          depth_stencil.depth.enabled = 1;
          depth_stencil.depth.writemask = 1;
@@ -256,6 +254,8 @@ clear_with_quad(GLcontext *ctx,
       }
 
       if (stencil) {
+         struct pipe_stencil_ref stencil_ref;
+         memset(&stencil_ref, 0, sizeof(stencil_ref));
          depth_stencil.stencil[0].enabled = 1;
          depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
          depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
@@ -285,21 +285,6 @@ clear_with_quad(GLcontext *ctx,
    cso_restore_fragment_shader(st->cso_context);
    cso_restore_vertex_shader(st->cso_context);
 
-   /* cannot restore stencil ref. Try to reconstruct? */
-   if (stencil) {
-      if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) {
-         stencil_ref.ref_value[0] = ctx->Stencil.Ref[0] & 0xff;
-         if (ctx->Stencil._TestTwoSide) {
-            const GLuint back = ctx->Stencil._BackFace;
-            stencil_ref.ref_value[1] = ctx->Stencil.Ref[back] & 0xff;
-         }
-         else {
-            stencil_ref.ref_value[1] = stencil_ref.ref_value[0];
-         }
-      }
-      cso_set_stencil_ref(st->cso_context, &stencil_ref);
-   }
-
 }
 
 




More information about the mesa-commit mailing list