linker: Ensure that unsized arrays have a size after linking
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 8 Dec 2010 02:30:33 +0000 (18:30 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 8 Dec 2010 02:32:16 +0000 (18:32 -0800)
Fixes piglit test case glsl-vec-array (bugzilla #31908).

NOTE: This bug does not affect 7.9, but I think this patch is a
candiate for the 7.9 branch anyway.

src/glsl/linker.cpp

index 576b72a65fe7af8231cb0fbcc11e147ba723132b..d7638facce66ce8fc8a13b53dd3df01435549199 100644 (file)
@@ -360,8 +360,12 @@ 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 (existing->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 "
                                      "`%s' and type `%s'\n",
@@ -863,6 +867,28 @@ link_intrastage_shaders(void *mem_ctx,
 
    free(linking_shaders);
 
+   /* Make a pass over all global variables to ensure that arrays with
+    * unspecified sizes have a size specified.  The size is inferred from the
+    * max_array_access field.
+    */
+   foreach_list(node, linked->ir) {
+      ir_variable *const var = ((ir_instruction *) node)->as_variable();
+
+      if (var == NULL)
+        continue;
+
+      if (!var->type->is_array() || (var->type->length != 0))
+        continue;
+
+      const glsl_type *type =
+        glsl_type::get_array_instance(var->type->fields.array,
+                                      var->max_array_access);
+
+      assert(type != NULL);
+      var->type = type;
+   }
+
+
    return linked;
 }