diff options
| author | Tillmann Karras <tilkax@gmail.com> | 2024-11-16 16:08:54 +0000 |
|---|---|---|
| committer | Tillmann Karras <tilkax@gmail.com> | 2025-05-05 21:18:37 +0100 |
| commit | 6f25e20c6a0c5b4027fffe2bea0116728018e7df (patch) | |
| tree | 8b2d53116f2fe220829f589ac2a5e36c0eb4b20a /Source/Core/VideoCommon/CommandProcessor.cpp | |
| parent | d2db9d95906de73d704bd0f32bd1ee79f4a442f6 (diff) | |
VideoCommon: reset some CP registers during PI_FIFO_RESET
This fixes the shutdown error in SpongeBob Globs of Doom.
Diffstat (limited to 'Source/Core/VideoCommon/CommandProcessor.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/CommandProcessor.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index 3a771e1f2a..8342bfb6fb 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -87,6 +87,8 @@ void CommandProcessorManager::DoState(PointerWrap& p) p.Do(m_cp_status_reg); p.Do(m_cp_ctrl_reg); p.Do(m_cp_clear_reg); + p.Do(m_perf_select); + p.Do(m_unk_0a_reg); m_fifo.DoState(p); p.Do(m_interrupt_set); @@ -200,13 +202,13 @@ void CommandProcessorManager::RegisterMMIO(MMIO::Mapping* mmio, u32 base) mmio->Register(base | CTRL_REGISTER, MMIO::DirectRead<u16>(&m_cp_ctrl_reg.Hex), MMIO::ComplexWrite<u16>([](Core::System& system_, u32, u16 val) { auto& cp = system_.GetCommandProcessor(); - UCPCtrlReg tmp(val); + UCPCtrlReg tmp(val & 0x3F); cp.m_cp_ctrl_reg.Hex = tmp.Hex; cp.SetCpControlRegister(); system_.GetFifo().RunGpu(); })); - mmio->Register(base | CLEAR_REGISTER, MMIO::DirectRead<u16>(&m_cp_clear_reg.Hex), + mmio->Register(base | CLEAR_REGISTER, MMIO::Constant<u16>(0), MMIO::ComplexWrite<u16>([](Core::System& system_, u32, u16 val) { auto& cp = system_.GetCommandProcessor(); UCPClearReg tmp(val); @@ -215,7 +217,14 @@ void CommandProcessorManager::RegisterMMIO(MMIO::Mapping* mmio, u32 base) system_.GetFifo().RunGpu(); })); - mmio->Register(base | PERF_SELECT, MMIO::InvalidRead<u16>(), MMIO::Nop<u16>()); + // TODO: Figure out how this works. Written by GXSetGPMetric. Nicktoons MLB has DWARF v2 with enum + // names. + mmio->Register(base | PERF_SELECT, MMIO::DirectRead<u16>(&m_perf_select), + MMIO::DirectWrite<u16>(&m_perf_select, 0x0007)); + + // TODO: Figure out what this is. + mmio->Register(base | UNK_0A_REGISTER, MMIO::DirectRead<u16>(&m_unk_0a_reg), + MMIO::DirectWrite<u16>(&m_unk_0a_reg, 0x00FF)); // Some MMIOs have different handlers for single core vs. dual core mode. const bool is_on_thread = IsOnThread(m_system); @@ -565,6 +574,7 @@ void CommandProcessorManager::SetCpStatusRegister() void CommandProcessorManager::SetCpControlRegister() { + // Just before disabling reads, give the GPU a chance to catch up. if (m_fifo.bFF_GPReadEnable.load(std::memory_order_relaxed) && !m_cp_ctrl_reg.GPReadEnable) { m_system.GetFifo().SyncGPUForRegisterAccess(); @@ -591,6 +601,18 @@ void CommandProcessorManager::SetCpClearRegister() { } +void CommandProcessorManager::ResetFifo() +{ + // Link fifos, disable interrupts, disable reads. + m_cp_ctrl_reg.Hex = 0x0010; + SetCpControlRegister(); + m_perf_select = 0; + m_unk_0a_reg = 0; + m_fifo.CPLoWatermark = 0; + m_fifo.CPHiWatermark = GetPhysicalAddressMask(m_system.IsWii()) & ~31u; + SetCpStatusRegister(); +} + void CommandProcessorManager::HandleUnknownOpcode(u8 cmd_byte, const u8* buffer, bool preprocess) { // Datel software uses 0x01 during startup, and Mario Party 5's Wiggler capsule accidentally uses |
