ir_to_mesa: Fix matrix * scalar multiplication.
authorEric Anholt <eric@anholt.net>
Tue, 29 Jun 2010 02:56:53 +0000 (19:56 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 28 Jun 2010 18:14:47 +0000 (11:14 -0700)
We're accessing in terms of columns, so we need to do MUL/MAD/MAD/MAD
instead of DP4s.

Fixes:
glsl-fs-exp2
glsl-fs-log2
glsl-fs-mix-constant
glsl-fs-sqrt-zero
glsl-vs-sqrt-zero

src/mesa/shader/ir_to_mesa.cpp

index 8541906ca64a818041ec1878c1c920ad42f8dbab..b8113dab2bec842ad13f00a8ac1247de2797e553 100644 (file)
@@ -589,15 +589,21 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
               src_column.index++;
            }
         } else {
-           ir_to_mesa_dst_reg dst_chan = result_dst;
            ir_to_mesa_src_reg src_column = op[0];
            ir_to_mesa_src_reg src_chan = op[1];
-           for (int i = 0; i < ir->operands[0]->type->matrix_columns; i++) {
-              dst_chan.writemask = (1 << i);
-              src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i);
-              ir_to_mesa_emit_op2(ir, OPCODE_MUL,
-                                  dst_chan, src_column, src_chan);
-              src_column.index++;
+           assert(!ir->operands[1]->type->is_matrix() ||
+                   !"FINISHME: matrix * matrix");
+            for (int i = 0; i < ir->operands[0]->type->matrix_columns; i++) {
+               src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i);
+               if (i == 0) {
+                  ir_to_mesa_emit_op2(ir, OPCODE_MUL,
+                                      result_dst, src_column, src_chan);
+               } else {
+                  ir_to_mesa_emit_op3(ir, OPCODE_MAD,
+                                      result_dst, src_column, src_chan,
+                                      result_src);
+               }
+               src_column.index++;
            }
         }
       } else {