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