summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-07-07 15:55:47 -0700
committerEric Anholt <eric@anholt.net>2010-07-07 16:37:48 -0700
commit9b68b88e43c424439d425534ef280ee7a9406a1b (patch)
tree61a81f1973a4169ae5415f7563af72df6d74cb9c
parente024c5c6900c068634c2726d9ccfb9beac966c57 (diff)
ir_to_mesa: Add support for matrix * matrix.
-rw-r--r--src/mesa/shader/ir_to_mesa.cpp43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 21b01edefd..00fa2cccfe 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -623,9 +623,9 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
case ir_binop_sub:
ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]);
break;
+
case ir_binop_mul:
- if (ir->operands[0]->type->is_matrix() &&
- !ir->operands[1]->type->is_matrix()) {
+ if (ir->operands[0]->type->is_matrix()) {
if (ir->operands[1]->type->is_scalar()) {
ir_to_mesa_dst_reg dst_column = result_dst;
ir_to_mesa_src_reg src_column = op[0];
@@ -636,21 +636,32 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
src_column.index++;
}
} else {
- ir_to_mesa_src_reg src_column = op[0];
+ /* matrix * vec or matrix * matrix */
+ int op1_col;
+ ir_to_mesa_dst_reg dst_column = result_dst;
+ ir_to_mesa_src_reg dst_column_src;
ir_to_mesa_src_reg src_chan = op[1];
- 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++;
+
+ dst_column_src = ir_to_mesa_src_reg_from_dst(result_dst);
+ for (op1_col = 0; op1_col < ir->operands[1]->type->matrix_columns;
+ op1_col++) {
+ ir_to_mesa_src_reg src_column = op[0];
+
+ 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,
+ dst_column, src_column, src_chan);
+ } else {
+ ir_to_mesa_emit_op3(ir, OPCODE_MAD,
+ dst_column, src_column, src_chan,
+ dst_column_src);
+ }
+ src_column.index++;
+ }
+ src_chan.index++;
+ dst_column.index++;
+ dst_column_src.index++;
}
}
} else if (ir->operands[1]->type->is_matrix()) {