[Mesa-dev] [PATCH v2] glsl: Fix aggregates with dynamic initializers.
Kenneth Graunke
kenneth at whitecape.org
Tue Jul 1 14:45:08 PDT 2014
From: Cody Northrop <cody at lunarg.com>
Vectors are falling in to the ir_dereference_array() path.
Without this change, the following glsl aborts the debug driver,
or gets the wrong answer in release:
mat2x2 a = mat2( vec2( 1.0, vertex.x ), vec2( 0.0, 1.0 ) );
Also submitting piglit tests, will reference in bug.
v2: Rebase on Mesa master.
Signed-off-by: Cody Northrop <cody at lunarg.com>
Reviewed-by: Courtney Goeltzenleuchter <courtney at lunarg.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79373
---
src/glsl/ast_function.cpp | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
Hi Cody,
Your patch didn't apply to master due to Matt's foreach_list changes;
I did the obvious rebase. Otherwise, it looks great. Thanks for fixing
this and improving our tests!
I'll plan to commit this tomorrow unless anyone else has objections.
--Ken
diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
index cdb34cc..98288d2 100644
--- a/src/glsl/ast_function.cpp
+++ b/src/glsl/ast_function.cpp
@@ -743,10 +743,20 @@ process_vec_mat_constructor(exec_list *instructions,
int i = 0;
foreach_in_list(ir_rvalue, rhs, &actual_parameters) {
- ir_rvalue *lhs = new(ctx) ir_dereference_array(var,
- new(ctx) ir_constant(i));
+ ir_instruction *assignment = NULL;
+
+ if (var->type->is_array() || var->type->is_matrix()) {
+ ir_rvalue *lhs = new(ctx) ir_dereference_array(var,
+ new(ctx) ir_constant(i));
+ assignment = new(ctx) ir_assignment(lhs, rhs, NULL);
+ } else {
+ /* use writemask rather than index for vector */
+ assert(var->type->is_vector());
+ assert(i < 4);
+ ir_dereference *lhs = new(ctx) ir_dereference_variable(var);
+ assignment = new(ctx) ir_assignment(lhs, rhs, NULL, (unsigned)(1 << i));
+ }
- ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs, NULL);
instructions->push_tail(assignment);
i++;
--
2.0.0
More information about the mesa-dev
mailing list