diff options
author | Ian Romanick <[email protected]> | 2011-01-25 12:06:18 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2011-01-25 13:41:26 -0800 |
commit | 0f4b2a0a23650d8f773c53d84cb2ead1f6d4fc8e (patch) | |
tree | 981f7e654707c8c26bc6a13551f21eefbefd779c /src/glsl/link_functions.cpp | |
parent | c87e9ef4d291b3fc18f7af2c7a7646b9a860f4af (diff) |
linker: Propagate max_array_access while linking functions
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.
Diffstat (limited to 'src/glsl/link_functions.cpp')
-rw-r--r-- | src/glsl/link_functions.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp index 6207371c301..861fa39b51e 100644 --- a/src/glsl/link_functions.cpp +++ b/src/glsl/link_functions.cpp @@ -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; |