[Mesa-dev] [PATCH 2/2] i965: Change vec4_visitor::emit_lrp to use MAC for gen < 6
Juha-Pekka Heikkila
juhapekka.heikkila at gmail.com
Mon Mar 10 07:59:38 PDT 2014
Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
---
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 26 +++++++-------------------
1 file changed, 7 insertions(+), 19 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index dc58457..4e4ab6e 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1160,26 +1160,14 @@ vec4_visitor::emit_lrp(const dst_reg &dst,
emit(LRP(dst,
fix_3src_operand(a), fix_3src_operand(y), fix_3src_operand(x)));
} else {
- /* Earlier generations don't support three source operations, so we
- * need to emit x*(1-a) + y*a.
- *
- * A better way to do this would be:
- * ADD one_minus_a, negate(a), 1.0f
- * MUL null, y, a
- * MAC dst, x, one_minus_a
- * but we would need to support MAC and implicit accumulator.
- */
- dst_reg y_times_a = dst_reg(this, glsl_type::vec4_type);
- dst_reg one_minus_a = dst_reg(this, glsl_type::vec4_type);
- dst_reg x_times_one_minus_a = dst_reg(this, glsl_type::vec4_type);
- y_times_a.writemask = dst.writemask;
- one_minus_a.writemask = dst.writemask;
- x_times_one_minus_a.writemask = dst.writemask;
-
- emit(MUL(y_times_a, y, a));
+ dst_reg one_minus_a = dst_reg(this, glsl_type::vec4_type);
+ one_minus_a.writemask = dst.writemask;
+
+ struct brw_reg acc = retype(brw_acc_reg(), dst.type);
+
emit(ADD(one_minus_a, negate(a), src_reg(1.0f)));
- emit(MUL(x_times_one_minus_a, x, src_reg(one_minus_a)));
- emit(ADD(dst, src_reg(x_times_one_minus_a), src_reg(y_times_a)));
+ emit(MUL(acc, y, a));
+ emit(MAC(dst, x, src_reg(one_minus_a)));
}
}
--
1.8.1.2
More information about the mesa-dev
mailing list