summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-06-28 19:56:53 -0700
committerEric Anholt <eric@anholt.net>2010-06-28 11:14:47 -0700
commit3f3f41357d33893d01213b37c6d92bcb435b0eeb (patch)
tree14e0cf0414dc8883196c444b980ddae617026f94
parentad2dc740b95f91f66d57dffe2840dffdefce1c1a (diff)
ir_to_mesa: Fix matrix * scalar multiplication.
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
-rw-r--r--src/mesa/shader/ir_to_mesa.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 8541906ca64..b8113dab2be 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -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 {