diff options
-rw-r--r-- | src/glsl/link_functions.cpp | 12 | ||||
-rw-r--r-- | src/glsl/linker.cpp | 5 |
2 files changed, 13 insertions, 4 deletions
diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp index 6207371c301..861fa39b51e 100644 --- a/src/glsl/link_functions.cpp +++ b/src/glsl/link_functions.cpp @@ -181,6 +181,18 @@ public: var = ir->var->clone(linked, NULL); linked->symbols->add_variable(var); linked->ir->push_head(var); + } else if (var->type->is_array()) { + /* It is possible to have a global array declared in multiple + * shaders without a size. The array is implicitly sized by the + * maximal access to it in *any* shader. Because of this, we + * need to track the maximal access to the array as linking pulls + * more functions in that access the array. + */ + var->max_array_access = + MAX2(var->max_array_access, ir->var->max_array_access); + + if (var->type->length == 0 && ir->var->type->length != 0) + var->type = ir->var->type; } ir->var = var; diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 58b029460e9..bf7a56353ad 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -356,11 +356,8 @@ cross_validate_globals(struct gl_shader_program *prog, && (var->type->fields.array == existing->type->fields.array) && ((var->type->length == 0) || (existing->type->length == 0))) { - if (existing->type->length == 0) { + if (var->type->length != 0) { existing->type = var->type; - existing->max_array_access = - MAX2(existing->max_array_access, - var->max_array_access); } } else { linker_error_printf(prog, "%s `%s' declared as type " |