summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-04-10 00:02:12 -0400
committerbunnei <bunneidev@gmail.com>2018-04-17 15:25:54 -0400
commit5d529698c94da9c13f8a685d817c9f660fd8abee (patch)
treed46f9497d066ced9f35c815df40eac7c0d491905 /src
parent5b9bcbf438e27604486ffbbad6ed9728a30e9d0e (diff)
gl_shader_decompiler: Partially implement MUFU.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index e11711533..a439da470 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -270,6 +270,17 @@ private:
SetDest(0, dest, op_a + " + " + op_b, 1, 1);
break;
}
+ case OpCode::Id::MUFU: {
+ switch (instr.sub_op) {
+ case SubOp::Rcp:
+ SetDest(0, dest, "1.0 / " + op_a, 1, 1);
+ break;
+ default:
+ LOG_ERROR(HW_GPU, "Unhandled sub op: 0x%02x", (int)instr.sub_op.Value());
+ throw DecompileFail("Unhandled sub op");
+ }
+ break;
+ }
default: {
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic instruction: 0x%02x (%s): 0x%08x",
static_cast<unsigned>(instr.opcode.EffectiveOpCode()),
@@ -298,7 +309,6 @@ private:
SetDest(0, dest, op_a + " * " + op_b + " + " + op_c, 1, 1);
break;
}
-
default: {
LOG_CRITICAL(HW_GPU, "Unhandled arithmetic FFMA instruction: 0x%02x (%s): 0x%08x",
static_cast<unsigned>(instr.opcode.EffectiveOpCode()),
@@ -347,7 +357,6 @@ private:
LOG_CRITICAL(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x",
static_cast<unsigned>(instr.opcode.EffectiveOpCode()),
OpCode::GetInfo(instr.opcode).name.c_str(), instr.hex);
- throw DecompileFail("Unhandled instruction");
break;
}
}