[Mesa-dev] [PATCH 2/2] glsl: struct constructors/initializers only allow implicit conversions

Timothy Arceri timothy.arceri at collabora.com
Tue Aug 2 02:23:53 UTC 2016


On Mon, 2016-08-01 at 12:05 +0300, Andres Gomez wrote:
> On Mon, 2016-08-01 at 10:01 +1000, Timothy Arceri wrote:
> > On Sun, 2016-07-31 at 18:43 +0300, Andres Gomez wrote:
> 
> [snip]
> 
> > diff --git a/src/compiler/glsl/ast_function.cpp
> > > b/src/compiler/glsl/ast_function.cpp
> > > index 9dcec50..9b09cb6 100644
> > > --- a/src/compiler/glsl/ast_function.cpp
> > > +++ b/src/compiler/glsl/ast_function.cpp
> > > @@ -31,10 +31,6 @@
> > >  static ir_rvalue *
> > >  convert_component(ir_rvalue *src, const glsl_type
> > > *desired_type);
> > >  
> > > -bool
> > > -apply_implicit_conversion(const glsl_type *to, ir_rvalue *
> > > &from,
> > > -                          struct _mesa_glsl_parse_state *state);
> > > -
> > 
> > I'd put this in a third patch when you remove this and
> > make apply_implicit_conversion() static.
> 
> That makes sense. I would also remove the actual usage of
> "apply_implicit_conversion" in "process_record_constructor" in that
> patch too.

I'd leave the remove of the usage in this patch otherwise it won't make
much sense.

> 
> [snip]
> 
> > > @@ -1710,7 +1723,7 @@ process_record_constructor(exec_list
> > > *instructions,
> > >  
> > >     exec_node *node = actual_parameters.get_head_raw();
> > >     for (unsigned i = 0; i < constructor_type->length; i++) {
> > > -      ir_rvalue *ir = (ir_rvalue *) node;
> > > +      ir_rvalue *result = (ir_rvalue *) node;
> > 
> > Maybe its just me but I find this naming really confusing when
> > trying
> > to read the following code, I'd just leave it as ir.
> 
> I was doubting about this also. I decided to change the name for
> coherence with other chunks of code in this file which perform
> similar
> checks and conversions. See "process_vec_mat_constructor" and
> "process_array_constructor".
> 
> Do you still prefer to leave it as "ir"?

Up to you. I don't like it but I don't care enough to make you change
it if you think it makes more sense :)

> 
> > >  
> > >        if (node->is_tail_sentinel()) {
> > >           _mesa_glsl_error(loc, state,
> > > @@ -1719,18 +1732,35 @@ process_record_constructor(exec_list
> > > *instructions,
> > >           return ir_rvalue::error_value(ctx);
> > >        }
> > >  
> > > -      if (apply_implicit_conversion(constructor_type-
> > > > fields.structure[i].type,
> > > -                                 ir, state)) {
> > > -         node->replace_with(ir);
> > > -      } else {
> > > -         _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,
> > > -                          ir->type->name,
> > > -                          constructor_type-
> > > > fields.structure[i].type->name);
> > > +      const glsl_base_type element_base_type =
> > > +         constructor_type->fields.structure[i].type->base_type;
> > > +
> > > +      /* Apply implicit conversions (not the scalar constructor
> > > rules!). See
> > > +       * the spec quote above. */
> > 
> > */ should be on the next line
> 
> Right! I will update.
> 
> > > +      if (element_base_type != result->type->base_type) {
> > > +         const glsl_type *desired_type =
> > > +            glsl_type::get_instance(element_base_type,
> > > +                                    result->type-
> > > >vector_elements,
> > > +                                    result->type-
> > > >matrix_columns);
> > > +
> > > +	 if (result->type-
> > > >can_implicitly_convert_to(desired_type,
> > > state)) {
> > > +	    /* Even though convert_component() implements the
> > > constructor
> > > +	     * conversion rules (not the implicit conversion
> > > rules),
> > > its safe
> > > +	     * to use it here because we already checked that
> > > the
> > > implicit
> > > +	     * conversion is legal.
> > > +	     */
> > > +	    result = convert_component(result, desired_type);
> > > +	 }
> > 
> > You are adding a bunch of tabs above please remove them. It would
> > be
> > nice if you could add a forth patch to the series that removes the
> > remain tabs in this file since there are not many remaining.
> 
> Ouch! The curse of copy and paste ☹
> 
> I will update and add that 4th patch.
> 
> Now that you comment that, maybe you can give a review to?
> https://patchwork.freedesktop.org/patch/97838/
> 
> > > +      }
> > > +
> > > +      if (result->type != constructor_type-
> > > > fields.structure[i].type) {
> > > +	 _mesa_glsl_error(loc, state, "type error in array
> > > constructor: "
> > > +			  "expected: %s, found %s",
> > > +			  constructor_type-
> > > > fields.structure[i].type->name,
> > > +			  result->type->name);
> > >           return ir_rvalue::error_value(ctx);
> > > +      } else {
> > > +         node->replace_with(result);
> > >        }
> > 
> > This if-else should be inside the previous if.
> > 
> >  The node->replace_with(result); should be after
> >  result = convert_component(result, desired_type);
> > 
> > Otherwise you are replacing the node with itself.
> > 
> > The error message can be added as an else to if (result->type-
> > > can_implicitly_convert_to())
> 
> Argh! Yeah, that's a shame.
> 
> I will update.
> 
> > >  
> > >        node = node->next;
> > 
> > I'm still not entirely sure I understand why this patch is
> > different
> > from using apply_implicit_conversion() can you explain to me why
> > apply_implicit_conversion() does not match the rules correctly?
> > Thanks
> > :)
> 
> "apply_implicit_conversion" in that code was added at:
> 
> > commit f32d3df8ab2b7c6c746f46870edc4b284cea50ca
> > Author: Kenneth Graunke <kenneth at whitecape.org>
> > Date:   Wed Sep 1 20:03:17 2010 -0700
> > 
> >     glsl: Apply implicit conversions to structure constructor
> > parameters.
> >     
> >     The code for handling implicit conversions should probably get
> >     refactored, but for now, this is easy.
> >     
> >     Fixes piglit test constructor-26.vert.
> 
> As the commit states, it was a quick fix to make that piglit test
> pass.
> 
> The problem is that "apply_implicit_conversion" doesn't strictly
> check
> for the rules in Section 4.1.10 “Implicit Conversions.” Specifically,
> it allows conversions from a vector or a bigger dimension to a vector
> or a smaller dimension. That was making the CTS test fail.
> 
> Now, the actual fix comes from using
> "glsl_type::can_implicitly_convert_to" to check for those conversion
> rules. We could still keep using "apply_implicit_conversion" but that
> it is not necessary any more. Instead, we can replace with the local
> "convert_component" and make the code more homogeneous and coherent
> with the rest of the code in this file.

I see thanks. In that case I would suggest you make a new helper in a
patch before this one with the below code and make use of it with the
other two functions rather than copy and pasting it everywhere.


         const glsl_type *desired_type =
            glsl_type::get_instance(element_base_type,
                                    ir->type->vector_elements,
                                    ir->type->matrix_columns);

	 if (result->type->can_implicitly_convert_to(desired_type,
state)) {
	    /* Even though convert_component() implements the
constructor
	     * conversion rules (not the implicit conversion rules),
its safe
	     * to use it here because we already checked that the
implicit
	     * conversion is legal.
	     */
	    result = convert_component(ir, desired_type);
	 }

> 
> I hope that explains the changes. In any case, fragmenting in 3
> patches
> will make this more evident.
> 
> FTR, I run a complete pass on the piglit and CTS tests and couldn't
> detect any regression with this series.
> 
> Thanks for the review!
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list