summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-08-05 20:03:31 -0700
committerEric Anholt <[email protected]>2011-08-16 13:04:42 -0700
commit2b7632aeaa5f8b4ab3da7d33a3c71c71023a072a (patch)
tree2396d9b178752f78d89f359ce9d201002a8a046e
parentc3752b399ab376aa53392afb8f2d4b526054f0a8 (diff)
i965/vs: Add support for if(any_nequal()) and if(all_equal()) on gen6.
Fixes vs-temp-array-mat2-col-rd.shader_test.
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_emit.cpp3
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp23
2 files changed, 22 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
index 71caf907b38..bc3110b0458 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
@@ -465,7 +465,8 @@ vec4_visitor::generate_code()
assert(intel->gen == 6);
gen6_IF(p, inst->conditional_mod, src[0], src[1]);
} else {
- brw_IF(p, BRW_EXECUTE_8);
+ struct brw_instruction *brw_inst = brw_IF(p, BRW_EXECUTE_8);
+ brw_inst->header.predicate_control = inst->predicate;
}
if_depth_in_loop[loop_stack_depth]++;
break;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index b6f3cbc265f..4237373c13d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -543,7 +543,9 @@ vec4_visitor::emit_if_gen6(ir_if *ir)
assert(expr->get_num_operands() <= 2);
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
- assert(expr->operands[i]->type->is_scalar());
+ assert(expr->operands[i]->type->is_scalar() ||
+ expr->operation == ir_binop_any_nequal ||
+ expr->operation == ir_binop_all_equal);
expr->operands[i]->accept(this);
op[i] = this->result;
@@ -589,13 +591,28 @@ vec4_visitor::emit_if_gen6(ir_if *ir)
case ir_binop_less:
case ir_binop_lequal:
case ir_binop_equal:
- case ir_binop_all_equal:
case ir_binop_nequal:
- case ir_binop_any_nequal:
inst = emit(BRW_OPCODE_IF, dst_null_d(), op[0], op[1]);
inst->conditional_mod =
brw_conditional_for_comparison(expr->operation);
return;
+
+ case ir_binop_all_equal:
+ inst = emit(BRW_OPCODE_CMP, dst_null_d(), op[0], op[1]);
+ inst->conditional_mod = BRW_CONDITIONAL_Z;
+
+ inst = emit(BRW_OPCODE_IF);
+ inst->predicate = BRW_PREDICATE_ALIGN16_ALL4H;
+ return;
+
+ case ir_binop_any_nequal:
+ inst = emit(BRW_OPCODE_CMP, dst_null_d(), op[0], op[1]);
+ inst->conditional_mod = BRW_CONDITIONAL_NZ;
+
+ inst = emit(BRW_OPCODE_IF);
+ inst->predicate = BRW_PREDICATE_ALIGN16_ANY4H;
+ return;
+
default:
assert(!"not reached");
inst = emit(BRW_OPCODE_IF, dst_null_d(), op[0], src_reg(0));