summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2011-01-25 12:04:08 -0800
committerIan Romanick <[email protected]>2011-01-25 13:41:26 -0800
commitc87e9ef4d291b3fc18f7af2c7a7646b9a860f4af (patch)
tree93620d6d7c9a16703887412f7da523641dcfcedb
parent5c2cec8337c5afc6941cd5c0bcedd27ff99b1bc7 (diff)
linker: Set sizes for non-global arrays as well
Previously only global arrays with implicit sizes would be patched. This causes all arrays that are actually accessed to be sized. Fixes piglit test glsl-fs-implicit-array-size-02. NOTE: This is a candidate for the 7.9 and 7.10 branches.
-rw-r--r--src/glsl/linker.cpp35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 5702ec0e91a..58b029460e9 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;
-
- if (!var->type->is_array() || (var->type->length != 0))
- 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);
+
+ 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;