fixed bug in _mesa_stencil_and_ztest_pixels() found w/ DRI mga driver
This commit is contained in:
+29
-26
@@ -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;i<n;i++) {
|
||||
ASSERT(mask[i] == 0 || mask[i] == 1);
|
||||
passmask[i] = oldmask[i] & mask[i];
|
||||
failmask[i] = oldmask[i] & (mask[i] ^ 1);
|
||||
}
|
||||
|
||||
if (ctx->Stencil.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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user