glsl: Fix write mask in matrix-from-matrix constructors.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 1 Sep 2010 23:10:01 +0000 (16:10 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 2 Sep 2010 01:57:51 +0000 (18:57 -0700)
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.

src/glsl/ast_function.cpp

index f639b8a..1fa2fab 100644 (file)
@@ -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 =