llvmpipe: fix issue with not writing new stencil values
authorRoland Scheidegger <sroland@vmware.com>
Wed, 22 May 2013 20:42:11 +0000 (22:42 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Wed, 22 May 2013 20:57:27 +0000 (22:57 +0200)
We did mask checks between depth/stencil testing and depth/stencil write.
This meant that if the depth/stencil test killed off all fragments we never
actually wrote the new stencil value. This issue affected all early/late
test/write combinations.
So move the mask check after depth/stencil write (for early depth test,
could do the same for late depth test but might not be worth it at that
point so just skip it there).
This addresses https://bugs.freedesktop.org/show_bug.cgi?id=41787.
Piglit does not hit this issue because of the simple_shader optimization
in generate_fs_loop() which means we're skipping the mask checks.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/drivers/llvmpipe/lp_bld_depth.c
src/gallium/drivers/llvmpipe/lp_state_fs.c

index 5ef99473e4dc297ead98dd5e01d5f233cf29c97c..df6a6c41bbf4673fb4da046f3c75079f582aca13 100644 (file)
@@ -1116,9 +1116,5 @@ lp_build_depth_stencil_test(struct gallivm_state *gallivm,
 
    if (depth->enabled && stencil[0].enabled)
       lp_build_mask_update(mask, z_pass);
-
-   if (do_branch)
-      lp_build_mask_check(mask);
-
 }
 
index 1dfc75a42dce942eccd25d6737b4b2b24e15395b..754288ba0e24288a6130e67a0f8da374b8cd3096 100644 (file)
@@ -361,6 +361,13 @@ generate_fs_loop(struct gallivm_state *gallivm,
                                                depth_ptr, depth_stride,
                                                z_value, s_value);
       }
+      /*
+       * Note mask check if stencil is enabled must be after ds write not after
+       * stencil test otherwise new stencil values may not get written if all
+       * fragments got killed by depth/stencil test.
+       */
+      if (!simple_shader && key->stencil[0].enabled)
+         lp_build_mask_check(&mask);
    }
 
    lp_build_interp_soa_update_inputs_dyn(interp, gallivm, loop_state.counter);