diff options
| author | ayuanx <ayuanx@gmail.com> | 2010-01-03 16:04:40 +0000 |
|---|---|---|
| committer | ayuanx <ayuanx@gmail.com> | 2010-01-03 16:04:40 +0000 |
| commit | a3c258cf9cd46a24d1471f95f5b750456c55c2f0 (patch) | |
| tree | 0a721900ffc0d8d41a109f3c74c940f68a4fdeb7 /Source/Core/VideoCommon/Src/CommandProcessor.cpp | |
| parent | ad594abe6963a79f91f0116accd98feed0816782 (diff) | |
Fixed Issue 1921
This also fixed Ikaruga, not sure whether it could fix Metriod Prime. If not, how about disabling EFB copy?
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4777 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/CommandProcessor.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/CommandProcessor.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index ba9a75ed7a..bf88c57e57 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -381,8 +381,11 @@ void Write16(const u16 _Value, const u32 _Address) DEBUG_LOG(COMMANDPROCESSOR, "*********************** GXSetGPFifo very soon? ***********************");
// (mb2) We don't sleep here since it could be a perf issue for super monkey ball (yup only this game IIRC)
// Touching that game is a no-go so I don't want to take the risk :p
- while (fifo.bFF_GPReadEnable && fifo.CPReadWriteDistance && !fifo.bFF_Breakpoint)
+ while (fifo.bFF_GPReadEnable && ((!fifo.bFF_BPEnable && fifo.CPReadWriteDistance) || (fifo.bFF_BPEnable && !fifo.bFF_Breakpoint)))
+ {
+ Fifo_RunLoop();
s_fifoIdleEvent.MsgWait();
+ }
}
}
@@ -411,6 +414,8 @@ void Write16(const u16 _Value, const u32 _Address) Common::AtomicStore(fifo.bFF_Breakpoint, 0);
}
+ Fifo_RunLoop();
+
DEBUG_LOG(COMMANDPROCESSOR,"\t write to CTRL_REGISTER : %04x", _Value);
DEBUG_LOG(COMMANDPROCESSOR, "\t GPREAD %s | LINK %s | BP %s || Init %s | OvF %s | UndF %s"
, fifo.bFF_GPReadEnable ? "ON" : "OFF"
@@ -566,7 +571,10 @@ bool AllowIdleSkipping() void WaitForFrameFinish()
{
while ((fake_GPWatchdogLastToken == fifo.Fake_GPWDToken) && fifo.bFF_GPReadEnable && ((!fifo.bFF_BPEnable && fifo.CPReadWriteDistance) || (fifo.bFF_BPEnable && !fifo.bFF_Breakpoint)));
+ {
+ Fifo_RunLoop();
s_fifoIdleEvent.MsgWait();
+ }
fake_GPWatchdogLastToken = fifo.Fake_GPWDToken;
}
@@ -586,6 +594,7 @@ void STACKALIGN GatherPipeBursted() fifo.CPWritePointer += GATHER_PIPE_SIZE;
Common::AtomicAdd(fifo.CPReadWriteDistance, GATHER_PIPE_SIZE);
+ Fifo_RunLoop();
// High watermark overflow handling (hacked way)
if (fifo.CPReadWriteDistance > fifo.CPHiWatermark)
@@ -608,8 +617,11 @@ void STACKALIGN GatherPipeBursted() INFO_LOG(COMMANDPROCESSOR, "(GatherPipeBursted): CPHiWatermark (Hi: 0x%04x, Lo: 0x%04x) reached (RWDistance: 0x%04x)", fifo.CPHiWatermark, fifo.CPLoWatermark, fifo.CPReadWriteDistance);
// Wait for GPU to catch up
- while (fifo.CPReadWriteDistance > fifo.CPLoWatermark && !fifo.bFF_Breakpoint)
+ while (fifo.CPReadWriteDistance > fifo.CPLoWatermark && fifo.bFF_GPReadEnable && (!fifo.bFF_BPEnable || (fifo.bFF_BPEnable && !fifo.bFF_Breakpoint)))
+ {
+ Fifo_RunLoop();
s_fifoIdleEvent.MsgWait();
+ }
}
// check if we are in sync
_assert_msg_(COMMANDPROCESSOR, fifo.CPWritePointer == *(g_VideoInitialize.Fifo_CPUWritePointer), "FIFOs linked but out of sync");
@@ -649,7 +661,9 @@ void CatchUpGPU() {
if (
(fifo.CPReadPointer == fifo.CPBreakpoint) ||
- (fifo.CPReadPointer == fifo.CPWritePointer) ||
+ //(fifo.CPReadPointer <= fifo.CPBreakpoint && fifo.CPReadPointer + 32 > fifo.CPBreakpoint) ||
+ (fifo.CPReadPointer <= fifo.CPWritePointer && fifo.CPWritePointer < fifo.CPBreakpoint) ||
+ (fifo.CPReadPointer <= fifo.CPWritePointer && fifo.CPReadPointer > fifo.CPBreakpoint) ||
(fifo.CPReadPointer > fifo.CPBreakpoint && fifo.CPBreakpoint > fifo.CPWritePointer)
)
{
@@ -711,6 +725,7 @@ void UpdateFifoRegister() dist = (wp - fifo.CPBase) + ((fifo.CPEnd + GATHER_PIPE_SIZE) - rp);
Common::AtomicStore(fifo.CPReadWriteDistance, dist);
+ Fifo_RunLoop();
if (!g_VideoInitialize.bOnThread)
CatchUpGPU();
|
