From 202238824bdde9ddac5753232eee4f3d1e2d67db Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 3 Sep 2013 16:46:05 -0700 Subject: [PATCH] glsl: Add a new ir_builder::dotlike() function. 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 Reviewed-by: Paul Berry --- 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); -- 2.7.4