diff options
author | Eric Anholt <[email protected]> | 2010-06-28 19:56:53 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2010-06-28 11:14:47 -0700 |
commit | 3f3f41357d33893d01213b37c6d92bcb435b0eeb (patch) | |
tree | 14e0cf0414dc8883196c444b980ddae617026f94 /src/mesa/shader | |
parent | ad2dc740b95f91f66d57dffe2840dffdefce1c1a (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
Diffstat (limited to 'src/mesa/shader')
-rw-r--r-- | src/mesa/shader/ir_to_mesa.cpp | 20 |
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 { |