gallivm: Fix mask calculation for emit_kill_if.
authorSi Chen <sichen@vmware.com>
Thu, 14 Nov 2013 17:17:13 +0000 (09:17 -0800)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 19 Nov 2013 19:16:18 +0000 (19:16 +0000)
The exec_mask must be taken in consideration, just like emit_kill above.

The tgsi_exec module has the same bug and should be fixed in a future
change.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index 3e0fd1cf9914d7a94884335471033b4405639671..37f7a569702084acb837874bbaec92222d7547fe 100644 (file)
@@ -2295,12 +2295,15 @@ emit_kill_if(
       }
    }
 
-   if(mask) {
-      lp_build_mask_update(bld->mask, mask);
-
-      if (!near_end_of_shader(bld, pc))
-        lp_build_mask_check(bld->mask);
+   if (bld->exec_mask.has_mask) {
+      LLVMValueRef invmask;
+      invmask = LLVMBuildNot(builder, bld->exec_mask.exec_mask, "kilp");
+      mask = LLVMBuildOr(builder, mask, invmask, "");
    }
+
+   lp_build_mask_update(bld->mask, mask);
+   if (!near_end_of_shader(bld, pc))
+      lp_build_mask_check(bld->mask);
 }