summaryrefslogtreecommitdiffstats
path: root/src/glsl/link_functions.cpp
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2011-01-25 12:06:18 -0800
committerIan Romanick <[email protected]>2011-01-25 13:41:26 -0800
commit0f4b2a0a23650d8f773c53d84cb2ead1f6d4fc8e (patch)
tree981f7e654707c8c26bc6a13551f21eefbefd779c /src/glsl/link_functions.cpp
parentc87e9ef4d291b3fc18f7af2c7a7646b9a860f4af (diff)
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.
Diffstat (limited to 'src/glsl/link_functions.cpp')
-rw-r--r--src/glsl/link_functions.cpp12
1 files changed, 12 insertions, 0 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;