VideoCommon: Move logging/seen check for unknown opcodes into CommandProcessor
That way, they're in the same place the panic alerts are generated.
This commit is contained in:
parent
79b2185117
commit
8d7eff2a8a
|
@ -41,6 +41,8 @@ static u16 m_tokenReg;
|
||||||
static Common::Flag s_interrupt_set;
|
static Common::Flag s_interrupt_set;
|
||||||
static Common::Flag s_interrupt_waiting;
|
static Common::Flag s_interrupt_waiting;
|
||||||
|
|
||||||
|
static bool s_is_fifo_error_seen = false;
|
||||||
|
|
||||||
static bool IsOnThread()
|
static bool IsOnThread()
|
||||||
{
|
{
|
||||||
return Core::System::GetInstance().IsDualCoreMode();
|
return Core::System::GetInstance().IsDualCoreMode();
|
||||||
|
@ -73,6 +75,8 @@ void SCPFifoStruct::Init()
|
||||||
bFF_HiWatermarkInt.store(0, std::memory_order_relaxed);
|
bFF_HiWatermarkInt.store(0, std::memory_order_relaxed);
|
||||||
bFF_LoWatermark.store(0, std::memory_order_relaxed);
|
bFF_LoWatermark.store(0, std::memory_order_relaxed);
|
||||||
bFF_LoWatermarkInt.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)
|
void SCPFifoStruct::DoState(PointerWrap& p)
|
||||||
|
@ -611,18 +615,26 @@ void SetCpClearRegister()
|
||||||
|
|
||||||
void HandleUnknownOpcode(u8 cmd_byte, const u8* buffer, bool preprocess)
|
void HandleUnknownOpcode(u8 cmd_byte, const u8* buffer, bool preprocess)
|
||||||
{
|
{
|
||||||
// TODO(Omega): Maybe dump FIFO to file on this error
|
// Datel software uses 0x01 during startup, and Mario Party 5's Wiggler capsule
|
||||||
PanicAlertFmtT("GFX FIFO: Unknown Opcode ({0:#04x} @ {1}, preprocess={2}).\n"
|
// accidentally uses 0x01-0x03 due to sending 4 more vertices than intended.
|
||||||
"This means one of the following:\n"
|
// Hardware testing indicates that 0x01-0x07 do nothing, so to avoid annoying the user with
|
||||||
"* The emulated GPU got desynced, disabling dual core can help\n"
|
// spurious popups, we don't create a panic alert in those cases. Other unknown opcodes
|
||||||
"* Command stream corrupted by some spurious memory bug\n"
|
// (such as 0x18) seem to result in hangs.
|
||||||
"* This really is an unknown opcode (unlikely)\n"
|
if (!s_is_fifo_error_seen && cmd_byte > 0x07)
|
||||||
"* 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);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
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"
|
PanicAlertFmt("Illegal command {:02x}\n"
|
||||||
"CPBase: {:#010x}\n"
|
"CPBase: {:#010x}\n"
|
||||||
"CPEnd: {:#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_HiWatermarkInt.load(std::memory_order_relaxed) ? "true" : "false",
|
||||||
fifo.bFF_LoWatermarkInt.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
|
} // namespace CommandProcessor
|
||||||
|
|
|
@ -32,14 +32,8 @@
|
||||||
|
|
||||||
namespace OpcodeDecoder
|
namespace OpcodeDecoder
|
||||||
{
|
{
|
||||||
static bool s_is_fifo_error_seen = false;
|
|
||||||
bool g_record_fifo_data = false;
|
bool g_record_fifo_data = false;
|
||||||
|
|
||||||
void Init()
|
|
||||||
{
|
|
||||||
s_is_fifo_error_seen = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <bool is_preprocess>
|
template <bool is_preprocess>
|
||||||
class RunCallback final : public Callback
|
class RunCallback final : public Callback
|
||||||
{
|
{
|
||||||
|
@ -207,19 +201,7 @@ public:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Datel software uses 0x01 during startup, and Mario Party 5's Wiggler capsule
|
CommandProcessor::HandleUnknownOpcode(opcode, data, is_preprocess);
|
||||||
// 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 && opcode > 0x07)
|
|
||||||
{
|
|
||||||
CommandProcessor::HandleUnknownOpcode(opcode, data, is_preprocess);
|
|
||||||
s_is_fifo_error_seen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ERROR_LOG_FMT(VIDEO, "FIFO: Unknown Opcode({:#04x} @ {}, preprocessing = {})", opcode,
|
|
||||||
fmt::ptr(data), is_preprocess ? "yes" : "no");
|
|
||||||
m_cycles += 1;
|
m_cycles += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,8 +60,6 @@ enum class Primitive : u8
|
||||||
GX_DRAW_POINTS = 0x7 // 0xB8
|
GX_DRAW_POINTS = 0x7 // 0xB8
|
||||||
};
|
};
|
||||||
|
|
||||||
void Init();
|
|
||||||
|
|
||||||
// Interface for the Run and RunCommand functions below.
|
// Interface for the Run and RunCommand functions below.
|
||||||
// The functions themselves are templates so that the compiler generates separate versions for each
|
// The functions themselves are templates so that the compiler generates separate versions for each
|
||||||
// callback (with the callback functions inlined), so the callback doesn't actually need to be
|
// callback (with the callback functions inlined), so the callback doesn't actually need to be
|
||||||
|
|
|
@ -316,7 +316,6 @@ void VideoBackendBase::InitializeShared()
|
||||||
|
|
||||||
CommandProcessor::Init();
|
CommandProcessor::Init();
|
||||||
Fifo::Init();
|
Fifo::Init();
|
||||||
OpcodeDecoder::Init();
|
|
||||||
PixelEngine::Init();
|
PixelEngine::Init();
|
||||||
BPInit();
|
BPInit();
|
||||||
VertexLoaderManager::Init();
|
VertexLoaderManager::Init();
|
||||||
|
|
Loading…
Reference in New Issue