diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/glsl/linker.cpp | 33 | 
1 files changed, 16 insertions, 17 deletions
| diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 5702ec0e91..58b029460e 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -890,30 +890,29 @@ link_intrastage_shaders(void *mem_ctx,     free(linking_shaders); -   /* Make a pass over all global variables to ensure that arrays with +   /* Make a pass over all variable declarations 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; +      class array_sizing_visitor : public ir_hierarchical_visitor { +      public: +	 virtual ir_visitor_status visit(ir_variable *var) +	 { +	    if (var->type->is_array() && (var->type->length == 0)) { +	       const glsl_type *type = +		  glsl_type::get_array_instance(var->type->fields.array, +						var->max_array_access); -	 if (!var->type->is_array() || (var->type->length != 0)) -	    continue; +	       assert(type != NULL); +	       var->type = type; +	    } -	 const glsl_type *type = -	    glsl_type::get_array_instance(var->type->fields.array, -					  var->max_array_access); +	    return visit_continue; +	 } +      } v; -	 assert(type != NULL); -	 var->type = type; -      } +      v.run(linked->ir);     }     return linked; | 
