[Mesa-dev] [PATCH V2 19/28] glsl: add support for explicit components to frag outputs

Timothy Arceri timothy.arceri at collabora.com
Wed Jan 13 13:47:33 PST 2016


On Wed, 2016-01-13 at 12:02 -0800, Anuj Phogat wrote:
> Timothy, Do you have a branch somewhere with the latest patches?

https://github.com/tarceri/Mesa_arrays_of_arrays.git explicit_offset

Contains the latest for component, offset, and align qualifiers all of
which have now been sent to the list.


> 
> On Wed, Jan 13, 2016 at 10:58 AM, Anuj Phogat <anuj.phogat at gmail.com>
> wrote:
> > On Wed, Jan 13, 2016 at 1:19 AM, Timothy Arceri
> > <timothy.arceri at collabora.com> wrote:
> > > V2: fix error checking for arrays and components. V1 was
> > > only taking into account all the array elements and all the
> > > components of one of the varyings during the comparision
> > > and treating the other as a single slot/component.
> > > 
> > > Cc: Anuj Phogat <anuj.phogat at gmail.com>
> > > ---
> > >  src/glsl/linker.cpp | 72
> > > +++++++++++++++++++++++++++++++++++++++++++++--------
> > >  1 file changed, 62 insertions(+), 10 deletions(-)
> > > 
> > > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> > > index b81bfba..c66dcc4 100644
> > > --- a/src/glsl/linker.cpp
> > > +++ b/src/glsl/linker.cpp
> > > @@ -2411,7 +2411,12 @@
> > > assign_attribute_or_color_locations(gl_shader_program *prog,
> > >        }
> > >     } to_assign[16];
> > > 
> > > +   /* Temporary array for the set of attributes that have
> > > locations assigned.
> > > +    */
> > > +   ir_variable *assigned[16];
> > > +
> > >     unsigned num_attr = 0;
> > > +   unsigned assigned_attr = 0;
> > > 
> > >     foreach_in_list(ir_instruction, node, sh->ir) {
> > >        ir_variable *const var = node->as_variable();
> > > @@ -2573,18 +2578,62 @@
> > > assign_attribute_or_color_locations(gl_shader_program *prog,
> > >              * attribute overlaps any previously allocated bits.
> > >              */
> > >             if ((~(use_mask << attr) & used_locations) !=
> > > used_locations) {
> > > -               if (target_index == MESA_SHADER_FRAGMENT ||
> > > -                   (prog->IsES && prog->Version >= 300)) {
> > > -                  linker_error(prog,
> > > -                               "overlapping location is assigned
> > > "
> > > -                               "to %s `%s' %d %d %d\n", string,
> > > -                               var->name, used_locations,
> > > use_mask, attr);
> > > +               if (target_index == MESA_SHADER_FRAGMENT && !prog
> > > ->IsES) {
> > > +                  /* From section 4.4.2 (Output Layout
> > > Qualifiers) of the GLSL
> > > +                   * 4.40 spec:
> > > +                   *
> > > +                   *    "Additionally, for fragment shader
> > > outputs, if two
> > > +                   *    variables are placed within the same
> > > location, they
> > > +                   *    must have the same underlying type
> > > (floating-point or
> > > +                   *    integer). No component aliasing of
> > > output variables or
> > > +                   *    members is allowed.
> > > +                   */
> > > +                  for (unsigned i = 0; i < assigned_attr; i++) {
> > > +                     unsigned assigned_slots =
> > > +                        assigned[i]->type
> > > ->count_attribute_slots(false);
> > > +                    unsigned assig_attr =
> > > +                        assigned[i]->data.location -
> > > generic_base;
> > > +                    unsigned assigned_use_mask = (1 <<
> > > assigned_slots) - 1;
> > > +
> > > +                     if ((assigned_use_mask << assig_attr) &
> > > +                         (use_mask << attr)) {
> > > +
> > > +                        const glsl_type *assigned_type =
> > > +                           assigned[i]->type->without_array();
> > > +                        const glsl_type *type = var->type
> > > ->without_array();
> > > +                        if (assigned_type->base_type != type
> > > ->base_type) {
> > > +                           linker_error(prog, "types do not
> > > match for aliased"
> > > +                                        " %ss %s and %s\n",
> > > string,
> > > +                                        assigned[i]->name, var
> > > ->name);
> > > +                           return false;
> > > +                        }
> > > +
> > > +                        unsigned assigned_component_mask =
> > > +                           ((1 << assigned_type
> > > ->vector_elements) - 1) <<
> > > +                           assigned[i]->data.location_frac;
> > > +                        unsigned component_mask =
> > > +                           ((1 << type->vector_elements) - 1) <<
> > > +                           var->data.location_frac;
> > > +                        if (assigned_component_mask &
> > > component_mask) {
> > > +                           linker_error(prog, "overlapping
> > > component is "
> > > +                                        "assigned to %ss %s and
> > > %s "
> > > +                                        "(component=%d)\n",
> > > +                                        string, assigned[i]
> > > ->name, var->name,
> > > +                                        var
> > > ->data.location_frac);
> > > +                           return false;
> > > +                        }
> > > +                     }
> > > +                  }
> > > +               } else if (target_index == MESA_SHADER_FRAGMENT
> > > ||
> > > +                          (prog->IsES && prog->Version >= 300))
> > > {
> > > +                  linker_error(prog, "overlapping location is
> > > assigned "
> > > +                               "to %s `%s' %d %d %d\n", string,
> > > var->name,
> > > +                               used_locations, use_mask, attr);
> > >                    return false;
> > >                 } else {
> > > -                  linker_warning(prog,
> > > -                                 "overlapping location is
> > > assigned "
> > > -                                 "to %s `%s' %d %d %d\n",
> > > string,
> > > -                                 var->name, used_locations,
> > > use_mask, attr);
> > > +                  linker_warning(prog, "overlapping location is
> > > assigned "
> > > +                                 "to %s `%s' %d %d %d\n",
> > > string, var->name,
> > > +                                 used_locations, use_mask,
> > > attr);
> > >                 }
> > >             }
> > > 
> > > @@ -2614,6 +2663,9 @@
> > > assign_attribute_or_color_locations(gl_shader_program *prog,
> > >                 double_storage_locations |= (use_mask << attr);
> > >          }
> > > 
> > > +         assigned[assigned_attr] = var;
> > > +         assigned_attr++;
> > > +
> > >          continue;
> > >        }
> > > 
> > > --
> > > 2.4.3
> > > 
> > 
> > Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list