mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-25 10:20:14 +00:00
Fix MAD encoding (MADI might be broken)
This commit is contained in:
parent
8530a2d7df
commit
b50bed8c92
@ -179,9 +179,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
|
|||||||
AlignToColumn(kOutputColumnWidth);
|
AlignToColumn(kOutputColumnWidth);
|
||||||
print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector));
|
print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector));
|
||||||
AlignToColumn(kInputOperandColumnWidth);
|
AlignToColumn(kInputOperandColumnWidth);
|
||||||
print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector));
|
if (src_is_inverted) {
|
||||||
|
print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector));
|
||||||
|
} else {
|
||||||
|
print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector), true, instr.mad.AddressRegisterName());
|
||||||
|
}
|
||||||
AlignToColumn(kInputOperandColumnWidth);
|
AlignToColumn(kInputOperandColumnWidth);
|
||||||
print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector));
|
if (src_is_inverted) {
|
||||||
|
print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector), true, instr.mad.AddressRegisterName());
|
||||||
|
} else {
|
||||||
|
print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector));
|
||||||
|
}
|
||||||
AlignToColumn(kInputOperandColumnWidth);
|
AlignToColumn(kInputOperandColumnWidth);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -413,9 +413,12 @@ void RunInterpreter(UnitState<Debug>& state) {
|
|||||||
|
|
||||||
bool is_inverted = (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI);
|
bool is_inverted = (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI);
|
||||||
|
|
||||||
|
const int address_offset = (instr.mad.address_register_index == 0)
|
||||||
|
? 0 : state.address_registers[instr.mad.address_register_index - 1];
|
||||||
|
|
||||||
const float24* src1_ = LookupSourceRegister(instr.mad.GetSrc1(is_inverted));
|
const float24* src1_ = LookupSourceRegister(instr.mad.GetSrc1(is_inverted));
|
||||||
const float24* src2_ = LookupSourceRegister(instr.mad.GetSrc2(is_inverted));
|
const float24* src2_ = LookupSourceRegister(instr.mad.GetSrc2(is_inverted) + (!is_inverted * address_offset));
|
||||||
const float24* src3_ = LookupSourceRegister(instr.mad.GetSrc3(is_inverted));
|
const float24* src3_ = LookupSourceRegister(instr.mad.GetSrc3(is_inverted) + ( is_inverted * address_offset));
|
||||||
|
|
||||||
const bool negate_src1 = ((bool)swizzle.negate_src1 != false);
|
const bool negate_src1 = ((bool)swizzle.negate_src1 != false);
|
||||||
const bool negate_src2 = ((bool)swizzle.negate_src2 != false);
|
const bool negate_src2 = ((bool)swizzle.negate_src2 != false);
|
||||||
|
@ -160,40 +160,41 @@ void JitCompiler::Compile_SwizzleSrc(Instruction instr, unsigned src_num, Source
|
|||||||
ASSERT_MSG(src_offset == src_offset_disp, "Source register offset too large for int type");
|
ASSERT_MSG(src_offset == src_offset_disp, "Source register offset too large for int type");
|
||||||
|
|
||||||
unsigned operand_desc_id;
|
unsigned operand_desc_id;
|
||||||
|
|
||||||
|
const bool is_inverted = (0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed));
|
||||||
|
|
||||||
|
unsigned address_register_index;
|
||||||
|
unsigned offset_src;
|
||||||
|
|
||||||
if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD ||
|
if (instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD ||
|
||||||
instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI) {
|
instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI) {
|
||||||
// The MAD and MADI instructions do not use the address offset registers, so loading the
|
|
||||||
// source is a bit simpler here
|
|
||||||
|
|
||||||
operand_desc_id = instr.mad.operand_desc_id;
|
operand_desc_id = instr.mad.operand_desc_id;
|
||||||
|
offset_src = is_inverted ? 3 : 2;
|
||||||
// Load the source
|
address_register_index = instr.mad.address_register_index;
|
||||||
MOVAPS(dest, MDisp(src_ptr, src_offset_disp));
|
|
||||||
} else {
|
} else {
|
||||||
operand_desc_id = instr.common.operand_desc_id;
|
operand_desc_id = instr.common.operand_desc_id;
|
||||||
|
offset_src = is_inverted ? 2 : 1;
|
||||||
|
address_register_index = instr.common.address_register_index;
|
||||||
|
}
|
||||||
|
|
||||||
const bool is_inverted = (0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed));
|
if (src_num == offset_src && address_register_index != 0) {
|
||||||
unsigned offset_src = is_inverted ? 2 : 1;
|
switch (address_register_index) {
|
||||||
|
case 1: // address offset 1
|
||||||
if (src_num == offset_src && instr.common.address_register_index != 0) {
|
MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, SCALE_1, src_offset_disp));
|
||||||
switch (instr.common.address_register_index) {
|
break;
|
||||||
case 1: // address offset 1
|
case 2: // address offset 2
|
||||||
MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_0, SCALE_1, src_offset_disp));
|
MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, SCALE_1, src_offset_disp));
|
||||||
break;
|
break;
|
||||||
case 2: // address offset 2
|
case 3: // address offset 3
|
||||||
MOVAPS(dest, MComplex(src_ptr, ADDROFFS_REG_1, SCALE_1, src_offset_disp));
|
MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, SCALE_1, src_offset_disp));
|
||||||
break;
|
break;
|
||||||
case 3: // address offset 3
|
default:
|
||||||
MOVAPS(dest, MComplex(src_ptr, LOOPCOUNT_REG, SCALE_1, src_offset_disp));
|
UNREACHABLE();
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
UNREACHABLE();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Load the source
|
|
||||||
MOVAPS(dest, MDisp(src_ptr, src_offset_disp));
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Load the source
|
||||||
|
MOVAPS(dest, MDisp(src_ptr, src_offset_disp));
|
||||||
}
|
}
|
||||||
|
|
||||||
SwizzlePattern swiz = { g_state.vs.swizzle_data[operand_desc_id] };
|
SwizzlePattern swiz = { g_state.vs.swizzle_data[operand_desc_id] };
|
||||||
|
Loading…
Reference in New Issue
Block a user