summaryrefslogtreecommitdiffstats
path: root/src/glsl/ast_function.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2010-09-01 16:10:01 -0700
committerKenneth Graunke <[email protected]>2010-09-01 18:57:51 -0700
commit39605587951aed546c14febcc26e5a479bf8d807 (patch)
treeda80c5384cf40a1de03f46152628e36dd5f340bb /src/glsl/ast_function.cpp
parent54b35e673596d767a13f06f4d7ec1089e18fd46e (diff)
glsl: Fix write mask in matrix-from-matrix constructors.
If the matrix being constructed was larger than the source matrix, it would overwrite the lower-right part of the matrix with the wrong values, rather than leaving it as the identity matrix. For example, constructing a mat4 from a mat2 should only use a writemask of "xy" when copying from the source, but was using "xyzw". Fixes the code generated by piglit test constructor-23.vert.
Diffstat (limited to 'src/glsl/ast_function.cpp')
-rw-r--r--src/glsl/ast_function.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
index f639b8a1bad..1fa2fabefb9 100644
--- a/src/glsl/ast_function.cpp
+++ b/src/glsl/ast_function.cpp
@@ -833,14 +833,16 @@ emit_inline_matrix_constructor(const glsl_type *type,
new(ctx) ir_assignment(rhs_var_ref, first_param, NULL);
instructions->push_tail(inst);
+ const unsigned last_row = MIN2(src_matrix->type->vector_elements,
+ var->type->vector_elements);
+ const unsigned last_col = MIN2(src_matrix->type->matrix_columns,
+ var->type->matrix_columns);
unsigned swiz[4] = { 0, 0, 0, 0 };
for (unsigned i = 1; i < src_matrix->type->vector_elements; i++)
swiz[i] = i;
- const unsigned last_col = MIN2(src_matrix->type->matrix_columns,
- var->type->matrix_columns);
- const unsigned write_mask = (1U << var->type->vector_elements) - 1;
+ const unsigned write_mask = (1U << last_row) - 1;
for (unsigned i = 0; i < last_col; i++) {
ir_dereference *const lhs =