glsl: Add a new ir_builder::dotlike() function.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 3 Sep 2013 23:46:05 +0000 (16:46 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 9 Sep 2013 18:52:22 +0000 (11:52 -0700)
dotlike() uses ir_binop_mul for scalars, and ir_binop_dot for vectors.

When generating built-in functions, we often want to use regular
multiply for scalar signatures, and dot() for vector signatures.
ir_binop_dot only works on vectors, so we have to switch opcodes,
even if the code is otherwise identical.  dotlike() makes this easy.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/glsl/ir_builder.cpp
src/glsl/ir_builder.h

index b549ff4f72b1247016dd16c064f4cac0041e71af..e12ae3cf53f38248d203efc408b87343c57b2f6f 100644 (file)
@@ -231,6 +231,17 @@ ir_expression *dot(operand a, operand b)
    return expr(ir_binop_dot, a, b);
 }
 
+/* dot for vectors, mul for scalars */
+ir_expression *dotlike(operand a, operand b)
+{
+   assert(a.val->type == b.val->type);
+
+   if (a.val->type->vector_elements == 1)
+      return expr(ir_binop_mul, a, b);
+
+   return expr(ir_binop_dot, a, b);
+}
+
 ir_expression*
 clamp(operand a, operand b, operand c)
 {
index d423fc5954da61105386a373e7722184c95dcf3e..6d32d7a68b9021a361b902acc24b9087f99831d5 100644 (file)
@@ -136,6 +136,7 @@ ir_expression *mul(operand a, operand b);
 ir_expression *div(operand a, operand b);
 ir_expression *round_even(operand a);
 ir_expression *dot(operand a, operand b);
+ir_expression *dotlike(operand a, operand b);
 ir_expression *clamp(operand a, operand b, operand c);
 ir_expression *saturate(operand a);
 ir_expression *abs(operand a);