ir_to_mesa: Add support for matrix * matrix.

This commit is contained in:
Eric Anholt
2010-07-07 15:55:47 -07:00
parent e024c5c690
commit 9b68b88e43

View File

@@ -623,9 +623,9 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
case ir_binop_sub: case ir_binop_sub:
ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]); ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]);
break; break;
case ir_binop_mul: case ir_binop_mul:
if (ir->operands[0]->type->is_matrix() && if (ir->operands[0]->type->is_matrix()) {
!ir->operands[1]->type->is_matrix()) {
if (ir->operands[1]->type->is_scalar()) { if (ir->operands[1]->type->is_scalar()) {
ir_to_mesa_dst_reg dst_column = result_dst; ir_to_mesa_dst_reg dst_column = result_dst;
ir_to_mesa_src_reg src_column = op[0]; ir_to_mesa_src_reg src_column = op[0];
@@ -636,22 +636,33 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
src_column.index++; src_column.index++;
} }
} else { } 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]; ir_to_mesa_src_reg src_chan = op[1];
assert(!ir->operands[1]->type->is_matrix() ||
!"FINISHME: matrix * matrix"); 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++) { for (int i = 0; i < ir->operands[0]->type->matrix_columns; i++) {
src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i); src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i);
if (i == 0) { if (i == 0) {
ir_to_mesa_emit_op2(ir, OPCODE_MUL, ir_to_mesa_emit_op2(ir, OPCODE_MUL,
result_dst, src_column, src_chan); dst_column, src_column, src_chan);
} else { } else {
ir_to_mesa_emit_op3(ir, OPCODE_MAD, ir_to_mesa_emit_op3(ir, OPCODE_MAD,
result_dst, src_column, src_chan, dst_column, src_column, src_chan,
result_src); dst_column_src);
} }
src_column.index++; src_column.index++;
} }
src_chan.index++;
dst_column.index++;
dst_column_src.index++;
}
} }
} else if (ir->operands[1]->type->is_matrix()) { } else if (ir->operands[1]->type->is_matrix()) {
if (ir->operands[0]->type->is_scalar()) { if (ir->operands[0]->type->is_scalar()) {