summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/CommandProcessor.cpp
diff options
context:
space:
mode:
authorPokechu22 <Pokechu022@gmail.com>2022-01-22 22:02:20 -0800
committerPokechu22 <Pokechu022@gmail.com>2022-01-22 22:04:15 -0800
commit8d7eff2a8a5ffc204565e554dc0a71206f7032a4 (patch)
treed289138fbfa228a28d94766d41734184ccef5096 /Source/Core/VideoCommon/CommandProcessor.cpp
parent79b2185117bb2ecba4d069d9eb1ff6f2280905d0 (diff)
VideoCommon: Move logging/seen check for unknown opcodes into CommandProcessor
That way, they're in the same place the panic alerts are generated.
Diffstat (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/CommandProcessor.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp
index c80469f89d..51b67a9ead 100644
--- a/Source/Core/VideoCommon/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/CommandProcessor.cpp
@@ -41,6 +41,8 @@ static u16 m_tokenReg;
static Common::Flag s_interrupt_set;
static Common::Flag s_interrupt_waiting;
+static bool s_is_fifo_error_seen = false;
+
static bool IsOnThread()
{
return Core::System::GetInstance().IsDualCoreMode();
@@ -73,6 +75,8 @@ void SCPFifoStruct::Init()
bFF_HiWatermarkInt.store(0, std::memory_order_relaxed);
bFF_LoWatermark.store(0, std::memory_order_relaxed);
bFF_LoWatermarkInt.store(0, std::memory_order_relaxed);
+
+ s_is_fifo_error_seen = false;
}
void SCPFifoStruct::DoState(PointerWrap& p)
@@ -611,18 +615,26 @@ void SetCpClearRegister()
void HandleUnknownOpcode(u8 cmd_byte, const u8* buffer, bool preprocess)
{
- // TODO(Omega): Maybe dump FIFO to file on this error
- PanicAlertFmtT("GFX FIFO: Unknown Opcode ({0:#04x} @ {1}, preprocess={2}).\n"
- "This means one of the following:\n"
- "* The emulated GPU got desynced, disabling dual core can help\n"
- "* Command stream corrupted by some spurious memory bug\n"
- "* This really is an unknown opcode (unlikely)\n"
- "* Some other sort of bug\n\n"
- "Further errors will be sent to the Video Backend log and\n"
- "Dolphin will now likely crash or hang. Enjoy.",
- cmd_byte, fmt::ptr(buffer), preprocess);
-
+ // Datel software uses 0x01 during startup, and Mario Party 5's Wiggler capsule
+ // accidentally uses 0x01-0x03 due to sending 4 more vertices than intended.
+ // Hardware testing indicates that 0x01-0x07 do nothing, so to avoid annoying the user with
+ // spurious popups, we don't create a panic alert in those cases. Other unknown opcodes
+ // (such as 0x18) seem to result in hangs.
+ if (!s_is_fifo_error_seen && cmd_byte > 0x07)
{
+ s_is_fifo_error_seen = true;
+
+ // TODO(Omega): Maybe dump FIFO to file on this error
+ PanicAlertFmtT("GFX FIFO: Unknown Opcode ({0:#04x} @ {1}, preprocess={2}).\n"
+ "This means one of the following:\n"
+ "* The emulated GPU got desynced, disabling dual core can help\n"
+ "* Command stream corrupted by some spurious memory bug\n"
+ "* This really is an unknown opcode (unlikely)\n"
+ "* Some other sort of bug\n\n"
+ "Further errors will be sent to the Video Backend log and\n"
+ "Dolphin will now likely crash or hang. Enjoy.",
+ cmd_byte, fmt::ptr(buffer), preprocess);
+
PanicAlertFmt("Illegal command {:02x}\n"
"CPBase: {:#010x}\n"
"CPEnd: {:#010x}\n"
@@ -653,6 +665,10 @@ void HandleUnknownOpcode(u8 cmd_byte, const u8* buffer, bool preprocess)
fifo.bFF_HiWatermarkInt.load(std::memory_order_relaxed) ? "true" : "false",
fifo.bFF_LoWatermarkInt.load(std::memory_order_relaxed) ? "true" : "false");
}
+
+ // We always generate this log message, though we only generate the panic alerts once.
+ ERROR_LOG_FMT(VIDEO, "FIFO: Unknown Opcode ({:#04x} @ {}, preprocessing = {})", cmd_byte,
+ fmt::ptr(buffer), preprocess ? "yes" : "no");
}
} // namespace CommandProcessor