Просмотр исходного кода

gl_shader_decompiler: Partially implement MUFU.

bunnei 8 лет назад
Родитель
Сommit
5d529698c9
1 измененных файлов с 11 добавлено и 2 удалено
  1. 11 2
      src/video_core/renderer_opengl/gl_shader_decompiler.cpp

+ 11 - 2
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;
             }
             }