Stencil state.
authorBrian <brian.paul@tungstengraphics.com>
Thu, 24 May 2007 23:37:36 +0000 (17:37 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 24 May 2007 23:37:36 +0000 (17:37 -0600)
src/mesa/softpipe/sp_context.h
src/mesa/softpipe/sp_defines.h
src/mesa/softpipe/sp_state.h
src/mesa/softpipe/state_tracker/st_atom.c
src/mesa/softpipe/state_tracker/st_atom.h
src/mesa/softpipe/state_tracker/st_atom_stencil.c [new file with mode: 0644]
src/mesa/softpipe/state_tracker/st_context.h
src/mesa/sources

index 726cb9638827cde61ab682ff52c3df1fec979b00..e047a9330bdf640712d3da75bdd0508ae7222263 100644 (file)
@@ -52,6 +52,9 @@ struct softpipe_context {
    void (*set_scissor_rect)( struct softpipe_context *,
                             const struct softpipe_scissor_rect * );
 
+   void (*set_stencil_state)( struct softpipe_context *,
+                              const struct softpipe_stencil_state * );
+
    void (*set_blend_state)( struct softpipe_context *,
                             const struct softpipe_blend_state * );
 
index f47d782285ca000ee82242dd90c731f1a6df3856..bc88e3d71e2b004cd42a51a3ab769ba88a6a2088 100644 (file)
 #define SP_LOGICOP_OR               14
 #define SP_LOGICOP_SET              15  
 
+#define SP_STENCIL_FUNC_NEVER    0
+#define SP_STENCIL_FUNC_LESS     1
+#define SP_STENCIL_FUNC_EQUAL    2
+#define SP_STENCIL_FUNC_LEQUAL   3
+#define SP_STENCIL_FUNC_GREATER  4
+#define SP_STENCIL_FUNC_NOTEQUAL 5
+#define SP_STENCIL_FUNC_GEQUAL   6
+#define SP_STENCIL_FUNC_ALWAYS   7
+
+#define SP_STENCIL_OP_KEEP       0
+#define SP_STENCIL_OP_ZERO       1
+#define SP_STENCIL_OP_REPLACE    2
+#define SP_STENCIL_OP_INCR       3
+#define SP_STENCIL_OP_DECR       4
+#define SP_STENCIL_OP_INCR_WRAP  5
+#define SP_STENCIL_OP_DECR_WRAP  6
+#define SP_STENCIL_OP_INVERT     7
+
 #endif
index 29bba916a15afe01ecb769feff08de0c2ded4098..73ed7a619cd6cfa08a30af3cacd0d697a74c0608 100644 (file)
@@ -120,6 +120,24 @@ struct softpipe_blend_color {
 };
 
 
+struct softpipe_stencil_state {
+   GLuint front_enabled:1;
+   GLuint front_func:3;     /**< SP_STENCIL_FUNC_x */
+   GLuint front_fail_op:3;  /**< SP_STENCIL_OP_x */
+   GLuint front_zpass_op:3; /**< SP_STENCIL_OP_x */
+   GLuint front_zfail_op:3; /**< SP_STENCIL_OP_x */
+   GLuint back_enabled:1;
+   GLuint back_func:3;
+   GLuint back_fail_op:3;
+   GLuint back_zpass_op:3;
+   GLuint back_zfail_op:3;
+   GLint ref_value[2];      /**< [0] = front, [1] = back */
+   GLuint value_mask[2];
+   GLuint write_mask[2];
+   GLuint clear_value;
+};
+
+
 /* This will change for hardware softpipes...
  */
 struct softpipe_surface {
index 5f426f040a001b78556a58857cc5c53036abf7ff..fdbfb9021da9f5e51b3a141235d7fa4f3a729cf0 100644 (file)
@@ -49,6 +49,7 @@ static const struct st_tracked_state *atoms[] =
    &st_update_viewport,
    &st_update_scissor,
    &st_update_blend,
+   &st_update_stencil,
    /* will be patched out at runtime */
 /*    &st_update_constants */
 };
index dc8397adce1fe06f5e2cb3a2e983923542e2ebba..8dc7460d11634ab6ee4f6d3cacf83aed91f189d4 100644 (file)
@@ -52,6 +52,7 @@ const struct st_tracked_state st_update_viewport;
 const struct st_tracked_state st_update_constants;
 const struct st_tracked_state st_update_scissor;
 const struct st_tracked_state st_update_blend;
+const struct st_tracked_state st_update_stencil;
 
 
 #endif
diff --git a/src/mesa/softpipe/state_tracker/st_atom_stencil.c b/src/mesa/softpipe/state_tracker/st_atom_stencil.c
new file mode 100644 (file)
index 0000000..ac8de03
--- /dev/null
@@ -0,0 +1,140 @@
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  *   Brian Paul
+  */
+
+#include "st_context.h"
+#include "st_atom.h"
+#include "softpipe/sp_context.h"
+#include "softpipe/sp_defines.h"
+
+
+/**
+ * Convert GLenum stencil func tokens to softpipe tokens.
+ */
+static GLuint
+gl_stencil_func_to_sp(GLenum func)
+{
+   /* Same values, just biased */
+   assert(SP_STENCIL_FUNC_NEVER == GL_NEVER - GL_NEVER);
+   assert(SP_STENCIL_FUNC_LESS == GL_LESS - GL_NEVER);
+   assert(SP_STENCIL_FUNC_EQUAL == GL_EQUAL - GL_NEVER);
+   assert(SP_STENCIL_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER);
+   assert(SP_STENCIL_FUNC_GREATER == GL_GREATER - GL_NEVER);
+   assert(SP_STENCIL_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER);
+   assert(SP_STENCIL_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER);
+   assert(SP_STENCIL_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER);
+   assert(func >= GL_NEVER);
+   assert(func <= GL_ALWAYS);
+   return func - GL_NEVER;
+}
+
+
+/**
+ * Convert GLenum stencil op tokens to softpipe tokens.
+ */
+static GLuint
+gl_stencil_op_to_sp(GLenum func)
+{
+   switch (func) {
+   case GL_KEEP:
+      return SP_STENCIL_OP_KEEP;
+   case GL_ZERO:
+      return SP_STENCIL_OP_ZERO;
+   case GL_REPLACE:
+      return SP_STENCIL_OP_REPLACE;
+   case GL_INCR:
+      return SP_STENCIL_OP_INCR;
+   case GL_DECR:
+      return SP_STENCIL_OP_DECR;
+   case GL_INCR_WRAP:
+      return SP_STENCIL_OP_INCR_WRAP;
+   case GL_DECR_WRAP:
+      return SP_STENCIL_OP_DECR_WRAP;
+   case GL_INVERT:
+      return SP_STENCIL_OP_INVERT;
+   default:
+      assert("invalid GL token in gl_stencil_op_to_sp()" == NULL);
+      return 0;
+   }
+}
+
+
+static void 
+update_stencil( struct st_context *st )
+{
+   struct softpipe_stencil_state stencil;
+
+   memset(&stencil, 0, sizeof(stencil));
+
+   if (st->ctx->Stencil.Enabled) {
+      stencil.front_enabled = 1;
+      stencil.front_func = gl_stencil_func_to_sp(st->ctx->Stencil.Function[0]);
+      stencil.front_fail_op = gl_stencil_op_to_sp(st->ctx->Stencil.FailFunc[0]);
+      stencil.front_zfail_op = gl_stencil_op_to_sp(st->ctx->Stencil.ZFailFunc[0]);
+      stencil.front_zpass_op = gl_stencil_op_to_sp(st->ctx->Stencil.ZPassFunc[0]);
+      stencil.ref_value[0] = st->ctx->Stencil.Ref[0];
+      stencil.value_mask[0] = st->ctx->Stencil.ValueMask[0];
+      stencil.write_mask[0] = st->ctx->Stencil.WriteMask[0];
+      if (st->ctx->Stencil.TestTwoSide) {
+         stencil.back_enabled = 1;
+         stencil.back_func = gl_stencil_func_to_sp(st->ctx->Stencil.Function[1]);
+         stencil.back_fail_op = gl_stencil_op_to_sp(st->ctx->Stencil.FailFunc[1]);
+         stencil.back_zfail_op = gl_stencil_op_to_sp(st->ctx->Stencil.ZFailFunc[1]);
+         stencil.back_zpass_op = gl_stencil_op_to_sp(st->ctx->Stencil.ZPassFunc[1]);
+         stencil.ref_value[1] = st->ctx->Stencil.Ref[1];
+         stencil.value_mask[1] = st->ctx->Stencil.ValueMask[1];
+         stencil.write_mask[1] = st->ctx->Stencil.WriteMask[1];
+      }
+      stencil.clear_value = st->ctx->Stencil.Clear;
+   }
+
+   if (memcmp(&stencil, &st->state.stencil, sizeof(stencil)) != 0) {
+      /* state has changed */
+      st->state.stencil = stencil;  /* struct copy */
+      st->softpipe->set_stencil_state(st->softpipe, &stencil); /* set new state */
+   }
+}
+
+
+const struct st_tracked_state st_update_stencil = {
+   .dirty = {
+      .mesa = (_NEW_STENCIL),
+      .st  = 0,
+   },
+   .update = update_stencil
+};
+
+
+
+
+
index 08cee11797b694e9e86c22d7a563fd88efe704f8..5ff10c1b1fe627a192213fb7dca87e83fc11d87c 100644 (file)
@@ -73,6 +73,7 @@ struct st_context
       struct softpipe_clip_state   clip;
       struct softpipe_scissor_rect scissor;
       struct softpipe_poly_stipple poly_stipple;
+      struct softpipe_stencil_state stencil;
    } state;
 
    struct {
index 74c92bb381122946b7e9f3063f71702ed168c626..c5ee7d96114efac8c2e6151be2b227fd2e5037bf 100644 (file)
@@ -178,6 +178,7 @@ SOFTPIPE_SOURCES = \
        softpipe/state_tracker/st_atom_clip.c \
        softpipe/state_tracker/st_atom_fs.c \
        softpipe/state_tracker/st_atom_scissor.c \
+       softpipe/state_tracker/st_atom_stencil.c \
        softpipe/state_tracker/st_atom_setup.c \
        softpipe/state_tracker/st_atom_viewport.c \
        softpipe/state_tracker/st_cb_program.c \