This is not so much based on the spec but based on the original code we
had in the linker (which we still have) which assumes that all
locations consumed by a struct variable use up all 4 components (thus
preventing any kind of aliasing to be successful) based on the fact
that the component layout qualifier can't be used on structs (or its
members):

if (type->without_array()->is_record()) {
   /* The component qualifier can't be used on structs so just treat
    * all component slots as used.
    */
   last_comp = 4;
} else {
   ...
}

However, thinking a bit more about it, it is not 100% clear that this
assumption is correct and maybe we should be doing the same for structs
that I did for interface blocks members and check the actual components
used by each field member and only produce link errors if there is
actual component aliasing.

Let's drop this patch for now.

Iago

On Thu, 2017-11-09 at 12:43 +1100, Timothy Arceri wrote:
> On 06/11/17 23:22, Iago Toral Quiroga wrote:
> > This is not allowed so we check that we produce a linker error.
> 
> It's not 100% obvious why this wouldn't be allowed. Can we have a
> spec 
> quote added to the
>  test header?
> 
> > ---
> >   .../vs-to-fs-type-not-numerical.shader_test        | 52
> > ++++++++++++++++++++++
> >   1 file changed, 52 insertions(+)
> >   create mode 100644
> > tests/spec/arb_enhanced_layouts/linker/component-layout/vs-to-fs-
> > type-not-numerical.shader_test
> > 
> > diff --git a/tests/spec/arb_enhanced_layouts/linker/component-
> > layout/vs-to-fs-type-not-numerical.shader_test
> > b/tests/spec/arb_enhanced_layouts/linker/component-layout/vs-to-fs-
> > type-not-numerical.shader_test
> > new file mode 100644
> > index 000000000..aede6ce8d
> > --- /dev/null
> > +++ b/tests/spec/arb_enhanced_layouts/linker/component-layout/vs-
> > to-fs-type-not-numerical.shader_test
> > @@ -0,0 +1,52 @@
> > +# Test for link error between vertex and fragment shaders when
> > +# component qualifiers don't match. This case checks that
> > +# location aliasing is not permitted for non-numerical types
> > +# such as a struct
> > +
> > +[require]
> > +GLSL >= 3.30
> > +GL_ARB_enhanced_layouts
> > +GL_ARB_separate_shader_objects
> > +
> > +[vertex shader]
> > +#version 330
> > +#extension GL_ARB_enhanced_layouts: require
> > +#extension GL_ARB_separate_shader_objects: require
> > +
> > +struct S {
> > +  vec3 foo;
> > +  vec4 bar;
> > +};
> > +
> > +layout(location = 0, component = 3) out float b;
> > +layout(location = 0) out S a;
> > +
> > +void main()
> > +{
> > +  a.foo = vec3(1.0);
> > +  a.bar = vec4(1.0);
> > +  b = 0.5;
> > +}
> > +
> > +[fragment shader]
> > +#version 330
> > +#extension GL_ARB_enhanced_layouts: require
> > +#extension GL_ARB_separate_shader_objects: require
> > +
> > +struct S {
> > +  vec3 foo;
> > +  vec4 bar;
> > +};
> > +
> > +layout(location = 0, component = 3) in float b;
> > +layout(location = 0) in S a;
> > +
> > +out vec4 color;
> > +
> > +void main()
> > +{
> > +  color = vec4(a.foo + a.bar.xyz, b);
> > +}
> > +
> > +[test]
> > +link error
> > 
> 
> 
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to