diff options
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 20 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 52d03aee8..b9faaf8e0 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h | |||
| @@ -1269,6 +1269,7 @@ public: | |||
| 1269 | BFE_C, | 1269 | BFE_C, |
| 1270 | BFE_R, | 1270 | BFE_R, |
| 1271 | BFE_IMM, | 1271 | BFE_IMM, |
| 1272 | BFI_IMM_R, | ||
| 1272 | BRA, | 1273 | BRA, |
| 1273 | PBK, | 1274 | PBK, |
| 1274 | LD_A, | 1275 | LD_A, |
| @@ -1410,6 +1411,7 @@ public: | |||
| 1410 | ArithmeticHalf, | 1411 | ArithmeticHalf, |
| 1411 | ArithmeticHalfImmediate, | 1412 | ArithmeticHalfImmediate, |
| 1412 | Bfe, | 1413 | Bfe, |
| 1414 | Bfi, | ||
| 1413 | Shift, | 1415 | Shift, |
| 1414 | Ffma, | 1416 | Ffma, |
| 1415 | Hfma2, | 1417 | Hfma2, |
| @@ -1628,6 +1630,7 @@ private: | |||
| 1628 | INST("0100110000000---", Id::BFE_C, Type::Bfe, "BFE_C"), | 1630 | INST("0100110000000---", Id::BFE_C, Type::Bfe, "BFE_C"), |
| 1629 | INST("0101110000000---", Id::BFE_R, Type::Bfe, "BFE_R"), | 1631 | INST("0101110000000---", Id::BFE_R, Type::Bfe, "BFE_R"), |
| 1630 | INST("0011100-00000---", Id::BFE_IMM, Type::Bfe, "BFE_IMM"), | 1632 | INST("0011100-00000---", Id::BFE_IMM, Type::Bfe, "BFE_IMM"), |
| 1633 | INST("0011011-11110---", Id::BFI_IMM_R, Type::Bfi, "BFI_IMM_R"), | ||
| 1631 | INST("0100110001000---", Id::LOP_C, Type::ArithmeticInteger, "LOP_C"), | 1634 | INST("0100110001000---", Id::LOP_C, Type::ArithmeticInteger, "LOP_C"), |
| 1632 | INST("0101110001000---", Id::LOP_R, Type::ArithmeticInteger, "LOP_R"), | 1635 | INST("0101110001000---", Id::LOP_R, Type::ArithmeticInteger, "LOP_R"), |
| 1633 | INST("0011100001000---", Id::LOP_IMM, Type::ArithmeticInteger, "LOP_IMM"), | 1636 | INST("0011100001000---", Id::LOP_IMM, Type::ArithmeticInteger, "LOP_IMM"), |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 3a75f9d16..05fe2d370 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -1721,6 +1721,26 @@ private: | |||
| 1721 | 1721 | ||
| 1722 | break; | 1722 | break; |
| 1723 | } | 1723 | } |
| 1724 | case OpCode::Type::Bfi: { | ||
| 1725 | UNIMPLEMENTED_IF(instr.generates_cc); | ||
| 1726 | |||
| 1727 | const auto [base, packed_shift] = [&]() -> std::tuple<std::string, std::string> { | ||
| 1728 | switch (opcode->get().GetId()) { | ||
| 1729 | case OpCode::Id::BFI_IMM_R: | ||
| 1730 | return {regs.GetRegisterAsInteger(instr.gpr39, 0, false), | ||
| 1731 | std::to_string(instr.alu.GetSignedImm20_20())}; | ||
| 1732 | default: | ||
| 1733 | UNREACHABLE(); | ||
| 1734 | } | ||
| 1735 | }(); | ||
| 1736 | const std::string offset = '(' + packed_shift + " & 0xff)"; | ||
| 1737 | const std::string bits = "((" + packed_shift + " >> 8) & 0xff)"; | ||
| 1738 | const std::string insert = regs.GetRegisterAsInteger(instr.gpr8, 0, false); | ||
| 1739 | regs.SetRegisterToInteger( | ||
| 1740 | instr.gpr0, false, 0, | ||
| 1741 | "bitfieldInsert(" + base + ", " + insert + ", " + offset + ", " + bits + ')', 1, 1); | ||
| 1742 | break; | ||
| 1743 | } | ||
| 1724 | case OpCode::Type::Shift: { | 1744 | case OpCode::Type::Shift: { |
| 1725 | std::string op_a = regs.GetRegisterAsInteger(instr.gpr8, 0, true); | 1745 | std::string op_a = regs.GetRegisterAsInteger(instr.gpr8, 0, true); |
| 1726 | std::string op_b; | 1746 | std::string op_b; |