Added alpha test state.
authorBrian <brian.paul@tungstengraphics.com>
Mon, 18 Jun 2007 23:54:38 +0000 (17:54 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 18 Jun 2007 23:54:38 +0000 (17:54 -0600)
src/mesa/pipe/p_context.h
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_context.h
src/mesa/sources
src/mesa/state_tracker/st_atom_alphatest.c [new file with mode: 0644]
src/mesa/state_tracker/st_context.h

index 5c9b9b14fe02bd7a0ced4c6d9905b7c863301bdd..f7374a8380af374bb0f33c6b5d88df41f19dcdce 100644 (file)
@@ -56,12 +56,12 @@ struct pipe_context {
    /*
     * State functions
     */
+   void (*set_alpha_test_state)( struct pipe_context *,
+                                 const struct pipe_alpha_test_state * );
+
    void (*set_blend_state)( struct pipe_context *,
                             const struct pipe_blend_state * );
 
-   void (*set_framebuffer_state)( struct pipe_context *,
-                                  const struct pipe_framebuffer_state * );
-
    void (*set_cbuf_state)( struct pipe_context *,
                           const struct pipe_surface * );
 
@@ -71,6 +71,9 @@ struct pipe_context {
    void (*set_depth_state)( struct pipe_context *,
                               const struct pipe_depth_state * );
 
+   void (*set_framebuffer_state)( struct pipe_context *,
+                                  const struct pipe_framebuffer_state * );
+
    void (*set_fs_state)( struct pipe_context *,
                         const struct pipe_fs_state * );
 
index dba1e11715e3e077b735aacf74d8dab36961ce05..71f1e9996440ca35a83eac92da31deae91fe3d75 100644 (file)
@@ -104,34 +104,39 @@ struct pipe_depth_state
 {
    GLuint enabled:1;   /**< depth test enabled? */
    GLuint writemask:1; /**< allow depth buffer writes? */
-   GLuint func:3;      /**< depth test func */
+   GLuint func:3;      /**< depth test func (PIPE_FUNC_x) */
    GLfloat clear;      /**< Clear value in [0,1] (XXX correct place?) */
 };
 
+struct pipe_alpha_test_state {
+   GLuint enable:1;
+   GLuint func:3;    /**< PIPE_FUNC_x */
+   GLfloat ref;      /**< reference value */
+};
 
-struct pipe_blend_state {   
-   GLuint blend_enable:1; 
+struct pipe_blend_state {
+   GLuint blend_enable:1;
 
-   GLuint rgb_func:3; 
-   GLuint rgb_src_factor:5; 
-   GLuint rgb_dst_factor:5; 
+   GLuint rgb_func:3;
+   GLuint rgb_src_factor:5;
+   GLuint rgb_dst_factor:5;
 
    GLuint alpha_func:3;
    GLuint alpha_src_factor:5;
    GLuint alpha_dst_factor:5;
 
-   GLuint logicop_enable:1; 
+   GLuint logicop_enable:1;
    GLuint logicop_func:4;
 };
 
 struct pipe_blend_color {
-   GLfloat color[4];  
+   GLfloat color[4];
 };
 
 
 struct pipe_stencil_state {
    GLuint front_enabled:1;
-   GLuint front_func:3;     /**< PIPE_STENCIL_FUNC_x */
+   GLuint front_func:3;     /**< PIPE_FUNC_x */
    GLuint front_fail_op:3;  /**< PIPE_STENCIL_OP_x */
    GLuint front_zpass_op:3; /**< PIPE_STENCIL_OP_x */
    GLuint front_zfail_op:3; /**< PIPE_STENCIL_OP_x */
@@ -190,7 +195,7 @@ struct pipe_sampler_state
    GLfloat max_anisotropy;
    GLuint compare:1;       /**< shadow/depth compare enabled? */
    GLenum compare_mode:1;  /**< PIPE_TEX_COMPARE_x */
-   GLenum compare_func:3;  /**< PIPE_DEPTH_FUNC_x */
+   GLenum compare_func:3;  /**< PIPE_FUNC_x */
    GLfloat shadow_ambient; /**< shadow test fail color/intensity */
 };
 
index f2ebc4272a63faa0ca0722d79dc4f49b99331b30..efe453ea2c35035ef6b37cffbf79e2f182f7dc9c 100644 (file)
@@ -59,6 +59,7 @@ enum interp_mode {
 #define G_NEW_SCISSOR   0x40
 #define G_NEW_STIPPLE   0x80
 #define G_NEW_FRAMEBUFFER 0x100
+#define G_NEW_ALPHA_TEST  0x200
 
 
 struct softpipe_context {     
@@ -72,6 +73,7 @@ struct softpipe_context {
    struct pipe_setup_state  setup;
    struct pipe_fs_state     fs;
    struct pipe_blend_state  blend;
+   struct pipe_alpha_test_state alpha_test;
    struct pipe_surface      cbuf;
    struct pipe_clip_state   clip;
    struct pipe_scissor_rect scissor;
index 1aef2f76eb1733b050060aa9457f1e255a664903..d07d4dabe86588902e47cbef5045c9995c95f129 100644 (file)
@@ -175,6 +175,7 @@ SOFTPIPE_SOURCES = \
 
 STATETRACKER_SOURCES = \
        state_tracker/st_atom.c \
+       state_tracker/st_atom_alphatest.c \
        state_tracker/st_atom_blend.c \
        state_tracker/st_atom_cbuf.c \
        state_tracker/st_atom_clip.c \
@@ -291,6 +292,7 @@ X11_DRIVER_SOURCES =                \
        drivers/x11/xm_glide.c  \
        drivers/x11/xm_line.c   \
        drivers/x11/xm_span.c   \
+       drivers/x11/xm_surface.c        \
        drivers/x11/xm_tri.c
 
 OSMESA_DRIVER_SOURCES = \
diff --git a/src/mesa/state_tracker/st_atom_alphatest.c b/src/mesa/state_tracker/st_atom_alphatest.c
new file mode 100644 (file)
index 0000000..b7cc0d7
--- /dev/null
@@ -0,0 +1,94 @@
+/**************************************************************************
+ * 
+ * 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 "pipe/p_context.h"
+#include "pipe/p_defines.h"
+
+
+/**
+ * Convert GLenum stencil func tokens to pipe tokens.
+ */
+static GLuint
+gl_alpha_func_to_sp(GLenum func)
+{
+   /* Same values, just biased */
+   assert(PIPE_FUNC_NEVER == GL_NEVER - GL_NEVER);
+   assert(PIPE_FUNC_LESS == GL_LESS - GL_NEVER);
+   assert(PIPE_FUNC_EQUAL == GL_EQUAL - GL_NEVER);
+   assert(PIPE_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_GREATER == GL_GREATER - GL_NEVER);
+   assert(PIPE_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER);
+   assert(func >= GL_NEVER);
+   assert(func <= GL_ALWAYS);
+   return func - GL_NEVER;
+}
+
+
+static void 
+update_alpha_test( struct st_context *st )
+{
+   struct pipe_alpha_test_state alpha;
+
+   memset(&alpha, 0, sizeof(alpha));
+
+   if (st->ctx->Color.AlphaEnabled) {
+      alpha.enable = 1;
+      alpha.func = gl_alpha_func_to_sp(st->ctx->Color.AlphaFunc);
+      alpha.ref = st->ctx->Color.AlphaRef;
+   }
+
+   if (memcmp(&alpha, &st->state.alpha_test, sizeof(alpha)) != 0) {
+      /* state has changed */
+      st->state.alpha_test = alpha;  /* struct copy */
+      st->pipe->set_alpha_test_state(st->pipe, &alpha); /* set new state */
+   }
+}
+
+
+const struct st_tracked_state st_update_alpha_test = {
+   .dirty = {
+      .mesa = (_NEW_COLOR),
+      .st  = 0,
+   },
+   .update = update_alpha_test
+};
+
+
+
+
+
index b43fc0925b4bea3457d1d5c32da6fcbc8af5264e..d98dd3aadae1c0f45b29d4e0e6602b200982e750 100644 (file)
@@ -69,6 +69,7 @@ struct st_context
       struct pipe_viewport     viewport;
       struct pipe_setup_state  setup;
       struct pipe_fs_state     fs;
+      struct pipe_alpha_test_state  alpha_test;
       struct pipe_blend_state  blend;
       struct pipe_surface      cbuf;
       struct pipe_clip_state   clip;