[Mesa-dev] [PATCH 14/21] glsl: Add a new ir_builder::dotlike() function.

Kenneth Graunke kenneth at whitecape.org
Wed Sep 4 15:22:37 PDT 2013


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 at whitecape.org>
---
 src/glsl/ir_builder.cpp | 11 +++++++++++
 src/glsl/ir_builder.h   |  1 +
 2 files changed, 12 insertions(+)

diff --git a/src/glsl/ir_builder.cpp b/src/glsl/ir_builder.cpp
index b549ff4..e12ae3c 100644
--- a/src/glsl/ir_builder.cpp
+++ b/src/glsl/ir_builder.cpp
@@ -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)
 {
diff --git a/src/glsl/ir_builder.h b/src/glsl/ir_builder.h
index d423fc5..6d32d7a 100644
--- a/src/glsl/ir_builder.h
+++ b/src/glsl/ir_builder.h
@@ -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);
-- 
1.8.3.4



More information about the mesa-dev mailing list