[Mesa-dev] [PATCH v2 9/8] glsl/linker: refactor check_location_aliasing
Iago Toral
itoral at igalia.com
Thu Oct 26 06:36:01 UTC 2017
On Wed, 2017-10-25 at 08:35 -0400, Ilia Mirkin wrote:
> Not your fault, but this diff is hard to read. On the bright side, 20
> lines removed... Can you confirm that
>
> layout(location = 1, component = 2) int foo;
> layout(location = 0) dvec3 bar;
>
> fails due to the int vs double conflicts? (I'm specifically
> interested
> in the case where the int is specified first and dvec3 is specified
> second, since it'll be up to the processing of the dvec3 to determine
> the conflict on the second slot.)
>
> Assuming that all checks out,
Yeah, I have checked this (and a few other variations) and everything
seems to work as expected.
> Acked-by: Ilia Mirkin <imirkin at alum.mit.edu>
Thanks to you and Timothy for all the reviews!
Iago
>
> On Wed, Oct 25, 2017 at 5:15 AM, Iago Toral Quiroga <itoral at igalia.co
> m> wrote:
> > Mostly, this merges the type checks with all the other checks so
> > we only have a single loop for this.
> > ---
> > src/compiler/glsl/link_varyings.cpp | 110 +++++++++++++++---------
> > ------------
> > 1 file changed, 46 insertions(+), 64 deletions(-)
> >
> > diff --git a/src/compiler/glsl/link_varyings.cpp
> > b/src/compiler/glsl/link_varyings.cpp
> > index e80736fb38..8767f00976 100644
> > --- a/src/compiler/glsl/link_varyings.cpp
> > +++ b/src/compiler/glsl/link_varyings.cpp
> > @@ -438,92 +438,74 @@ check_location_aliasing(struct
> > explicit_location_info explicit_locations[][4],
> > }
> >
> > while (location < location_limit) {
> > - unsigned i = component;
> > -
> > - /* If there are other outputs assigned to the same location
> > - * they must have the same interpolation
> > - */
> > unsigned comp = 0;
> > while (comp < 4) {
> > - /* Skip the components used by this output, we only care
> > about
> > - * other outputs in the same location
> > - */
> > - if (comp == i) {
> > - comp = last_comp;
> > - continue;
> > - }
> > -
> > struct explicit_location_info *info =
> > &explicit_locations[location][comp];
> >
> > if (info->var) {
> > - if (info->interpolation != interpolation) {
> > + /* Component aliasing is not alloed */
> > + if (comp >= component && comp < last_comp) {
> > linker_error(prog,
> > - "%s shader has multiple outputs at
> > explicit "
> > - "location %u with different
> > interpolation "
> > - "settings\n",
> > - _mesa_shader_stage_to_string(stage),
> > location);
> > + "%s shader has multiple outputs
> > explicitly "
> > + "assigned to location %d and component
> > %d\n",
> > + _mesa_shader_stage_to_string(stage),
> > + location, component);
> > return false;
> > - }
> > -
> > - if (info->centroid != centroid ||
> > - info->sample != sample ||
> > - info->patch != patch) {
> > - linker_error(prog,
> > - "%s shader has multiple outputs at
> > explicit "
> > - "location %u with different aux
> > storage\n",
> > - _mesa_shader_stage_to_string(stage),
> > location);
> > - return false;
> > - }
> > - }
> > -
> > - comp++;
> > - }
> > + } else {
> > + /* For all other used components we need to have
> > matching
> > + * types, interpolation and auxiliary storage
> > + */
> > + if (info->base_type != 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",
> > + location, component);
> > + return false;
> > + }
> >
> > - /* Component aliasing is not allowed */
> > - while (i < last_comp) {
> > - if (explicit_locations[location][i].var != NULL) {
> > - linker_error(prog,
> > - "%s shader has multiple outputs
> > explicitly "
> > - "assigned to location %d and component
> > %d\n",
> > - _mesa_shader_stage_to_string(stage),
> > - location, component);
> > - return false;
> > - }
> > + if (info->interpolation != interpolation) {
> > + linker_error(prog,
> > + "%s shader has multiple outputs at
> > explicit "
> > + "location %u with different
> > interpolation "
> > + "settings\n",
> > + _mesa_shader_stage_to_string(stage)
> > , location);
> > + return false;
> > + }
> >
> > - /* Make sure all component at this location have the same
> > type.
> > - */
> > - for (unsigned j = 0; j < 4; j++) {
> > - if (explicit_locations[location][j].var &&
> > - explicit_locations[location][j].base_type !=
> > - 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",
> > location, component);
> > - return false;
> > + if (info->centroid != centroid ||
> > + info->sample != sample ||
> > + info->patch != patch) {
> > + linker_error(prog,
> > + "%s shader has multiple outputs at
> > explicit "
> > + "location %u with different aux
> > storage\n",
> > + _mesa_shader_stage_to_string(stage)
> > , location);
> > + return false;
> > + }
> > }
> > + } else if (comp >= component && comp < last_comp) {
> > + info->var = var;
> > + info->base_type = type->without_array()->base_type;
> > + info->interpolation = interpolation;
> > + info->centroid = centroid;
> > + info->sample = sample;
> > + info->patch = patch;
> > }
> >
> > - explicit_locations[location][i].var = var;
> > - explicit_locations[location][i].base_type =
> > - type->without_array()->base_type;
> > - explicit_locations[location][i].interpolation =
> > interpolation;
> > - explicit_locations[location][i].centroid = centroid;
> > - explicit_locations[location][i].sample = sample;
> > - explicit_locations[location][i].patch = patch;
> > - i++;
> > + comp++;
> >
> > /* We need to do some special handling for doubles as
> > dvec3 and
> > * dvec4 consume two consecutive locations. We don't need
> > to
> > * worry about components beginning at anything other
> > than 0 as
> > * the spec does not allow this for dvec3 and dvec4.
> > */
> > - if (i == 4 && last_comp > 4) {
> > + if (comp == 4 && last_comp > 4) {
> > last_comp = last_comp - 4;
> > /* Bump location index and reset the component index
> > */
> > location++;
> > - i = 0;
> > + comp = 0;
> > + component = 0;
> > }
> > }
> >
> > --
> > 2.11.0
> >
>
>
More information about the mesa-dev
mailing list