Added alpha test state.
This commit is contained in:
@@ -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 * );
|
||||
|
||||
|
@@ -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 */
|
||||
};
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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 = \
|
||||
|
94
src/mesa/state_tracker/st_atom_alphatest.c
Normal file
94
src/mesa/state_tracker/st_atom_alphatest.c
Normal file
@@ -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
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user