[Mesa-dev] [PATCH] glsl/linker: outputs in the same location must share interpolation
Iago Toral
itoral at igalia.com
Thu Oct 19 06:29:17 UTC 2017
On Thu, 2017-10-19 at 17:14 +1100, Timothy Arceri wrote:
>
> On 19/10/17 16:57, Iago Toral Quiroga wrote:
> > From ARB_enhanced_layouts:
> >
> > "[...]when location aliasing, the aliases sharing the location
> > must have the same underlying numerical type (floating-point or
> > integer) and the same auxiliary storage and
> > interpolation qualification.[...]"
> >
> > Add code to the linker to validate that aliased locations do
> > have the same interpolation.
> >
> > Fixes:
> > KHR-
> > GL45.enhanced_layouts.varying_location_aliasing_with_mixed_interpol
> > ation
> > ---
> > src/compiler/glsl/link_varyings.cpp | 35
> > +++++++++++++++++++++++++++++++++++
> > 1 file changed, 35 insertions(+)
> >
> > diff --git a/src/compiler/glsl/link_varyings.cpp
> > b/src/compiler/glsl/link_varyings.cpp
> > index 69c92bf53b..c888635e82 100644
> > --- a/src/compiler/glsl/link_varyings.cpp
> > +++ b/src/compiler/glsl/link_varyings.cpp
> > @@ -459,6 +459,41 @@ cross_validate_outputs_to_inputs(struct
> > gl_context *ctx,
> >
> > while (idx < slot_limit) {
> > unsigned i = var->data.location_frac;
> > +
> > + /* If there are other outputs assigned to the same
> > location
> > + * they must have the same interpolation
> > + */
> > + unsigned comp = 0;
> > + while (comp < i) {
> > + ir_variable *tmp = explicit_locations[idx][comp];
> > + if (tmp && tmp->data.interpolation != var-
> > >data.interpolation) {
> > + linker_error(prog,
> > + "%s shader has multiple outputs at
> > explicit "
> > + "location %u with different
> > interpolation "
> > + "settings\n",
> > + _mesa_shader_stage_to_string(produc
> > er->Stage),
> > + idx);
> > + return;
> > + }
> > + comp++;
> > + }
> > +
> > + comp = last_comp + 1;
I just noticed that this should be:
comp = last_comp;
since that is the first component not used by this variable.
> > + while (comp < 4) {
> > + ir_variable *tmp = explicit_locations[idx][comp];
> > + if (tmp && tmp->data.interpolation != var-
> > >data.interpolation) {
> > + linker_error(prog,
> > + "%s shader has multiple outputs at
> > explicit "
> > + "location %u with different
> > interpolation "
> > + "settings\n",
> > + _mesa_shader_stage_to_string(produc
> > er->Stage),
> > + idx);
> > + return;
> > + }
> > + comp++;
> > + }
>
> Can't we just put this check in the loop below? It should allow
> doubles
> to be handled without the duplication if my quick skim over the code
> is
> correct.
Mmm...I don't think so. The loop below checks the components used by
the current variable to see if there is aliasing in the range used by
the variable: [i, last_comp). We need to check if there are other
variables assigned to any other components in the same location to
check if there is a different interpolation for them, so that means
that we need to check all the components in the location that are _not_
used by this variable, so basically, all the components not covered by
the loop below. This means the regions [0...i) and [last_comp...4].
We could make the loop below go up to 4 instead of last_comp and the
nhave ifs inside to do one thing in the range [i...last_comp) and
another one in the range [last_comp, 4] but that would only make things
more confusing IMHO, so I'd rather not do that.
Iago
>
> > +
> > + /* Component aliasing is not allowed */
> > while (i < last_comp) {
> > if (explicit_locations[idx][i] != NULL) {
> > linker_error(prog,
> >
>
>
More information about the mesa-dev
mailing list