FifoPlayer: Wait after clearing the screen

If we don't wait, then the copy will be performed at a later time, which may overwrite memory updates.
This commit is contained in:
Pokechu22 2021-12-11 17:33:35 -08:00
parent d981944d7c
commit 86f2b39d66
2 changed files with 19 additions and 7 deletions

View File

@ -214,6 +214,9 @@ public:
void Init() override void Init() override
{ {
IsPlayingBackFifologWithBrokenEFBCopies = m_parent->m_File->HasBrokenEFBCopies(); IsPlayingBackFifologWithBrokenEFBCopies = m_parent->m_File->HasBrokenEFBCopies();
// Without this call, we deadlock in initialization in dual core, as the FIFO is disabled and
// thus ClearEfb()'s call to WaitForGPUInactive() never returns
CPU::EnableStepping(false);
m_parent->m_CurrentFrame = m_parent->m_FrameRangeStart; m_parent->m_CurrentFrame = m_parent->m_FrameRangeStart;
m_parent->LoadMemory(); m_parent->LoadMemory();
@ -422,13 +425,7 @@ void FifoPlayer::WriteFrame(const FifoFrameInfo& frame, const AnalyzedFrameInfo&
} }
FlushWGP(); FlushWGP();
WaitForGPUInactive();
// Sleep while the GPU is active
while (!IsIdleSet() && CPU::GetState() != CPU::State::PowerDown)
{
CoreTiming::Idle();
CoreTiming::Advance();
}
} }
void FifoPlayer::WriteFramePart(const FramePart& part, u32* next_mem_update, void FifoPlayer::WriteFramePart(const FramePart& part, u32* next_mem_update,
@ -603,6 +600,10 @@ void FifoPlayer::ClearEfb()
LoadBPReg(BPMEM_EFB_WH, m_File->GetBPMem()[BPMEM_EFB_WH]); LoadBPReg(BPMEM_EFB_WH, m_File->GetBPMem()[BPMEM_EFB_WH]);
LoadBPReg(BPMEM_MIPMAP_STRIDE, m_File->GetBPMem()[BPMEM_MIPMAP_STRIDE]); LoadBPReg(BPMEM_MIPMAP_STRIDE, m_File->GetBPMem()[BPMEM_MIPMAP_STRIDE]);
LoadBPReg(BPMEM_EFB_ADDR, m_File->GetBPMem()[BPMEM_EFB_ADDR]); LoadBPReg(BPMEM_EFB_ADDR, m_File->GetBPMem()[BPMEM_EFB_ADDR]);
// Wait for the EFB copy to finish. That way, the EFB copy (which will be performed at a later
// time) won't clobber any memory updates.
FlushWGP();
WaitForGPUInactive();
} }
void FifoPlayer::LoadMemory() void FifoPlayer::LoadMemory()
@ -695,6 +696,16 @@ void FifoPlayer::FlushWGP()
GPFifo::ResetGatherPipe(); GPFifo::ResetGatherPipe();
} }
void FifoPlayer::WaitForGPUInactive()
{
// Sleep while the GPU is active
while (!IsIdleSet() && CPU::GetState() != CPU::State::PowerDown)
{
CoreTiming::Idle();
CoreTiming::Advance();
}
}
void FifoPlayer::LoadBPReg(u8 reg, u32 value) void FifoPlayer::LoadBPReg(u8 reg, u32 value)
{ {
GPFifo::Write8(0x61); // load BP reg GPFifo::Write8(0x61); // load BP reg

View File

@ -159,6 +159,7 @@ private:
void WritePI(u32 address, u32 value); void WritePI(u32 address, u32 value);
void FlushWGP(); void FlushWGP();
void WaitForGPUInactive();
void LoadBPReg(u8 reg, u32 value); void LoadBPReg(u8 reg, u32 value);
void LoadCPReg(u8 reg, u32 value); void LoadCPReg(u8 reg, u32 value);