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.pho...@gmail.com> > wrote: > > On Wed, Jan 13, 2016 at 1:19 AM, Timothy Arceri > > <timothy.arc...@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.pho...@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.pho...@gmail.com> > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev