From: Kenneth Graunke Date: Tue, 3 Sep 2013 18:52:40 +0000 (-0700) Subject: glsl: Add an ir_expression triop constructor with type inference. X-Git-Tag: upstream/10.0.5~1462 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7f0f60cd840fc88f01b8f6e46cad36c36709d813;p=platform%2Fupstream%2Fmesa.git 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 Reviewed-by: Matt Turner Reviewed-by: Paul Berry --- diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index a92d454..69e2033 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;