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

Reply via email to