- Reimplemented FifoReset in other way, only call to GPFifo::ResetGatherPipe() ResetVideoBuffer() in FIFO_RW_DISTANCE_LO when this is equal to "0"
- In the Command Processor Control Register when GPReadEnable is OFF, wait until the fifo lopp finish with thi actual 32 bytes block. This is necessary to have Safe Disabble GP Read in this way AbortFrame is performed by the software, beside this can help to have accurate GPReadEnable OFF. Please test Metroid Prime 1/2, Guilty Gear XX, X men gc, SMG, and shuffle you can test Harry Potter Prince for WII. :) PD: The fifo code need a clean very soon. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7158 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
0bf25c91ab
commit
05feabdb49
|
@ -72,6 +72,7 @@ struct SCPFifoStruct
|
||||||
|
|
||||||
// for GP watchdog hack
|
// for GP watchdog hack
|
||||||
volatile u32 Fake_GPWDToken; // cicular incrementer
|
volatile u32 Fake_GPWDToken; // cicular incrementer
|
||||||
|
volatile u32 isFifoProcesingData;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VideoBackend
|
class VideoBackend
|
||||||
|
|
|
@ -191,7 +191,7 @@ void Write32(const u32 _uValue, const u32 _iAddress)
|
||||||
|
|
||||||
case PI_FIFO_RESET:
|
case PI_FIFO_RESET:
|
||||||
//Abort the actual frame
|
//Abort the actual frame
|
||||||
g_video_backend->Video_AbortFrame();
|
//g_video_backend->Video_AbortFrame();
|
||||||
//Fifo_CPUWritePointer = Fifo_CPUBase; ??
|
//Fifo_CPUWritePointer = Fifo_CPUBase; ??
|
||||||
//PanicAlert("Unknown write to PI_FIFO_RESET (%08x)", _uValue);
|
//PanicAlert("Unknown write to PI_FIFO_RESET (%08x)", _uValue);
|
||||||
WARN_LOG(PROCESSORINTERFACE, "Fifo reset (%08x)", _uValue);
|
WARN_LOG(PROCESSORINTERFACE, "Fifo reset (%08x)", _uValue);
|
||||||
|
|
|
@ -474,7 +474,6 @@ void Write16(const u16 _Value, const u32 _Address)
|
||||||
|
|
||||||
fifo.bFF_BPInt = tmpCtrl.BPInt;
|
fifo.bFF_BPInt = tmpCtrl.BPInt;
|
||||||
fifo.bFF_BPEnable = tmpCtrl.BPEnable;
|
fifo.bFF_BPEnable = tmpCtrl.BPEnable;
|
||||||
fifo.bFF_GPReadEnable = tmpCtrl.GPReadEnable;
|
|
||||||
fifo.bFF_HiWatermarkInt = tmpCtrl.FifoOverflowIntEnable;
|
fifo.bFF_HiWatermarkInt = tmpCtrl.FifoOverflowIntEnable;
|
||||||
fifo.bFF_LoWatermarkInt = tmpCtrl.FifoUnderflowIntEnable;
|
fifo.bFF_LoWatermarkInt = tmpCtrl.FifoUnderflowIntEnable;
|
||||||
fifo.bFF_GPLinkEnable = tmpCtrl.GPLinkEnable;
|
fifo.bFF_GPLinkEnable = tmpCtrl.GPLinkEnable;
|
||||||
|
@ -489,6 +488,15 @@ void Write16(const u16 _Value, const u32 _Address)
|
||||||
if (bProcessFifoToLoWatermark)
|
if (bProcessFifoToLoWatermark)
|
||||||
ProcessFifoToLoWatermark();
|
ProcessFifoToLoWatermark();
|
||||||
|
|
||||||
|
if(fifo.bFF_GPReadEnable && !tmpCtrl.GPReadEnable)
|
||||||
|
{
|
||||||
|
fifo.bFF_GPReadEnable = tmpCtrl.GPReadEnable;
|
||||||
|
while(fifo.isFifoProcesingData) Common::YieldCPU();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fifo.bFF_GPReadEnable = tmpCtrl.GPReadEnable;
|
||||||
|
}
|
||||||
|
|
||||||
INFO_LOG(COMMANDPROCESSOR,"\t Write to CTRL_REGISTER : %04x", _Value);
|
INFO_LOG(COMMANDPROCESSOR,"\t Write to CTRL_REGISTER : %04x", _Value);
|
||||||
DEBUG_LOG(COMMANDPROCESSOR, "\t GPREAD %s | BP %s | Int %s | OvF %s | UndF %s | LINK %s"
|
DEBUG_LOG(COMMANDPROCESSOR, "\t GPREAD %s | BP %s | Int %s | OvF %s | UndF %s | LINK %s"
|
||||||
|
@ -613,6 +621,12 @@ void Write16(const u16 _Value, const u32 _Address)
|
||||||
break;
|
break;
|
||||||
case FIFO_RW_DISTANCE_LO:
|
case FIFO_RW_DISTANCE_LO:
|
||||||
WriteLow((u32 &)fifo.CPReadWriteDistance, _Value & 0xFFE0);
|
WriteLow((u32 &)fifo.CPReadWriteDistance, _Value & 0xFFE0);
|
||||||
|
if (fifo.CPReadWriteDistance == 0)
|
||||||
|
{
|
||||||
|
GPFifo::ResetGatherPipe();
|
||||||
|
ResetVideoBuffer();
|
||||||
|
IncrementCheckContextId();
|
||||||
|
}
|
||||||
DEBUG_LOG(COMMANDPROCESSOR,"try to write to FIFO_RW_DISTANCE_LO : %04x", _Value);
|
DEBUG_LOG(COMMANDPROCESSOR,"try to write to FIFO_RW_DISTANCE_LO : %04x", _Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -700,10 +714,6 @@ void STACKALIGN GatherPipeBursted()
|
||||||
while (!CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable &&
|
while (!CommandProcessor::interruptWaiting && fifo.bFF_GPReadEnable &&
|
||||||
fifo.CPReadWriteDistance > fifo.CPEnd - fifo.CPBase - 64)
|
fifo.CPReadWriteDistance > fifo.CPEnd - fifo.CPBase - 64)
|
||||||
Common::YieldCPU();
|
Common::YieldCPU();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -816,19 +826,19 @@ void SetFifoIdleFromVideoPlugin()
|
||||||
// to 0 when PI_FIFO_RESET occurs.
|
// to 0 when PI_FIFO_RESET occurs.
|
||||||
void AbortFrame()
|
void AbortFrame()
|
||||||
{
|
{
|
||||||
fifo.bFF_GPReadEnable = false;
|
//fifo.bFF_GPReadEnable = false;
|
||||||
while(IsFifoProcesingData()) Common::YieldCPU();
|
//while(IsFifoProcesingData()) Common::YieldCPU();
|
||||||
GPFifo::ResetGatherPipe();
|
//GPFifo::ResetGatherPipe();
|
||||||
ResetVideoBuffer();
|
//ResetVideoBuffer();
|
||||||
fifo.CPReadPointer = fifo.CPWritePointer;
|
//fifo.CPReadPointer = fifo.CPWritePointer;
|
||||||
fifo.CPReadWriteDistance = 0;
|
//fifo.CPReadWriteDistance = 0;
|
||||||
fifo.CPBreakpoint = 0;
|
//fifo.CPBreakpoint = 0;
|
||||||
fifo.bFF_Breakpoint = false;
|
//fifo.bFF_Breakpoint = false;
|
||||||
fifo.CPCmdIdle = false;
|
//fifo.CPCmdIdle = false;
|
||||||
PixelEngine::ResetSetToken();
|
//PixelEngine::ResetSetToken();
|
||||||
PixelEngine::ResetSetFinish();
|
//PixelEngine::ResetSetFinish();
|
||||||
fifo.bFF_GPReadEnable = true;
|
//fifo.bFF_GPReadEnable = true;
|
||||||
IncrementCheckContextId();
|
//IncrementCheckContextId();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetOverflowStatusFromGatherPipe()
|
void SetOverflowStatusFromGatherPipe()
|
||||||
|
|
|
@ -33,7 +33,6 @@ namespace
|
||||||
{
|
{
|
||||||
static volatile bool fifoStateRun = false;
|
static volatile bool fifoStateRun = false;
|
||||||
static volatile bool EmuRunning = false;
|
static volatile bool EmuRunning = false;
|
||||||
static volatile bool isFifoProcesingData = false;
|
|
||||||
static u8 *videoBuffer;
|
static u8 *videoBuffer;
|
||||||
// STATE_TO_SAVE
|
// STATE_TO_SAVE
|
||||||
static int size = 0;
|
static int size = 0;
|
||||||
|
@ -96,10 +95,6 @@ void Fifo_RunLoop(bool run)
|
||||||
EmuRunning = run;
|
EmuRunning = run;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsFifoProcesingData()
|
|
||||||
{
|
|
||||||
return isFifoProcesingData;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description: Fifo_EnterLoop() sends data through this function.
|
// Description: Fifo_EnterLoop() sends data through this function.
|
||||||
void Fifo_SendFifoData(u8* _uData, u32 len)
|
void Fifo_SendFifoData(u8* _uData, u32 len)
|
||||||
|
@ -148,7 +143,7 @@ void Fifo_EnterLoop()
|
||||||
while (!CommandProcessor::interruptWaiting && _fifo.bFF_GPReadEnable &&
|
while (!CommandProcessor::interruptWaiting && _fifo.bFF_GPReadEnable &&
|
||||||
_fifo.CPReadWriteDistance && (!AtBreakpoint() || CommandProcessor::OnOverflow))
|
_fifo.CPReadWriteDistance && (!AtBreakpoint() || CommandProcessor::OnOverflow))
|
||||||
{
|
{
|
||||||
isFifoProcesingData = true;
|
_fifo.isFifoProcesingData = true;
|
||||||
CommandProcessor::isPossibleWaitingSetDrawDone = _fifo.bFF_GPLinkEnable;
|
CommandProcessor::isPossibleWaitingSetDrawDone = _fifo.bFF_GPLinkEnable;
|
||||||
|
|
||||||
if (!fifoStateRun) break;
|
if (!fifoStateRun) break;
|
||||||
|
@ -188,7 +183,7 @@ void Fifo_EnterLoop()
|
||||||
CommandProcessor::isPossibleWaitingSetDrawDone = false;
|
CommandProcessor::isPossibleWaitingSetDrawDone = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
isFifoProcesingData = false;
|
_fifo.isFifoProcesingData = false;
|
||||||
|
|
||||||
CommandProcessor::SetFifoIdleFromVideoPlugin();
|
CommandProcessor::SetFifoIdleFromVideoPlugin();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue