Shader Disassembly: Implement support for MAD/MADI
This commit is contained in:
parent
86d5461bcd
commit
bc3f57efd0
|
@ -65,6 +65,15 @@ QVariant GraphicsVertexShaderModel::headerData(int section, Qt::Orientation orie
|
|||
return QVariant();
|
||||
}
|
||||
|
||||
static std::string SelectorToString(u32 selector) {
|
||||
std::string ret;
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
int component = (selector >> ((3 - i) * 2)) & 3;
|
||||
ret += "xyzw"[component];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// e.g. "-c92[a0.x].xyzw"
|
||||
static void print_input(std::ostringstream& output, const SourceRegister& input,
|
||||
bool negate, const std::string& swizzle_mask, bool align = true,
|
||||
|
@ -133,6 +142,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
|
|||
break;
|
||||
|
||||
case OpCode::Type::Arithmetic:
|
||||
case OpCode::Type::MultiplyAdd:
|
||||
{
|
||||
// Use custom code for special instructions
|
||||
switch (opcode.EffectiveOpCode()) {
|
||||
|
@ -161,6 +171,27 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con
|
|||
break;
|
||||
}
|
||||
|
||||
case OpCode::Id::MAD:
|
||||
case OpCode::Id::MADI:
|
||||
{
|
||||
AlignToColumn(kOpcodeColumnWidth);
|
||||
|
||||
bool src_is_inverted = 0 != (opcode_info.subtype & OpCode::Info::SrcInversed);
|
||||
SourceRegister src1 = instr.mad.GetSrc1(src_is_inverted);
|
||||
SourceRegister src2 = instr.mad.GetSrc2(src_is_inverted);
|
||||
SourceRegister src3 = instr.mad.GetSrc3(src_is_inverted);
|
||||
|
||||
output << std::setw(3) << std::right << instr.mad.dest.Value().GetName() << '.' << swizzle.DestMaskToString();
|
||||
AlignToColumn(kOutputColumnWidth);
|
||||
print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector));
|
||||
AlignToColumn(kInputOperandColumnWidth);
|
||||
print_input(output, src2, swizzle.negate_src2, SelectorToString(swizzle.src2_selector));
|
||||
AlignToColumn(kInputOperandColumnWidth);
|
||||
print_input(output, src3, swizzle.negate_src3, SelectorToString(swizzle.src3_selector));
|
||||
AlignToColumn(kInputOperandColumnWidth);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
AlignToColumn(kOpcodeColumnWidth);
|
||||
|
|
Reference in New Issue