[Mesa-dev] [PATCH] glsl/linker: link-error using the same name in unnamed block and outside
Juan A. Suarez Romero
jasuarez at igalia.com
Tue Dec 12 09:51:16 UTC 2017
Gently reminder this patch is still unreviewed.
J.A.
On Mon, 2017-12-04 at 17:35 +0100, Juan A. Suarez Romero wrote:
> According with OpenGL GLSL 4.20 spec, section 4.3.9, page 57:
>
> "It is a link-time error if any particular shader interface
> contains:
> - two different blocks, each having no instance name, and each
> having a member of the same name, or
> - a variable outside a block, and a block with no instance name,
> where the variable has the same name as a member in the block."
>
> This means that it is a link error if for example we have a vertex
> shader with the following definition.
>
> "layout(location=0) uniform Data { float a; float b; };"
>
> and a fragment shader with:
>
> "uniform float a;"
>
> As in both cases we refer to both uniforms as "a", and thus using
> glGetUniformLocation() wouldn't know which one we mean.
> ---
> src/compiler/glsl/linker.cpp | 23 +++++++++++++++++++++++
> 1 file changed, 23 insertions(+)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index 33fd76deae9..b6de7b54ae3 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -1111,6 +1111,29 @@ cross_validate_globals(struct gl_shader_program *prog,
> return;
> }
>
> + /* In OpenGL GLSL 4.20 spec, section 4.3.9, page 57:
> + *
> + * "It is a link-time error if any particular shader interface
> + * contains:
> + *
> + * - two different blocks, each having no instance name, and each
> + * having a member of the same name, or
> + *
> + * - a variable outside a block, and a block with no instance name,
> + * where the variable has the same name as a member in the block."
> + */
> + if (var->data.mode == existing->data.mode &&
> + var->get_interface_type() != existing->get_interface_type()) {
> + linker_error(prog, "declarations for %s `%s` are in "
> + "%s and %s\n",
> + mode_string(var), var->name,
> + existing->get_interface_type() ?
> + existing->get_interface_type()->name : "outside a block",
> + var->get_interface_type() ?
> + var->get_interface_type()->name : "outside a block");
> +
> + return;
> + }
> /* Only in GLSL ES 3.10, the precision qualifier should not match
> * between block members defined in matched block names within a
> * shader interface.
More information about the mesa-dev
mailing list