mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
Constant-fold constructor parameters after type conversion
This causes the following tests to pass:
glslparsertest/shaders/CorrectMatComma2.frag
One of the incorrect errors in glslparsertest/shaders/CorrectComma.frag
is also eliminated.
This commit is contained in:
parent
9e08d019ce
commit
00eb466e38
1 changed files with 14 additions and 8 deletions
|
|
@ -137,6 +137,7 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||
{
|
||||
const unsigned a = desired_type->base_type;
|
||||
const unsigned b = src->type->base_type;
|
||||
ir_expression *result = NULL;
|
||||
|
||||
if (src->type->is_error())
|
||||
return src;
|
||||
|
|
@ -151,32 +152,37 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
|
|||
case GLSL_TYPE_UINT:
|
||||
case GLSL_TYPE_INT:
|
||||
if (b == GLSL_TYPE_FLOAT)
|
||||
return new ir_expression(ir_unop_f2i, desired_type, src, NULL);
|
||||
result = new ir_expression(ir_unop_f2i, desired_type, src, NULL);
|
||||
else {
|
||||
assert(b == GLSL_TYPE_BOOL);
|
||||
return new ir_expression(ir_unop_b2i, desired_type, src, NULL);
|
||||
result = new ir_expression(ir_unop_b2i, desired_type, src, NULL);
|
||||
}
|
||||
break;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
switch (b) {
|
||||
case GLSL_TYPE_UINT:
|
||||
return new ir_expression(ir_unop_u2f, desired_type, src, NULL);
|
||||
result = new ir_expression(ir_unop_u2f, desired_type, src, NULL);
|
||||
break;
|
||||
case GLSL_TYPE_INT:
|
||||
return new ir_expression(ir_unop_i2f, desired_type, src, NULL);
|
||||
result = new ir_expression(ir_unop_i2f, desired_type, src, NULL);
|
||||
break;
|
||||
case GLSL_TYPE_BOOL:
|
||||
return new ir_expression(ir_unop_b2f, desired_type, src, NULL);
|
||||
result = new ir_expression(ir_unop_b2f, desired_type, src, NULL);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case GLSL_TYPE_BOOL: {
|
||||
int z = 0;
|
||||
ir_constant *const zero = new ir_constant(src->type, &z);
|
||||
|
||||
return new ir_expression(ir_binop_nequal, desired_type, src, zero);
|
||||
result = new ir_expression(ir_binop_nequal, desired_type, src, zero);
|
||||
}
|
||||
}
|
||||
|
||||
assert(!"Should not get here.");
|
||||
return NULL;
|
||||
assert(result != NULL);
|
||||
|
||||
ir_constant *const constant = result->constant_expression_value();
|
||||
return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue