glsl: Add ir_unop_i2u and ir_unop_u2i operations.
These are necessary to handle int/uint constructor conversions. For example, the following code currently results in a type mismatch: int x = 7; uint y = uint(x); In particular, uint(x) still has type int. This commit simply adds the new operations; it does not generate them, nor does it add backend support for them. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
4f799e6142
commit
20ef96c7ff
|
@ -272,6 +272,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
|
|||
|
||||
case ir_unop_f2i:
|
||||
case ir_unop_b2i:
|
||||
case ir_unop_u2i:
|
||||
this->type = glsl_type::get_instance(GLSL_TYPE_INT,
|
||||
op0->type->vector_elements, 1);
|
||||
break;
|
||||
|
@ -289,6 +290,11 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
|
|||
op0->type->vector_elements, 1);
|
||||
break;
|
||||
|
||||
case ir_unop_i2u:
|
||||
this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
|
||||
op0->type->vector_elements, 1);
|
||||
break;
|
||||
|
||||
case ir_unop_noise:
|
||||
this->type = glsl_type::float_type;
|
||||
break;
|
||||
|
@ -419,6 +425,8 @@ static const char *const operator_strs[] = {
|
|||
"i2b",
|
||||
"b2i",
|
||||
"u2f",
|
||||
"i2u",
|
||||
"u2i",
|
||||
"any",
|
||||
"trunc",
|
||||
"ceil",
|
||||
|
|
|
@ -789,6 +789,8 @@ enum ir_expression_operation {
|
|||
ir_unop_i2b, /**< int-to-boolean conversion */
|
||||
ir_unop_b2i, /**< Boolean-to-int conversion */
|
||||
ir_unop_u2f, /**< Unsigned-to-float conversion. */
|
||||
ir_unop_i2u, /**< Integer-to-unsigned conversion. */
|
||||
ir_unop_u2i, /**< Unsigned-to-integer conversion. */
|
||||
ir_unop_any,
|
||||
|
||||
/**
|
||||
|
|
|
@ -166,7 +166,18 @@ ir_expression::constant_expression_value()
|
|||
data.b[c] = op[0]->value.u[c] ? true : false;
|
||||
}
|
||||
break;
|
||||
|
||||
case ir_unop_u2i:
|
||||
assert(op[0]->type->base_type == GLSL_TYPE_UINT);
|
||||
for (unsigned c = 0; c < op[0]->type->components(); c++) {
|
||||
data.i[c] = op[0]->value.u[c];
|
||||
}
|
||||
break;
|
||||
case ir_unop_i2u:
|
||||
assert(op[0]->type->base_type == GLSL_TYPE_INT);
|
||||
for (unsigned c = 0; c < op[0]->type->components(); c++) {
|
||||
data.u[c] = op[0]->value.i[c];
|
||||
}
|
||||
break;
|
||||
case ir_unop_any:
|
||||
assert(op[0]->type->is_boolean());
|
||||
data.b[0] = false;
|
||||
|
|
|
@ -280,6 +280,14 @@ ir_validate::visit_leave(ir_expression *ir)
|
|||
assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
|
||||
assert(ir->type->base_type == GLSL_TYPE_FLOAT);
|
||||
break;
|
||||
case ir_unop_i2u:
|
||||
assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
|
||||
assert(ir->type->base_type == GLSL_TYPE_UINT);
|
||||
break;
|
||||
case ir_unop_u2i:
|
||||
assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
|
||||
assert(ir->type->base_type == GLSL_TYPE_INT);
|
||||
break;
|
||||
|
||||
case ir_unop_any:
|
||||
assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
|
||||
|
|
Loading…
Reference in New Issue