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
This commit is contained in:
Brian Paul
2010-04-20 13:50:59 -06:00
parent 48f54ecb0c
commit caa05ef419
+18 -5
View 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) {