summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2010-12-07 16:27:22 -0800
committerIan Romanick <[email protected]>2010-12-07 16:36:44 -0800
commitb0fc5103cbc9116806a9888f747baed4b8166246 (patch)
treef9de81e28e55be5a5291ae37bc5133dd09bacd06 /src
parent7ca7e9b626389dd6dac683c6664b8478e6d5c3b9 (diff)
glsl: Inherrit type of declared variable from initializer
Types of declared variables and their initializer must match excatly except for unsized arrays. Previously the type inherritance for unsized arrays happened implicitly in the emitted assignment. However, this assignment is never emitted for uniforms. Now that type is explicitly copied unconditionally. Fixes piglit test array-compare-04.vert (bugzilla #32035) and glsl-array-uniform-length (bugzilla #31985). NOTE: This is a candidate for the 7.9 branch.
Diffstat (limited to 'src')
-rw-r--r--src/glsl/ast_to_hir.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 4b9b07fbf61..82b3f2e0ea9 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2228,6 +2228,24 @@ ast_declarator_list::hir(exec_list *instructions,
if (this->type->qualifier.flags.q.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.flags.q.uniform)