summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/glide
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/glide')
-rw-r--r--src/mesa/drivers/glide/fxdd.c111
1 files changed, 36 insertions, 75 deletions
diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c
index 9aacaecaca2..87fa099c7c2 100644
--- a/src/mesa/drivers/glide/fxdd.c
+++ b/src/mesa/drivers/glide/fxdd.c
@@ -160,26 +160,14 @@ static void fxDDClear( GLcontext *ctx,
(int) x, (int) y, (int) width, (int) height );
}
- /* Need this check to respond to glScissor and clipping updates */
- /* should also take care of FX_NEW_COLOR_MASK, FX_NEW_STENCIL, depth? */
- if (fxMesa->new_state & FX_NEW_SCISSOR) {
- fxSetupScissor(ctx);
- fxMesa->new_state &= ~FX_NEW_SCISSOR;
- }
-
- /* we can't clear accum buffers */
- mask &= ~(DD_ACCUM_BIT);
+ /* we can't clear accum buffers nor stereo */
+ mask &= ~(DD_ACCUM_BIT | DD_FRONT_RIGHT_BIT | DD_BACK_RIGHT_BIT);
- /*
- * As per GL spec, stencil masking should be obeyed when clearing
- */
- if (mask & DD_STENCIL_BIT) {
- if (!fxMesa->haveHwStencil || fxMesa->unitsState.stencilWriteMask != 0xff) {
- /* Napalm seems to have trouble with stencil write masks != 0xff */
- /* do stencil clear in software */
- softwareMask |= DD_STENCIL_BIT;
- mask &= ~(DD_STENCIL_BIT);
- }
+ /* Need this check to respond to certain HW updates */
+ if (fxMesa->new_state & (FX_NEW_SCISSOR | FX_NEW_COLOR_MASK)) {
+ fxSetupScissor(ctx);
+ fxSetupColorMask(ctx);
+ fxMesa->new_state &= ~(FX_NEW_SCISSOR | FX_NEW_COLOR_MASK);
}
/*
@@ -202,7 +190,7 @@ static void fxDDClear( GLcontext *ctx,
*/
BEGIN_BOARD_LOCK();
if (mask & DD_STENCIL_BIT) {
- fxMesa->Glide.grStencilMaskExt(0xff /*fxMesa->unitsState.stencilWriteMask*/);
+ fxMesa->Glide.grStencilMaskExt(fxMesa->unitsState.stencilWriteMask);
/* set stencil ref value = desired clear value */
fxMesa->Glide.grStencilFuncExt(GR_CMP_ALWAYS, clearS, 0xff);
fxMesa->Glide.grStencilOpExt(GR_STENCILOP_REPLACE,
@@ -213,6 +201,9 @@ static void fxDDClear( GLcontext *ctx,
grDisable(GR_STENCIL_MODE_EXT);
}
END_BOARD_LOCK();
+ } else if (mask & DD_STENCIL_BIT) {
+ softwareMask |= (mask & (DD_STENCIL_BIT));
+ mask &= ~(DD_STENCIL_BIT);
}
/*
@@ -228,8 +219,7 @@ static void fxDDClear( GLcontext *ctx,
switch (mask & ~DD_STENCIL_BIT) {
case DD_BACK_LEFT_BIT | DD_DEPTH_BIT:
/* back buffer & depth */
- /* FX_grColorMaskv_NoLock(ctx, true4); */ /* work around Voodoo3 bug */
- grDepthMask(FXTRUE);
+ grDepthMask(FXTRUE);
grRenderBuffer(GR_BUFFER_BACKBUFFER);
if (stencil_size > 0) {
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
@@ -240,9 +230,6 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (!fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXFALSE);
- }
break;
case DD_FRONT_LEFT_BIT | DD_DEPTH_BIT:
/* XXX it appears that the depth buffer isn't cleared when
@@ -250,9 +237,9 @@ static void fxDDClear( GLcontext *ctx,
* This is a work-around/
*/
/* clear depth */
- grDepthMask(FXTRUE);
- grRenderBuffer(GR_BUFFER_BACKBUFFER);
+ grDepthMask(FXTRUE);
fxDisableColor(fxMesa);
+ grRenderBuffer(GR_BUFFER_BACKBUFFER);
if (stencil_size > 0)
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
fxMesa->clearA,
@@ -261,8 +248,9 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- /* clear front */
fxSetupColorMask(ctx);
+ grDepthMask(FXFALSE);
+ /* clear front */
grRenderBuffer(GR_BUFFER_FRONTBUFFER);
if (stencil_size > 0)
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
@@ -272,9 +260,6 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (!fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXFALSE);
- }
break;
case DD_BACK_LEFT_BIT:
/* back buffer only */
@@ -288,9 +273,6 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXTRUE);
- }
break;
case DD_FRONT_LEFT_BIT:
/* front buffer only */
@@ -304,9 +286,6 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXTRUE);
- }
break;
case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT:
/* front and back */
@@ -329,15 +308,12 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXTRUE);
- }
break;
case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT | DD_DEPTH_BIT:
- /* clear front */
- grDepthMask(FXFALSE);
- grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- if (stencil_size > 0)
+ /* clear back and depth */
+ grDepthMask(FXTRUE);
+ grRenderBuffer(GR_BUFFER_BACKBUFFER);
+ if (stencil_size > 0)
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
fxMesa->clearA,
clearD, clearS);
@@ -345,10 +321,10 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- /* clear back and depth */
- grDepthMask(FXTRUE);
- grRenderBuffer(GR_BUFFER_BACKBUFFER);
- if (stencil_size > 0)
+ /* clear front */
+ grDepthMask(FXFALSE);
+ grRenderBuffer(GR_BUFFER_FRONTBUFFER);
+ if (stencil_size > 0)
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
fxMesa->clearA,
clearD, clearS);
@@ -356,15 +332,12 @@ static void fxDDClear( GLcontext *ctx,
grBufferClear(fxMesa->clearC,
fxMesa->clearA,
clearD);
- if (!fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXFALSE);
- }
break;
case DD_DEPTH_BIT:
/* just the depth buffer */
- grRenderBuffer(GR_BUFFER_BACKBUFFER);
+ grDepthMask(FXTRUE);
fxDisableColor(fxMesa);
- grDepthMask(FXTRUE);
+ grRenderBuffer(GR_BUFFER_BACKBUFFER);
if (stencil_size > 0)
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
fxMesa->clearA,
@@ -374,41 +347,29 @@ static void fxDDClear( GLcontext *ctx,
fxMesa->clearA,
clearD);
fxSetupColorMask(ctx);
- if (ctx->Color._DrawDestMask & DD_FRONT_LEFT_BIT) {
- grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- }
- if (!fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXFALSE);
- }
break;
default:
/* clear no color buffers or depth buffer but might clear stencil */
- if (stencil_size > 0 && (mask & DD_STENCIL_BIT)) {
+ if ((stencil_size > 0) && (mask & DD_STENCIL_BIT)) {
/* XXX need this RenderBuffer call to work around Glide bug */
- grRenderBuffer(GR_BUFFER_BACKBUFFER);
grDepthMask(FXFALSE);
+ grRenderBuffer(GR_BUFFER_BACKBUFFER);
fxDisableColor(fxMesa);
fxMesa->Glide.grBufferClearExt(fxMesa->clearC,
fxMesa->clearA,
clearD, clearS);
- if (fxMesa->unitsState.depthTestEnabled) {
- grDepthMask(FXTRUE);
- }
fxSetupColorMask(ctx);
- if (ctx->Color._DrawDestMask & DD_FRONT_LEFT_BIT) {
- grRenderBuffer(GR_BUFFER_FRONTBUFFER);
- }
}
}
}
END_CLIP_LOOP();
- if (fxMesa->haveHwStencil && (mask & DD_STENCIL_BIT)) {
- /* We changed the stencil state above. Signal that we need to
- * upload it again.
- */
- fxMesa->new_state |= FX_NEW_STENCIL;
+ if (fxMesa->haveHwStencil) {
+ /* We changed the stencil state above. Restore it! */
+ fxSetupStencil(ctx);
}
+ fxSetupDepthTest(ctx);
+ grRenderBuffer(fxMesa->currentFB);
if (softwareMask)
_swrast_Clear( ctx, softwareMask, all, x, y, width, height );
@@ -417,6 +378,7 @@ static void fxDDClear( GLcontext *ctx,
/* Set the buffer used for drawing */
/* XXX support for separate read/draw buffers hasn't been tested */
+/* XXX GL_NONE disables color, but fails to correctly maintain state */
static void
fxDDSetDrawBuffer(GLcontext * ctx, GLenum mode)
{
@@ -1693,7 +1655,7 @@ fxDDGetString(GLcontext * ctx, GLenum name)
}
static const struct tnl_pipeline_stage *fx_pipeline[] = {
- &_tnl_vertex_transform_stage, /* TODO: Add the fastpath here */
+ &_tnl_vertex_transform_stage, /* XXX todo - Add the fastpath here */
&_tnl_normal_transform_stage,
&_tnl_lighting_stage,
&_tnl_fog_coordinate_stage,
@@ -2010,8 +1972,7 @@ fx_check_IsInHardware(GLcontext * ctx)
#if 0
/* [dBorca]
* We fail the spec here, unless certain blending modes:
- * (c1 + c2) * 1 + d * 1 = c1 * 1 + d * 1 + c2 * 1
- * (c1 + c2) * 1 + d * 0 = c1 * 1 + d * 0 + c2 * 1
+ * RGB: (GL_ONE + GL_*) or (GL_ZERO + GL_*) or ...
*/
if (NEED_SECONDARY_COLOR(ctx)) {
if ((ctx->Color.BlendEquationRGB != GL_FUNC_ADD) &&