On Wed, 2016-08-03 at 23:51 +0300, Andres Gomez wrote: > When an argument for a structure constructor or initializer doesn't > match the expected type, only Section 4.1.10 “Implicit Conversions” > are allowed to try to match that expected type. > > From page 32 (page 38 of the PDF) of the GLSL 1.20 spec: > > " The arguments to the constructor will be used to set the > structure's > fields, in order, using one argument per field. Each argument > must > be the same type as the field it sets, or be a type that can be > converted to the field's type according to Section 4.1.10 > “Implicit > Conversions.”" > > From page 35 (page 41 of the PDF) of the GLSL 4.20 spec: > > " In all cases, the innermost initializer (i.e., not a list of > initializers enclosed in curly braces) applied to an object must > have the same type as the object being initialized or be a type > that > can be converted to the object's type according to section 4.1.10 > "Implicit Conversions". In the latter case, an implicit > conversion > will be done on the initializer before the assignment is done." > > Fixes GL44-CTS.shading_language_420pack.initializer_list_negative > > Signed-off-by: Andres Gomez <ago...@igalia.com> > --- > src/compiler/glsl/ast_function.cpp | 36 > +++++++++++++++++++++++++++++++----- > 1 file changed, 31 insertions(+), 5 deletions(-) > > diff --git a/src/compiler/glsl/ast_function.cpp > b/src/compiler/glsl/ast_function.cpp > index 567ad6e..ccd070f 100644 > --- a/src/compiler/glsl/ast_function.cpp > +++ b/src/compiler/glsl/ast_function.cpp > @@ -1718,6 +1718,23 @@ process_record_constructor(exec_list > *instructions, > struct _mesa_glsl_parse_state *state) > { > void *ctx = state; > + /* From page 32 (page 38 of the PDF) of the GLSL 1.20 spec: > + * > + * "The arguments to the constructor will be used to set the > structure's > + * fields, in order, using one argument per field. Each > argument must > + * be the same type as the field it sets, or be a type that > can be > + * converted to the field's type according to Section 4.1.10 > “Implicit > + * Conversions.”" > + * > + * From page 35 (page 41 of the PDF) of the GLSL 4.20 spec: > + * > + * "In all cases, the innermost initializer (i.e., not a list > of > + * initializers enclosed in curly braces) applied to an > object must > + * have the same type as the object being initialized or be a > type that > + * can be converted to the object's type according to section > 4.1.10 > + * "Implicit Conversions". In the latter case, an implicit > conversion > + * will be done on the initializer before the assignment is > done." > + */ > exec_list actual_parameters; > > process_parameters(instructions, &actual_parameters, > @@ -1734,17 +1751,26 @@ process_record_constructor(exec_list > *instructions, > return ir_rvalue::error_value(ctx); > } > > - if (apply_implicit_conversion(constructor_type- > >fields.structure[i].type, > - ir, state)) { > + const glsl_struct_field *struct_field = > + &constructor_type->fields.structure[i]; > + > + /* Apply implicit conversions (not the scalar constructor > rules!). See > + * the spec quote above. > + */ > + if ((struct_field->type->base_type != ir->type->base_type) > + && (implicitly_convert_component(ir, struct_field->type- > >base_type, > + ir, state))) { > node->replace_with(ir); > - } else { > + }
If you flow my suggestions in patch 2 you should be able to make this function more like the other two i.e change this too: all_parameters_are_constant &= implicitly_convert_component(...) Remove the constant_record_constructor function and replace the last couple of lines with: if (all_parameters_are_constant) { return return new(ctx) ir_constant(constructor_type, &actual_parameters); } else { return emit_inline_record_constructor(constructor_type, instructions, &actual_parameters, state); } > + > + if (ir->type != struct_field->type) { > _mesa_glsl_error(loc, state, > "parameter type mismatch in constructor > for `%s.%s' " > "(%s vs %s)", > constructor_type->name, > - constructor_type- > >fields.structure[i].name, > + struct_field->name, > ir->type->name, > - constructor_type- > >fields.structure[i].type->name); > + struct_field->type->name); > return ir_rvalue::error_value(ctx); > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev