From 493ed9fc11a2bf272a2c1e9e5a072e4f02b46554 Mon Sep 17 00:00:00 2001 From: Brian Date: Thu, 21 Jun 2007 20:08:10 -0600 Subject: [PATCH] alpha test and misc changes --- src/mesa/pipe/p_state.h | 2 +- src/mesa/pipe/softpipe/sp_context.h | 1 + src/mesa/pipe/softpipe/sp_quad.c | 5 ++ src/mesa/pipe/softpipe/sp_quad.h | 1 + src/mesa/pipe/softpipe/sp_quad_alpha_test.c | 81 +++++++++++++++++++++++++++++ src/mesa/sources | 1 + src/mesa/state_tracker/st_atom_alphatest.c | 2 +- 7 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/mesa/pipe/softpipe/sp_quad_alpha_test.c diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h index b60e266..8e68fac 100644 --- a/src/mesa/pipe/p_state.h +++ b/src/mesa/pipe/p_state.h @@ -108,7 +108,7 @@ struct pipe_depth_state }; struct pipe_alpha_test_state { - GLuint enable:1; + GLuint enabled:1; GLuint func:3; /**< PIPE_FUNC_x */ GLfloat ref; /**< reference value */ }; diff --git a/src/mesa/pipe/softpipe/sp_context.h b/src/mesa/pipe/softpipe/sp_context.h index d01fc38..329544e 100644 --- a/src/mesa/pipe/softpipe/sp_context.h +++ b/src/mesa/pipe/softpipe/sp_context.h @@ -138,6 +138,7 @@ struct softpipe_context { */ struct { struct quad_stage *shade; + struct quad_stage *alpha_test; struct quad_stage *depth_test; struct quad_stage *blend; struct quad_stage *output; diff --git a/src/mesa/pipe/softpipe/sp_quad.c b/src/mesa/pipe/softpipe/sp_quad.c index 32085ab..63126a4 100644 --- a/src/mesa/pipe/softpipe/sp_quad.c +++ b/src/mesa/pipe/softpipe/sp_quad.c @@ -21,6 +21,11 @@ sp_build_quad_pipeline(struct softpipe_context *sp) sp->quad.first = sp->quad.depth_test; } + if (sp->alpha_test.enabled) { + sp->quad.alpha_test->next = sp->quad.first; + sp->quad.first = sp->quad.alpha_test; + } + /* XXX always enable shader? */ if (1) { sp->quad.shade->next = sp->quad.first; diff --git a/src/mesa/pipe/softpipe/sp_quad.h b/src/mesa/pipe/softpipe/sp_quad.h index 86c1718..351cd4d 100644 --- a/src/mesa/pipe/softpipe/sp_quad.h +++ b/src/mesa/pipe/softpipe/sp_quad.h @@ -46,6 +46,7 @@ struct quad_stage { struct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe ); +struct quad_stage *sp_quad_alpha_test_stage( struct softpipe_context *softpipe ); struct quad_stage *sp_quad_depth_test_stage( struct softpipe_context *softpipe ); struct quad_stage *sp_quad_blend_stage( struct softpipe_context *softpipe ); struct quad_stage *sp_quad_output_stage( struct softpipe_context *softpipe ); diff --git a/src/mesa/pipe/softpipe/sp_quad_alpha_test.c b/src/mesa/pipe/softpipe/sp_quad_alpha_test.c new file mode 100644 index 0000000..f7cebca --- /dev/null +++ b/src/mesa/pipe/softpipe/sp_quad_alpha_test.c @@ -0,0 +1,81 @@ + +/** + * quad alpha test + */ + +#include "glheader.h" +#include "imports.h" +#include "sp_context.h" +#include "sp_headers.h" +#include "sp_quad.h" +#include "pipe/p_defines.h" + + +static void +alpha_test_quad(struct quad_stage *qs, struct quad_header *quad) +{ + struct softpipe_context *softpipe = qs->softpipe; + GLuint j; + struct softpipe_surface *sps = softpipe_surface(softpipe->framebuffer.zbuf); + const GLfloat ref = softpipe->alpha_test.ref; + +#if 0 + assert(sps); /* shouldn't get here if there's no zbuffer */ +#else + if (!sps) + return; +#endif + + switch (softpipe->alpha_test.func) { + case PIPE_FUNC_NEVER: + quad->mask = 0x0; + break; + case PIPE_FUNC_LESS: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->mask & (1 << j)) { + if (quad->outputs.color[3][j] >= ref) { + /* fail */ + quad->mask &= (1 << j); + } + } + } + break; + case PIPE_FUNC_EQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->mask & (1 << j)) { + if (quad->outputs.color[3][j] != ref) { + /* fail */ + quad->mask &= (1 << j); + } + } + } + break; + case PIPE_FUNC_LEQUAL: + for (j = 0; j < QUAD_SIZE; j++) { + if (quad->mask & (1 << j)) { + if (quad->outputs.color[3][j] > ref) { + /* fail */ + quad->mask &= (1 << j); + } + } + } + break; + /* XXX fill in remaining cases */ + default: + abort(); + } + + qs->next->run(qs->next, quad); +} + + +struct quad_stage * +sp_quad_alpha_test_stage( struct softpipe_context *softpipe ) +{ + struct quad_stage *stage = CALLOC_STRUCT(quad_stage); + + stage->softpipe = softpipe; + stage->run = alpha_test_quad; + + return stage; +} diff --git a/src/mesa/sources b/src/mesa/sources index 36317f8..fd84ed5 100644 --- a/src/mesa/sources +++ b/src/mesa/sources @@ -166,6 +166,7 @@ SOFTPIPE_SOURCES = \ pipe/softpipe/sp_prim_twoside.c \ pipe/softpipe/sp_prim_unfilled.c \ pipe/softpipe/sp_quad.c \ + pipe/softpipe/sp_quad_alpha_test.c \ pipe/softpipe/sp_quad_blend.c \ pipe/softpipe/sp_quad_depth_test.c \ pipe/softpipe/sp_quad_fs.c \ diff --git a/src/mesa/state_tracker/st_atom_alphatest.c b/src/mesa/state_tracker/st_atom_alphatest.c index b7cc0d7..1e2e449 100644 --- a/src/mesa/state_tracker/st_atom_alphatest.c +++ b/src/mesa/state_tracker/st_atom_alphatest.c @@ -67,7 +67,7 @@ update_alpha_test( struct st_context *st ) memset(&alpha, 0, sizeof(alpha)); if (st->ctx->Color.AlphaEnabled) { - alpha.enable = 1; + alpha.enabled = 1; alpha.func = gl_alpha_func_to_sp(st->ctx->Color.AlphaFunc); alpha.ref = st->ctx->Color.AlphaRef; } -- 2.7.4