glsl: Fix aggregates with dynamic initializers.
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.
v3: Remove unneeded check for arrays, which are covered by
process_array_constructor(), recommended by Timothy Arceri.
Signed-off-by: Cody Northrop <cody@lunarg.com>
Reviewed-by: Courtney Goeltzenleuchter <courtney@lunarg.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79373
This commit is contained in:
committed by
Kenneth Graunke
parent
923f78440c
commit
0f679f0ab5
@@ -760,11 +760,22 @@ process_vec_mat_constructor(exec_list *instructions,
|
||||
instructions->push_tail(var);
|
||||
|
||||
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 = new(ctx) ir_assignment(lhs, rhs, NULL);
|
||||
foreach_in_list(ir_rvalue, rhs, &actual_parameters) {
|
||||
ir_instruction *assignment = NULL;
|
||||
|
||||
if (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));
|
||||
}
|
||||
|
||||
instructions->push_tail(assignment);
|
||||
|
||||
i++;
|
||||
|
||||
Reference in New Issue
Block a user