glsl: Simplify aggregate type inference to prepare for ARB_arrays_of_arrays.
Most of the time it is not necessary to perform type inference to
compile GLSL; the type of every expression can be inferred from the
contents of the expression itself (and previous type declarations).
The exception is aggregate initializers: their type is determined by
the LHS of the variable being assigned to. For example, in the
statement:
mat2 foo = { { 1, 2 }, { 3, 4 } };
the type of { 1, 2 } is only known to be vec2 (as opposed to, say,
ivec2, uvec2, int[2], or a struct) because of the fact that the result
is being assigned to a mat2.
Previous to this patch, we handled this situation by doing some type
inference during parsing: when parsing a declaration like the one
above, we would call _mesa_set_aggregate_type(), which would infer the
type of each aggregate initializer and store it in the corresponding
ast_aggregate_initializer::constructor_type field. Since this
happened at parse time, we couldn't do the type inference using
glsl_type objects; we had to use ast_type_specifiers, which are much
more awkward to work with. Things are about to get more complicated
when we add support for ARB_arrays_of_arrays.
This patch simplifies things by postponing the call to
_mesa_set_aggregate_type() until ast-to-hir time, when we have access
to glsl_type objects. As a side benefit, we only need to have one
call to _mesa_set_aggregate_type() now, instead of six.
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
@@ -1687,14 +1687,12 @@ ast_aggregate_initializer::hir(exec_list *instructions,
|
||||
{
|
||||
void *ctx = state;
|
||||
YYLTYPE loc = this->get_location();
|
||||
const char *name;
|
||||
|
||||
if (!this->constructor_type) {
|
||||
_mesa_glsl_error(&loc, state, "type of C-style initializer unknown");
|
||||
return ir_rvalue::error_value(ctx);
|
||||
}
|
||||
const glsl_type *const constructor_type =
|
||||
this->constructor_type->glsl_type(&name, state);
|
||||
const glsl_type *const constructor_type = this->constructor_type;
|
||||
|
||||
if (!state->ARB_shading_language_420pack_enable) {
|
||||
_mesa_glsl_error(&loc, state, "C-style initialization requires the "
|
||||
@@ -1702,12 +1700,12 @@ ast_aggregate_initializer::hir(exec_list *instructions,
|
||||
return ir_rvalue::error_value(ctx);
|
||||
}
|
||||
|
||||
if (this->constructor_type->is_array) {
|
||||
if (constructor_type->is_array()) {
|
||||
return process_array_constructor(instructions, constructor_type, &loc,
|
||||
&this->expressions, state);
|
||||
}
|
||||
|
||||
if (this->constructor_type->structure) {
|
||||
if (constructor_type->is_record()) {
|
||||
return process_record_constructor(instructions, constructor_type, &loc,
|
||||
&this->expressions, state);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user