diff options
-rw-r--r-- | src/compiler/glsl/linker.cpp | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index ce101935b01..d3d18c248f2 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1111,29 +1111,6 @@ 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. @@ -1155,6 +1132,36 @@ cross_validate_globals(struct gl_shader_program *prog, mode_string(var), var->name); } } + + /* In OpenGL GLSL 3.20 spec, section 4.3.9: + * + * "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." + */ + const glsl_type *var_itype = var->get_interface_type(); + const glsl_type *existing_itype = existing->get_interface_type(); + if (var_itype != existing_itype) { + if (!var_itype || !existing_itype) { + linker_error(prog, "declarations for %s `%s` are inside block " + "`%s` and outside a block", + mode_string(var), var->name, + var_itype ? var_itype->name : existing_itype->name); + return; + } else if (strcmp(var_itype->name, existing_itype->name) != 0) { + linker_error(prog, "declarations for %s `%s` are inside blocks " + "`%s` and `%s`", + mode_string(var), var->name, + existing_itype->name, + var_itype->name); + return; + } + } } else variables->add_variable(var); } |