[Mesa-dev] [PATCH 11/28] glsl: cross validate varyings with a component qualifier

Timothy Arceri timothy.arceri at collabora.com
Thu Jan 7 15:22:10 PST 2016


On Thu, 2016-01-07 at 13:47 -0800, Anuj Phogat wrote:
> On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri
> <timothy.arceri at collabora.com> wrote:
> > This change checks for component overlap, including handling
> > overlap of
> > locations and components by doubles. Previously there was no
> > validation
> > for assigning explicit locations to a location used by the second
> > half
> > of a double.
> > 
> > V2: fix component matching for matricies
> > ---
> >  src/glsl/link_varyings.cpp | 71
> > +++++++++++++++++++++++++++++++++++++++-------
> >  1 file changed, 60 insertions(+), 11 deletions(-)
> > 
> > diff --git a/src/glsl/link_varyings.cpp
> > b/src/glsl/link_varyings.cpp
> > index dea8741..496b987 100644
> > --- a/src/glsl/link_varyings.cpp
> > +++ b/src/glsl/link_varyings.cpp
> > @@ -222,7 +222,7 @@ cross_validate_outputs_to_inputs(struct
> > gl_shader_program *prog,
> >                                  gl_shader *producer, gl_shader
> > *consumer)
> >  {
> >     glsl_symbol_table parameters;
> > -   ir_variable *explicit_locations[MAX_VARYING] = { NULL, };
> > +   ir_variable *explicit_locations[MAX_VARYING][4] = { {NULL,
> > NULL} };
> > 
> >     /* Find all shader outputs in the "producer" stage.
> >      */
> > @@ -243,18 +243,67 @@ cross_validate_outputs_to_inputs(struct
> > gl_shader_program *prog,
> >           unsigned num_elements = type
> > ->count_attribute_slots(false);
> >           unsigned idx = var->data.location - VARYING_SLOT_VAR0;
> >           unsigned slot_limit = idx + num_elements;
> > +         unsigned last_comp;
> > +
> > +         if (var->type->without_array()->is_record()) {
> > +            /* The componet qualifier can't be used on structs so
> > just treat
> > +             * all component slots as used.
> > +             */
> > +            last_comp = 4;
> > +         } else {
> > +            last_comp = var->data.location_frac +
> > +               var->type->without_array()->vector_elements;
> > +         }
> > 
> >           while(idx < slot_limit) {
> > -            if (explicit_locations[idx] != NULL) {
> > -               linker_error(prog,
> > -                         "%s shader has multiple outputs
> > explicitly "
> > -                         "assigned to location %d\n",
> > -                         _mesa_shader_stage_to_string(producer
> > ->Stage),
> > -                         idx);
> > -               return;
> > -            }
> > +            bool d_second_location = false;
> > +            for (unsigned i = var->data.location_frac; i <
> > last_comp; i++) {
> > +               if (explicit_locations[idx][i] != NULL) {
> > +                  linker_error(prog,
> > +                               "%s shader has multiple outputs
> > explicitly "
> > +                               "assigned to location %d and
> > component %d\n",
> > +                              
> >  _mesa_shader_stage_to_string(producer->Stage),
> > +                               idx, var->data.location_frac);
> > +                  return;
> > +               }
> > 
> > -            explicit_locations[idx] = var;
> > +               /* Make sure all component at this location have
> > the same type.
> > +                */
> > +               for (unsigned j = 0; j < 4; j++) {
> > +                  if (explicit_locations[idx][j] &&
> > +                      (explicit_locations[idx][j]->type
> > ->without_array()
> > +                       ->base_type != var->type->without_array()
> > ->base_type)) {
> > +                     linker_error(prog,
> > +                                  "Varyings sharing the same
> > location must "
> > +                                  "have the same underlying
> > numerical type. "
> > +                                  "Location %u component %u\n",
> > idx,
> > +                                  var->data.location_frac);
> > +                     return;
> > +                  }
> > +               }
> > +
> > +               explicit_locations[idx][i] = var;
> With this code we end up setting only components 0 and 1 for dvec2.
> My
> understanding is dvec2 will take all 4 components?

Nice spotting, I've sent a new version of the patch which makes double
handling much nicer and fixes this issue.

There is also a new piglit to test this case:

http://patchwork.freedesktop.org/patch/69671/


More information about the mesa-dev mailing list