[Mesa-dev] [PATCH 10/21] glsl: Add an ir_expression triop constructor with type inference.

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


We already have ir_expression constructors for unary and binary
operations, which automatically infer the type based on the opcode and
operand types.

These are convenient and also required for ir_builder support.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/glsl/ir.cpp | 31 +++++++++++++++++++++++++++++++
 src/glsl/ir.h   |  5 +++++
 2 files changed, 36 insertions(+)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 4abadd8..8769c32 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -413,6 +413,37 @@ ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1)
    }
 }
 
+ir_expression::ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1,
+                             ir_rvalue *op2)
+{
+   this->ir_type = ir_type_expression;
+
+   this->operation = ir_expression_operation(op);
+   this->operands[0] = op0;
+   this->operands[1] = op1;
+   this->operands[2] = op2;
+   this->operands[3] = NULL;
+
+   assert(op > ir_last_binop && op <= ir_last_triop);
+
+   switch (this->operation) {
+   case ir_triop_fma:
+   case ir_triop_lrp:
+   case ir_triop_bitfield_extract:
+   case ir_triop_vector_insert:
+      this->type = op0->type;
+      break;
+
+   case ir_triop_bfi:
+      this->type = op1->type;
+      break;
+
+   default:
+      assert(!"not reached: missing automatic type setup for ir_expression");
+      this->type = glsl_type::float_type;
+   }
+}
+
 unsigned int
 ir_expression::get_num_operands(ir_expression_operation op)
 {
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index de41858..0646e6d 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -1252,6 +1252,11 @@ public:
     */
    ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
 
+   /**
+    * Constructor for ternary operation expressions
+    */
+   ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2);
+
    virtual ir_expression *as_expression()
    {
       return this;
-- 
1.8.3.4



More information about the mesa-dev mailing list