mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 22:29:39 -06:00
I've observed that "FIFO is overflown by GatherPipe" is not real overflow.
Really that happens because the fifo.CPReadWriteDistance is negative. Example: CPReadWriteDistance: -864 CPEnd: 10092672 fifo.CPBase: 9568416 In SMG this is because PI_FIFO_RESET is writing and after fifo.CPReadWriteDistance will be setted to 0. To Prevent that, I've Implemented AbortFrame function in the CommmandProcessor. It should fix overflown because of that. Note: There is other issue (Issue 2846) where the fifo.CPReadWriteDistance is negative too but the effect is different. I'm working to solve this. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6083 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -701,4 +701,18 @@ void SetFifoIdleFromVideoPlugin()
|
||||
s_fifoIdleEvent.Set();
|
||||
}
|
||||
|
||||
// This is called by the ProcessorInterface when PI_FIFO_RESET is writed,
|
||||
// the general idea is abort all commands in the FIFO.
|
||||
// This prevent Negative fifo.CPReadWriteDistance because when PI_FIFO_RESET happens
|
||||
// the fifo.CPReadWriteDistance is writed to 0
|
||||
void AbortFrame()
|
||||
{
|
||||
Fifo_SetRendering(false);
|
||||
while(!fifo.CPCmdIdle)
|
||||
Common::YieldCPU();
|
||||
Fifo_SetRendering(true);
|
||||
PixelEngine::ResetSetToken();
|
||||
PixelEngine::ResetSetFinish();
|
||||
}
|
||||
|
||||
} // end of namespace CommandProcessor
|
||||
|
@ -162,6 +162,7 @@ void WaitForFrameFinish();
|
||||
void FifoCriticalEnter();
|
||||
void FifoCriticalLeave();
|
||||
|
||||
void AbortFrame();
|
||||
} // namespace CommandProcessor
|
||||
|
||||
#endif // _COMMANDPROCESSOR_H
|
||||
|
@ -393,4 +393,16 @@ void ResetSetFinish()
|
||||
}
|
||||
}
|
||||
|
||||
void ResetSetToken()
|
||||
{
|
||||
if (g_bSignalTokenInterrupt)
|
||||
{
|
||||
g_VideoInitialize.pSetInterrupt(INT_CAUSE_PE_TOKEN, false);
|
||||
g_bSignalTokenInterrupt = false;
|
||||
|
||||
}else
|
||||
{
|
||||
g_VideoInitialize.pRemoveEvent(et_SetTokenOnMainThread);
|
||||
}
|
||||
}
|
||||
} // end of namespace PixelEngine
|
||||
|
@ -68,6 +68,7 @@ void Write32(const u32 _iValue, const u32 _iAddress);
|
||||
void SetToken(const u16 _token, const int _bSetTokenAcknowledge);
|
||||
void SetFinish(void);
|
||||
void ResetSetFinish(void);
|
||||
void ResetSetToken(void);
|
||||
bool AllowIdleSkipping();
|
||||
|
||||
// Bounding box functionality. Paper Mario (both) are a couple of the few games that use it.
|
||||
|
Reference in New Issue
Block a user