glsl: Match unnamed record types across stages.
authorGrigori Goronzy <greg@chown.ath.cx>
Tue, 26 Nov 2013 23:15:06 +0000 (00:15 +0100)
committerMatt Turner <mattst88@gmail.com>
Tue, 21 Jan 2014 22:01:09 +0000 (14:01 -0800)
Unnamed record types are assigned to separate types per stage, e.g. if

uniform struct { ... } a;

is defined in both vertex and fragment shader, two separate types will
result with different names. When linking the shader, this results in a
type conflict. However, there is no reason why this should not be
allowed according to GLSL specifications. Compare and match record types
when linking shader stages to avoid this conflict.

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/linker.cpp

index 85a4d388326f28d6ee31d94a9e05b80aa0362956..38a6560d1b508d2eae47a9b8d987b1ff8289ec8d 100644 (file)
@@ -609,6 +609,10 @@ cross_validate_globals(struct gl_shader_program *prog,
                  if (var->type->length != 0) {
                     existing->type = var->type;
                  }
+               } else if (var->type->is_record()
+                  && existing->type->is_record()
+                  && existing->type->record_compare(var->type)) {
+                 existing->type = var->type;
               } else {
                  linker_error(prog, "%s `%s' declared as type "
                               "`%s' and type `%s'\n",