Mesa (7.9): linker: Propagate max_array_access while linking functions
Ian Romanick
idr at kemper.freedesktop.org
Sat Feb 5 00:14:07 UTC 2011
Module: Mesa
Branch: 7.9
Commit: 2b1150170ad48d64d5c86fbcc51aedc9251f180b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2b1150170ad48d64d5c86fbcc51aedc9251f180b
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Tue Jan 25 12:06:18 2011 -0800
linker: Propagate max_array_access while linking functions
Update the max_array_access of a global as functions that use that
global are pulled into the linked shader.
Fixes piglit test glsl-fs-implicit-array-size-01 and bugzilla #33219.
NOTE: This is a candidate for the 7.9 and 7.10 branches.
(cherry picked from commit 0f4b2a0a23650d8f773c53d84cb2ead1f6d4fc8e)
---
src/glsl/link_functions.cpp | 12 ++++++++++++
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 78c8b48..d8a8552 100644
--- a/src/glsl/link_functions.cpp
+++ b/src/glsl/link_functions.cpp
@@ -185,6 +185,18 @@ public:
var = ir->var->clone(linked, NULL);
linked->symbols->add_variable(var->name, 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 78e2208..40700e0 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -360,11 +360,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 "
More information about the mesa-commit
mailing list