Mesa (master): llvmpipe: fix depth+stencil logic error
Brian Paul
brianp at kemper.freedesktop.org
Tue Apr 20 19:52:34 UTC 2010
Module: Mesa
Branch: master
Commit: caa05ef41996f7d0ac6b77f2fe86b1771cb10e43
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=caa05ef41996f7d0ac6b77f2fe86b1771cb10e43
Author: Brian Paul <brianp at vmware.com>
Date: Tue Apr 20 13:50:59 2010 -0600
llvmpipe: fix depth+stencil logic error
If both Z-test and stencil-test were enabled, we were mis-computing
the vector of updated Z buffer values.
Fixes Z testing bug in progs/demos/fbotexture.c
---
src/gallium/drivers/llvmpipe/lp_bld_depth.c | 23 ++++++++++++++++++-----
1 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
index afdf400..1b59a13 100644
--- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c
+++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
@@ -608,12 +608,25 @@ lp_build_depth_stencil_test(LLVMBuilderRef builder,
}
if (depth->writemask) {
- if(z_bitmask)
- z_bitmask = LLVMBuildAnd(builder, mask->value, z_bitmask, "");
- else
- z_bitmask = mask->value;
+ LLVMValueRef zselectmask = mask->value;
- z_dst = lp_build_select(&bld, z_bitmask, z_src, z_dst);
+ /* mask off bits that failed Z test */
+ zselectmask = LLVMBuildAnd(builder, zselectmask, z_pass, "");
+
+ /* mask off bits that failed stencil test */
+ if (s_pass_mask) {
+ zselectmask = LLVMBuildAnd(builder, zselectmask, s_pass_mask, "");
+ }
+
+ /* if combined Z/stencil format, mask off the stencil bits */
+ if (z_bitmask) {
+ zselectmask = LLVMBuildAnd(builder, zselectmask, z_bitmask, "");
+ }
+
+ /* Mix the old and new Z buffer values.
+ * z_dst[i] = zselectmask[i] ? z_src[i] : z_dst[i]
+ */
+ z_dst = lp_build_select(&bld, zselectmask, z_src, z_dst);
}
if (stencil[0].enabled) {
More information about the mesa-commit
mailing list