[Mesa-dev] [PATCH 3/5] glsl: struct constructors/initializers only allow implicit conversions
Timothy Arceri
timothy.arceri at collabora.com
Thu Aug 4 00:05:32 UTC 2016
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 <agomez at 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);
> }
>
More information about the mesa-dev
mailing list