diff options
author | Kenneth Graunke <[email protected]> | 2013-09-03 11:52:40 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2013-09-09 11:52:22 -0700 |
commit | 7f0f60cd840fc88f01b8f6e46cad36c36709d813 (patch) | |
tree | 98b193c077baebd74715af2e6fdcacd4e2642030 | |
parent | 183f7a3e6f45a3351b86eb4c25313efe140e9793 (diff) |
glsl: Add an ir_expression triop constructor with type inference.
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 <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
-rw-r--r-- | src/glsl/ir.cpp | 31 | ||||
-rw-r--r-- | src/glsl/ir.h | 5 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index a92d454d4bf..69e20333d02 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 de41858764c..0646e6d754c 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; |