linker: Propagate max_array_access while linking functions
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 25 Jan 2011 20:06:18 +0000 (12:06 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 25 Jan 2011 21:41:26 +0000 (13:41 -0800)
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.

src/glsl/link_functions.cpp
src/glsl/linker.cpp

index 6207371c30137eaf6ecfb170159ea7cb1aef2f39..861fa39b51e0abc5600a5a3e9139a3e3d6c3b74e 100644 (file)
@@ -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;
index 58b029460e975ceba188bcc8563e20ec96912dee..bf7a56353ad1bb7b1da1ff9394e90debcb646304 100644 (file)
@@ -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 "