diff options
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 3e9a4db4267..74d6308b918 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2039,6 +2039,24 @@ ast_declarator_list::hir(exec_list *instructions, if (this->type->qualifier.constant) var->read_only = false; + /* If the declared variable is an unsized array, it must inherrit + * its full type from the initializer. A declaration such as + * + * uniform float a[] = float[](1.0, 2.0, 3.0, 3.0); + * + * becomes + * + * uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0); + * + * The assignment generated in the if-statement (below) will also + * automatically handle this case for non-uniforms. + * + * If the declared variable is not an array, the types must + * already match exactly. As a result, the type assignment + * here can be done unconditionally. + */ + var->type = rhs->type; + /* Never emit code to initialize a uniform. */ if (!this->type->qualifier.uniform) |