linker: Fix regressions caused by previous commit
[mesa.git] / src / glsl / linker.cpp
index 576b72a65fe7af8231cb0fbcc11e147ba723132b..e62fe6d7e9fd4002a3ac070298da0d7da7fef9c2 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,32 @@ 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.
+    */
+   if (linked != NULL) {
+      foreach_list(node, linked->ir) {
+        ir_variable *const var = ((ir_instruction *) node)->as_variable();
+
+        if (var == NULL)
+           continue;
+
+        if ((var->mode != ir_var_auto) && (var->mode != ir_var_temporary))
+           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;
 }