[Mesa-dev] [PATCH] i965: Fix if-statements with boolean comparisons on Sandybridge.
Kenneth Graunke
kenneth at whitecape.org
Sat Sep 15 21:25:33 PDT 2012
In the past, we stored booleans as integer 0 or 1. At some point, we
changed to storing them as 0 or some non-zero value. The Sandybridge
specific code for emitting IF instructions with embedded conditional
modifiers was not updated to account for this change.
For code such as
if (bool_a == bool_b)
we cannot simply emit an equality comparison: even if both operands are
true, they may be represented by two different non-zero values. We must
first normalize them to 0 or 1 so that they can be compared properly.
Fixes piglit test spec/glsl-1.10/execution/fs-bool-less-compare-true.
Fixes at least 9 subcases of oglconform's shad-compiler test:
- TestLessThanEquali
- TestGreaterThan
- TestGreaterThani
- TestGreaterThanEqual
- TestGreaterThanEquali
- TestEqualb
- TestNotEqual
- TestNotEquali
- TestNotEqualb
NOTE: This is a candidate for the 9.0 branch (but not 8.0).
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54709
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48629
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index d3cbde3..320e2f0 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -1650,6 +1650,9 @@ fs_visitor::emit_if_gen6(ir_if *ir)
case ir_binop_all_equal:
case ir_binop_nequal:
case ir_binop_any_nequal:
+ resolve_bool_comparison(expr->operands[0], &op[0]);
+ resolve_bool_comparison(expr->operands[1], &op[1]);
+
inst = emit(BRW_OPCODE_IF, reg_null_d, op[0], op[1]);
inst->conditional_mod =
brw_conditional_for_comparison(expr->operation);
--
1.7.11.4
More information about the mesa-dev
mailing list