If there is a SetBreakPoint and the actual distance is enough to achieve the BP, we wait for the FIFO Loop in dual core mode. That fix Pokemon XD in game in dual core mode (also maybe this fix Issue 3452) and hopefully others FIFO hangs related with BP. I test games like SMG and don't produce slowdowns. If you have any slowdown about this commit. Please report it.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6483 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Marcos Vitali 2010-11-27 19:36:18 +00:00
parent 5ae1b65388
commit 762563a026
1 changed files with 24 additions and 0 deletions

View File

@ -402,6 +402,30 @@ void Write16(const u16 _Value, const u32 _Address)
UCPCtrlReg tmpCtrl(_Value);
m_CPCtrlReg.Hex = tmpCtrl.Hex;
//If there is a SetBreakPoint and the actual distance is enought to achieve the BP,
//we wait for the FIFO Loop in DC MODE
if (g_VideoInitialize.bOnThread && fifo.bFF_BPInt && tmpCtrl.BPInt && fifo.bFF_BPEnable && tmpCtrl.BPEnable)
{
bool wait = false;
if (fifo.CPReadPointer + fifo.CPReadWriteDistance + 32 > fifo.CPBreakpoint)
{
wait = true;
} //If the distance is >= CPEnd we need to calculate the distane related to CPBase
else if (fifo.CPReadPointer + fifo.CPReadWriteDistance >= fifo.CPEnd)
{
if (fifo.CPReadWriteDistance + fifo.CPReadPointer - fifo.CPEnd + 32 > fifo.CPBreakpoint)
wait = true;
}
// We waiting for the fifo loop finish
while (wait && fifo.bFF_GPReadEnable && (fifo.CPReadWriteDistance ||
(fifo.bFF_BPEnable && ((fifo.CPReadPointer <= fifo.CPBreakpoint) &&
(fifo.CPReadPointer + 32 > fifo.CPBreakpoint)))))
{
Common::YieldCPU();
}
}
Common::AtomicStore(fifo.bFF_Breakpoint, false);
if (tmpCtrl.FifoUnderflowIntEnable)