aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/glide/fxtris.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/glide/fxtris.c')
-rw-r--r--src/mesa/drivers/glide/fxtris.c225
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;