llvmpipe: fix depth+stencil logic error
authorBrian Paul <brianp@vmware.com>
Tue, 20 Apr 2010 19:50:59 +0000 (13:50 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 20 Apr 2010 19:51:52 +0000 (13:51 -0600)
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

index afdf4009af0436dc143b292ac92648bb57bc0a25..1b59a13c946353393b24595909be7cb4f5e6c544 100644 (file)
@@ -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) {