From 74b775e14de000027492f6ea3c836aa82f850d21 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 23 Feb 2001 20:08:29 +0000 Subject: fixed bug in _mesa_stencil_and_ztest_pixels() found w/ DRI mga driver --- src/mesa/swrast/s_stencil.c | 55 ++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 26 deletions(-) (limited to 'src/mesa') diff --git a/src/mesa/swrast/s_stencil.c b/src/mesa/swrast/s_stencil.c index 8ce6c0ae5a..5f308ab28c 100644 --- a/src/mesa/swrast/s_stencil.c +++ b/src/mesa/swrast/s_stencil.c @@ -1,4 +1,4 @@ -/* $Id: s_stencil.c,v 1.5 2001/01/23 23:39:37 brianp Exp $ */ +/* $Id: s_stencil.c,v 1.6 2001/02/23 20:08:29 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -916,47 +916,50 @@ _mesa_stencil_and_ztest_pixels( GLcontext *ctx, if (ctx->Driver.WriteStencilPixels) { /*** Hardware stencil buffer ***/ GLstencil stencil[PB_SIZE]; - GLubyte mask[PB_SIZE]; + GLubyte origMask[PB_SIZE]; ASSERT(ctx->Driver.ReadStencilPixels); (*ctx->Driver.ReadStencilPixels)(ctx, n, x, y, stencil); - - if (do_stencil_test( ctx, n, stencil, mask ) == GL_FALSE) { + if (do_stencil_test(ctx, n, stencil, mask) == GL_FALSE) { /* all fragments failed the stencil test, we're done. */ return GL_FALSE; } + MEMCPY(origMask, mask, n * sizeof(GLubyte)); + if (ctx->Depth.Test == GL_FALSE) { - apply_stencil_op( ctx, ctx->Stencil.ZPassFunc, n, stencil, mask ); + apply_stencil_op(ctx, ctx->Stencil.ZPassFunc, n, stencil, mask); } else { - GLubyte passmask[PB_SIZE], failmask[PB_SIZE], oldmask[PB_SIZE]; - GLuint i; - - MEMCPY(oldmask, mask, n * sizeof(GLubyte)); - _mesa_depth_test_pixels(ctx, n, x, y, z, mask); - for (i=0;iStencil.ZFailFunc != GL_KEEP) { - apply_stencil_op( ctx, ctx->Stencil.ZFailFunc, n, stencil, failmask ); + GLubyte failmask[PB_SIZE]; + GLuint i; + for (i = 0; i < n; i++) { + ASSERT(mask[i] == 0 || mask[i] == 1); + failmask[i] = origMask[i] & (mask[i] ^ 1); + } + apply_stencil_op(ctx, ctx->Stencil.ZFailFunc, + n, stencil, failmask); } if (ctx->Stencil.ZPassFunc != GL_KEEP) { - apply_stencil_op( ctx, ctx->Stencil.ZPassFunc, n, stencil, passmask ); + GLubyte passmask[PB_SIZE]; + GLuint i; + for (i = 0; i < n; i++) { + ASSERT(mask[i] == 0 || mask[i] == 1); + passmask[i] = origMask[i] & mask[i]; + } + apply_stencil_op(ctx, ctx->Stencil.ZPassFunc, + n, stencil, passmask); } } /* Write updated stencil values into hardware stencil buffer */ - (ctx->Driver.WriteStencilPixels)(ctx, n, x, y, stencil, mask ); + (ctx->Driver.WriteStencilPixels)(ctx, n, x, y, stencil, origMask); return GL_TRUE; - } else { /*** Software stencil buffer ***/ @@ -966,9 +969,9 @@ _mesa_stencil_and_ztest_pixels( GLcontext *ctx, return GL_FALSE; } - if (ctx->Depth.Test==GL_FALSE) { - apply_stencil_op_to_pixels( ctx, n, x, y, ctx->Stencil.ZPassFunc, mask ); + apply_stencil_op_to_pixels(ctx, n, x, y, + ctx->Stencil.ZPassFunc, mask); } else { GLubyte passmask[PB_SIZE], failmask[PB_SIZE], oldmask[PB_SIZE]; @@ -985,12 +988,12 @@ _mesa_stencil_and_ztest_pixels( GLcontext *ctx, } if (ctx->Stencil.ZFailFunc != GL_KEEP) { - apply_stencil_op_to_pixels( ctx, n, x, y, - ctx->Stencil.ZFailFunc, failmask ); + apply_stencil_op_to_pixels(ctx, n, x, y, + ctx->Stencil.ZFailFunc, failmask); } if (ctx->Stencil.ZPassFunc != GL_KEEP) { - apply_stencil_op_to_pixels( ctx, n, x, y, - ctx->Stencil.ZPassFunc, passmask ); + apply_stencil_op_to_pixels(ctx, n, x, y, + ctx->Stencil.ZPassFunc, passmask); } } -- cgit v1.2.3