From 9b894c88a688904860d0f37221b78fbcb168f216 Mon Sep 17 00:00:00 2001 From: "Juan A. Suarez Romero" Date: Tue, 16 Jan 2018 19:42:35 +0100 Subject: [PATCH] glsl/linker: link-error using the same name in unnamed block and outside MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. This fixes KHR-GL*.shaders.uniform_block.common.name_matching. v2: add fixed tests (Tapani) Reviewed-by: Tapani Pälli --- 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 86ef5831b75..39fc3459d3a 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. -- 2.30.2