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
This commit is contained in:
@@ -589,15 +589,21 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
|
|||||||
src_column.index++;
|
src_column.index++;
|
||||||
}
|
}
|
||||||
} else {
|
} 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_column = op[0];
|
||||||
ir_to_mesa_src_reg src_chan = op[1];
|
ir_to_mesa_src_reg src_chan = op[1];
|
||||||
for (int i = 0; i < ir->operands[0]->type->matrix_columns; i++) {
|
assert(!ir->operands[1]->type->is_matrix() ||
|
||||||
dst_chan.writemask = (1 << i);
|
!"FINISHME: matrix * matrix");
|
||||||
src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i);
|
for (int i = 0; i < ir->operands[0]->type->matrix_columns; i++) {
|
||||||
ir_to_mesa_emit_op2(ir, OPCODE_MUL,
|
src_chan.swizzle = MAKE_SWIZZLE4(i, i, i, i);
|
||||||
dst_chan, src_column, src_chan);
|
if (i == 0) {
|
||||||
src_column.index++;
|
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 {
|
} else {
|
||||||
|
Reference in New Issue
Block a user