diff options
author | Daniel Borca <[email protected]> | 2004-12-21 08:21:52 +0000 |
---|---|---|
committer | Daniel Borca <[email protected]> | 2004-12-21 08:21:52 +0000 |
commit | 91a04617c40a740ade27e2f60e78a761a297a1d3 (patch) | |
tree | 28af13a83dd9bccdd6be93763729567b9c52ce89 /src/mesa/drivers/glide/fxtris.c | |
parent | d7b9d6046d0cca704c712ebb8823b78dc06f9bf5 (diff) |
added GL_EXT_stencil_two_side (yes, it works)
Diffstat (limited to 'src/mesa/drivers/glide/fxtris.c')
-rw-r--r-- | src/mesa/drivers/glide/fxtris.c | 225 |
1 files changed, 209 insertions, 16 deletions
diff --git a/src/mesa/drivers/glide/fxtris.c b/src/mesa/drivers/glide/fxtris.c index 04b0ebe67da..f722c5c4cc8 100644 --- a/src/mesa/drivers/glide/fxtris.c +++ b/src/mesa/drivers/glide/fxtris.c @@ -499,8 +499,9 @@ static void fx_draw_point_wide_aa ( fxMesaContext fxMesa, #define FX_OFFSET_BIT 0x2 #define FX_TWOSIDE_BIT 0x4 #define FX_FLAT_BIT 0x8 -#define FX_FALLBACK_BIT 0x10 -#define FX_MAX_TRIFUNC 0x20 +#define FX_TWOSTENCIL_BIT 0x10 +#define FX_FALLBACK_BIT 0x20 +#define FX_MAX_TRIFUNC 0x40 static struct { tnl_points_func points; @@ -514,6 +515,7 @@ static struct { #define DO_UNFILLED (IND & FX_UNFILLED_BIT) #define DO_TWOSIDE (IND & FX_TWOSIDE_BIT) #define DO_FLAT (IND & FX_FLAT_BIT) +#define DO_TWOSTENCIL (IND & FX_TWOSTENCIL_BIT) #define DO_TRI 1 #define DO_QUAD 1 #define DO_LINE 1 @@ -652,6 +654,12 @@ do { \ #endif /* !FX_PACKEDCOLOR */ +/*********************************************************************** + * Twoside stencil * + ***********************************************************************/ +#define SETUP_STENCIL(f) if (f) fxSetupStencilFace(ctx, f) +#define UNSET_STENCIL(f) if (f) fxSetupStencil(ctx) + /*********************************************************************** * Functions to draw basic unfilled primitives * @@ -803,6 +811,142 @@ do { \ #include "tnl_dd/t_dd_tritmp.h" +/* 2-sided stencil begin */ +#define IND (FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_UNFILLED_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_unfilled_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_unfilled_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_UNFILLED_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_unfilled_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_unfilled_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_unfilled_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_unfilled_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_unfilled_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_UNFILLED_BIT| \ + FX_FALLBACK_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_unfilled_fallback_twostencil +#include "tnl_dd/t_dd_tritmp.h" + + +/* Fx doesn't support provoking-vertex flat-shading? + */ +#define IND (FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_UNFILLED_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_unfilled_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_unfilled_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_UNFILLED_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_unfilled_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_unfilled_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_unfilled_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_OFFSET_BIT|FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_offset_unfilled_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_UNFILLED_BIT|FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_unfilled_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" + +#define IND (FX_TWOSIDE_BIT|FX_OFFSET_BIT|FX_UNFILLED_BIT| \ + FX_FALLBACK_BIT|FX_FLAT_BIT|FX_TWOSTENCIL_BIT) +#define TAG(x) x##_twoside_offset_unfilled_fallback_flat_twostencil +#include "tnl_dd/t_dd_tritmp.h" +/* 2-sided stencil end */ + + static void init_rast_tab( void ) { init(); @@ -838,6 +982,42 @@ static void init_rast_tab( void ) init_offset_unfilled_fallback_flat(); init_twoside_unfilled_fallback_flat(); init_twoside_offset_unfilled_fallback_flat(); + + /* 2-sided stencil begin */ + init_twostencil(); + init_offset_twostencil(); + init_twoside_twostencil(); + init_twoside_offset_twostencil(); + init_unfilled_twostencil(); + init_offset_unfilled_twostencil(); + init_twoside_unfilled_twostencil(); + init_twoside_offset_unfilled_twostencil(); + init_fallback_twostencil(); + init_offset_fallback_twostencil(); + init_twoside_fallback_twostencil(); + init_twoside_offset_fallback_twostencil(); + init_unfilled_fallback_twostencil(); + init_offset_unfilled_fallback_twostencil(); + init_twoside_unfilled_fallback_twostencil(); + init_twoside_offset_unfilled_fallback_twostencil(); + + init_flat_twostencil(); + init_offset_flat_twostencil(); + init_twoside_flat_twostencil(); + init_twoside_offset_flat_twostencil(); + init_unfilled_flat_twostencil(); + init_offset_unfilled_flat_twostencil(); + init_twoside_unfilled_flat_twostencil(); + init_twoside_offset_unfilled_flat_twostencil(); + init_fallback_flat_twostencil(); + init_offset_fallback_flat_twostencil(); + init_twoside_fallback_flat_twostencil(); + init_twoside_offset_fallback_flat_twostencil(); + init_unfilled_fallback_flat_twostencil(); + init_offset_unfilled_fallback_flat_twostencil(); + init_twoside_unfilled_fallback_flat_twostencil(); + init_twoside_offset_unfilled_fallback_flat_twostencil(); + /* 2-sided stencil end */ } @@ -1271,7 +1451,7 @@ static void fxFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts, #define TRI_FALLBACK (DD_TRI_SMOOTH | DD_TRI_STIPPLE) #define ANY_FALLBACK_FLAGS (POINT_FALLBACK | LINE_FALLBACK | TRI_FALLBACK) #define ANY_RASTER_FLAGS (DD_FLATSHADE | DD_TRI_LIGHT_TWOSIDE | DD_TRI_OFFSET \ - | DD_TRI_UNFILLED) + | DD_TRI_UNFILLED | DD_TRI_TWOSTENCIL) @@ -1284,6 +1464,7 @@ void fxDDChooseRenderState(GLcontext *ctx) if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) { if (flags & ANY_RASTER_FLAGS) { + if (flags & DD_TRI_TWOSTENCIL) index |= FX_TWOSTENCIL_BIT; if (flags & DD_TRI_LIGHT_TWOSIDE) index |= FX_TWOSIDE_BIT; if (flags & DD_TRI_OFFSET) index |= FX_OFFSET_BIT; if (flags & DD_TRI_UNFILLED) index |= FX_UNFILLED_BIT; @@ -1527,7 +1708,15 @@ void fxCheckIsInHardware( GLcontext *ctx ) fprintf(stderr, "Voodoo ! leave SW 0x%08x %s\n", oldfallback, getFallbackString(oldfallback)); } } - tnl->Driver.Render.Multipass = (HAVE_SPEC && NEED_SECONDARY_COLOR(ctx)) ? fxMultipass_ColorSum : NULL; + tnl->Driver.Render.Multipass = NULL; + if (HAVE_SPEC && NEED_SECONDARY_COLOR(ctx)) { + tnl->Driver.Render.Multipass = fxMultipass_ColorSum; + /* obey stencil, but do not change it */ + fxMesa->multipass = GL_TRUE; + if (fxMesa->unitsState.stencilEnabled) { + fxMesa->new_state |= FX_NEW_STENCIL; + } + } } } @@ -1559,19 +1748,24 @@ void fxDDInitTriFuncs( GLcontext *ctx ) /* [dBorca] Hack alert: * doesn't work with blending. - * XXX todo - need to take care of stencil. */ GLboolean fxMultipass_ColorSum (GLcontext *ctx, GLuint pass) { fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxUnitsState *us = &fxMesa->unitsState; static int t0 = 0; static int t1 = 0; switch (pass) { case 1: /* first pass: the TEXTURED triangles are drawn */ + /* set stencil's real values */ + fxMesa->multipass = GL_FALSE; + if (us->stencilEnabled) { + fxSetupStencil(ctx); + } /* save per-pass data */ - fxMesa->restoreUnitsState = fxMesa->unitsState; + fxMesa->restoreUnitsState = *us; /* turn off texturing */ t0 = ctx->Texture.Unit[0]._ReallyEnabled; t1 = ctx->Texture.Unit[1]._ReallyEnabled; @@ -1582,16 +1776,15 @@ GLboolean fxMultipass_ColorSum (GLcontext *ctx, GLuint pass) fxDDBlendFuncSeparate(ctx, GL_ONE, GL_ONE, GL_ZERO, GL_ONE); fxDDEnable(ctx, GL_BLEND, GL_TRUE); /* make sure we draw only where we want to */ - if (ctx->Depth.Mask) { - switch (ctx->Depth.Func) { - case GL_NEVER: - case GL_ALWAYS: - break; - default: - fxDDDepthFunc( ctx, GL_EQUAL ); - break; + if (us->depthTestEnabled) { + switch (us->depthTestFunc) { + default: + fxDDDepthFunc(ctx, GL_EQUAL); + case GL_NEVER: + case GL_ALWAYS: + ; } - fxDDDepthMask( ctx, GL_FALSE ); + fxDDDepthMask(ctx, GL_FALSE); } /* switch to secondary colors */ #if FX_PACKEDCOLOR @@ -1604,7 +1797,7 @@ GLboolean fxMultipass_ColorSum (GLcontext *ctx, GLuint pass) break; case 2: /* 2nd pass (last): the secondary color is summed over texture */ /* restore original state */ - fxMesa->unitsState = fxMesa->restoreUnitsState; + *us = fxMesa->restoreUnitsState; /* restore texturing */ ctx->Texture.Unit[0]._ReallyEnabled = t0; ctx->Texture.Unit[1]._ReallyEnabled = t1; |