summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/linker.cpp53
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);
}