[Mesa-dev] [PATCH 0/9] glsl: cleanup and fix handling of unnamed struct types

Erik Faye-Lund kusmabite at gmail.com
Mon May 15 14:57:53 UTC 2017


On Mon, May 15, 2017 at 11:27 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> Hi all,
>
> This series aims to simplify how we handle unnamed struct types and fix some
> bugs on the way. Some of the patches should be uncontroversial, and all of
> them align with my understanding of the GLSL spec, but the spec isn't
> exactly explicit, so...
>
> At a high level, the series changes two things:
>
> 1) Unnamed structs can never match named structs during linking.
>
> 2) Unnamed structs are considered the same type if they have the same
> content. They will literally use the same glsl_type instance.
>
> The second point causes a deviation from the behavior of C/C++, in that the
> following code snippet now compiles (and does the reasonable thing):
>
>   struct { float a; } s1;
>   struct { float a; } s2;
>
>   s2 = s1;
>
> The justification is basically that the GLSL spec says (when it comes to
> linking, in Section 4.2) that
>
>    "Structures must have the same name, sequence of type names, and
>     type definitions, and member names to be considered the same type."
>
> And since people generally seem to read that as mandating that globals of
> unnamed struct types should match if they're structurally the same, and the
> GLSL spec otherwise says nothing (as far as I can tell) about when struct
> types are equal, the cleanest thing is to just say that _in general_ (not
> just for linking) struct types are the same if and only if they have the
> same name and the same fields; where "same name" can mean that they both
> have no name.

It might also be reasonable to say that having the same name requires
having a name in the first place. But I'm not sure if such an
interpretation is useful.

So, I think it would be useful to look at what other implementations
do. From a quick test, it seems like both glslangValidator, the Apple
GLSL compiler (as reported by OpenGL Shader Builder, on Intel HD
Graphics 5000) as well as the NVIDIA Windows driver allows your
example (and all of them forbids it if I add another member to one of
them, or rename the member). Those are the only implementations I have
at hand right now, but it seems to me like this behavior is at least
not too controversial.


More information about the mesa-dev mailing list