glsl: Fix matrix constructors with vector parameters
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 20 Nov 2010 01:16:12 +0000 (17:16 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Sat, 20 Nov 2010 01:17:25 +0000 (17:17 -0800)
When the semantics of write masks in assignments were changed, this
code was not correctly updated.

Fixes piglit test glsl-mat-from-vec-ctor-01.

src/glsl/ast_function.cpp

index 924e35afc097f7d68ae539d17ac628d0b3209104..1e66033348c87191a54de7c8201eb396e5a9d08b 100644 (file)
@@ -627,21 +627,21 @@ assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base,
    assert(column_ref->type->components() >= (row_base + count));
    assert(src->type->components() >= (src_base + count));
 
-   /* Generate a swizzle that puts the first element of the source at the
-    * location of the first element of the destination.
+   /* Generate a swizzle that extracts the number of components from the source
+    * that are to be assigned to the column of the matrix.
     */
-   unsigned swiz[4] = { src_base, src_base, src_base, src_base };
-   for (unsigned i = 0; i < count; i++)
-      swiz[i + row_base] = i;
-
-   ir_rvalue *const rhs =
-      new(mem_ctx) ir_swizzle(src, swiz, count);
+   if (count < src->type->vector_elements) {
+      src = new(mem_ctx) ir_swizzle(src,
+                                   src_base + 0, src_base + 1,
+                                   src_base + 2, src_base + 3,
+                                   count);
+   }
 
    /* Mask of fields to be written in the assignment.
     */
    const unsigned write_mask = ((1U << count) - 1) << row_base;
 
-   return new(mem_ctx) ir_assignment(column_ref, rhs, NULL, write_mask);
+   return new(mem_ctx) ir_assignment(column_ref, src, NULL, write_mask);
 }