diff options
| author | Nolan Check <Nolan.Check@gmail.com> | 2009-07-23 21:17:14 +0000 |
|---|---|---|
| committer | Nolan Check <Nolan.Check@gmail.com> | 2009-07-23 21:17:14 +0000 |
| commit | ce8b679d76d7100c50859cc39ede7f9fa006fa28 (patch) | |
| tree | f3daebea8596a3381d02250257be8c477578dad2 /Source/Core/VideoCommon | |
| parent | 3c9b5bbf7b98702a34d3c5336c62ef0c5eebec3a (diff) | |
Revert most of r3855.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3875 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon')
| -rw-r--r-- | Source/Core/VideoCommon/Src/Fifo.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index 0365238a05..1f7a3488ee 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -125,6 +125,9 @@ void Fifo_EnterLoop(const SVideoInitialize &video_initialize) while (fifoStateRun) { + video_initialize.pPeekMessages(); + VideoFifo_CheckEFBAccess(); + VideoFifo_CheckSwapRequest(); s_criticalFifo.Enter(); @@ -133,27 +136,38 @@ void Fifo_EnterLoop(const SVideoInitialize &video_initialize) { Common::AtomicStore(_fifo.CPReadIdle, 0); - do + while (_fifo.bFF_GPReadEnable && _fifo.CPReadWriteDistance) { if(!fifoStateRun) break; u32 readPtr = _fifo.CPReadPointer; + s32 distToSend; + // Only send 32 bytes at a time if breakpoint is enabled. + if (_fifo.bFF_BPEnable) + distToSend = 32; + else + { + distToSend = _fifo.CPReadWriteDistance; + if ((distToSend + readPtr) >= _fifo.CPEnd) + distToSend = _fifo.CPEnd - readPtr; + } + u8 *uData = video_initialize.pGetMemoryPointer(readPtr); // Execute new instructions found in uData - Fifo_SendFifoData(uData, 32); + Fifo_SendFifoData(uData, distToSend); - readPtr += 32; + readPtr += distToSend; if (readPtr >= _fifo.CPEnd) readPtr = _fifo.CPBase; Common::AtomicStore(_fifo.CPReadPointer, readPtr); - Common::AtomicAdd(_fifo.CPReadWriteDistance, -32); + Common::AtomicAdd(_fifo.CPReadWriteDistance, -distToSend); if (_fifo.bFF_BPEnable && (readPtr == _fifo.CPBreakpoint)) { - _fifo.bFF_Breakpoint = 1; + Common::AtomicStore(_fifo.bFF_Breakpoint, 1); video_initialize.pUpdateInterrupts(); } @@ -161,18 +175,12 @@ void Fifo_EnterLoop(const SVideoInitialize &video_initialize) VideoFifo_CheckEFBAccess(); VideoFifo_CheckSwapRequest(); - } while (_fifo.bFF_GPReadEnable && _fifo.CPReadWriteDistance && !(_fifo.bFF_BPEnable && _fifo.bFF_Breakpoint)); + } Common::AtomicStore(_fifo.CPReadIdle, 1); - video_initialize.pSetFifoIdle(); } else - { Common::YieldCPU(); - video_initialize.pPeekMessages(); - VideoFifo_CheckEFBAccess(); - VideoFifo_CheckSwapRequest(); - } s_criticalFifo.Leave(); } |
