summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2012-10-08 10:45:08 -0700
committerKenneth Graunke <kenneth@whitecape.org>2012-11-01 14:29:21 -0700
commit1f0093720de41ca23c408f11784fcc39d58271d2 (patch)
treefb05217196eeacfc636d3a1f76f86ce0150b331a
parentfd8655aa7a78f3ded44e9dee572f17309a44a945 (diff)
i965/vs: Refactor min/max handling to share code.
v2: Properly use "conditionalmod" pre-Gen6, rather than the incorrectly copy-and-pasted "BRW_CONDITIONAL_G". Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net>
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.h2
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp37
2 files changed, 21 insertions, 18 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 402e67ab818..e4dcbc43309 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -373,6 +373,8 @@ public:
void emit_bool_comparison(unsigned int op, dst_reg dst, src_reg src0, src_reg src1);
void emit_if_gen6(ir_if *ir);
+ void emit_minmax(uint32_t condmod, dst_reg dst, src_reg src0, src_reg src1);
+
void emit_block_move(dst_reg *dst, src_reg *src,
const struct glsl_type *type, uint32_t predicate);
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index f2bf35f7e34..713427b66da 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -999,6 +999,23 @@ vec4_visitor::emit_bool_comparison(unsigned int op,
}
void
+vec4_visitor::emit_minmax(uint32_t conditionalmod, dst_reg dst,
+ src_reg src0, src_reg src1)
+{
+ vec4_instruction *inst;
+
+ if (intel->gen >= 6) {
+ inst = emit(BRW_OPCODE_SEL, dst, src0, src1);
+ inst->conditional_mod = conditionalmod;
+ } else {
+ emit(CMP(dst, src0, src1, conditionalmod));
+
+ inst = emit(BRW_OPCODE_SEL, dst, src0, src1);
+ inst->predicate = BRW_PREDICATE_NORMAL;
+ }
+}
+
+void
vec4_visitor::visit(ir_expression *ir)
{
unsigned int operand;
@@ -1272,26 +1289,10 @@ vec4_visitor::visit(ir_expression *ir)
break;
case ir_binop_min:
- if (intel->gen >= 6) {
- inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
- inst->conditional_mod = BRW_CONDITIONAL_L;
- } else {
- emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_L));
-
- inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
- inst->predicate = BRW_PREDICATE_NORMAL;
- }
+ emit_minmax(BRW_CONDITIONAL_L, result_dst, op[0], op[1]);
break;
case ir_binop_max:
- if (intel->gen >= 6) {
- inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
- inst->conditional_mod = BRW_CONDITIONAL_G;
- } else {
- emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_G));
-
- inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
- inst->predicate = BRW_PREDICATE_NORMAL;
- }
+ emit_minmax(BRW_CONDITIONAL_G, result_dst, op[0], op[1]);
break;
case ir_binop_pow: