All compilation units need to agree on the binding point, if they specify one at all.
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> --- src/glsl/linker.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index ba97ade..cca66f8 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -541,6 +541,28 @@ cross_validate_globals(struct gl_shader_program *prog, existing->explicit_location = true; } + /* From the GLSL 4.20 specification: + * "A link error will result if two compilation units in a program + * specify different integer-constant bindings for the same + * opaque-uniform name. However, it is not an error to specify a + * binding on some but not all declarations for the same name" + */ + if (var->explicit_binding) { + assert(var->constant_value); + assert(!existing->explicit_binding || existing->constant_value); + if (existing->explicit_binding && + var->constant_value->value.i[0] != + existing->constant_value->value.i[0]) { + linker_error(prog, "explicit bindings for %s " + "`%s' have differing values\n", + mode_string(var), var->name); + return false; + } + + existing->constant_value = var->constant_value; + existing->explicit_binding = true; + } + /* Validate layout qualifiers for gl_FragDepth. * * From the AMD/ARB_conservative_depth specs: -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev