CPU::State FifoPlayer::AdvanceFrame() { if (m_CurrentFrame >= m_FrameRangeEnd) { if (!m_Loop) return CPU::State::PowerDown; // If there are zero frames in the range then sleep instead of busy spinning if (m_FrameRangeStart >= m_FrameRangeEnd) return CPU::State::Stepping; // When looping, reload the contents of all the BP/CP/CF registers. // This ensures that each time the first frame is played back, the state of the // GPU is the same for each playback loop. m_CurrentFrame = m_FrameRangeStart; LoadRegisters(); LoadTextureMemory(); FlushWGP(); } if (m_FrameWrittenCb) m_FrameWrittenCb(); if (m_EarlyMemoryUpdates && m_CurrentFrame == m_FrameRangeStart) WriteAllMemoryUpdates(); WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); ++m_CurrentFrame; return CPU::State::Running; }
bool FifoPlayer::Play() { if (!m_File) return false; if (m_File->GetFrameCount() == 0) return false; IsPlayingBackFifologWithBrokenEFBCopies = m_File->HasBrokenEFBCopies(); m_CurrentFrame = m_FrameRangeStart; LoadMemory(); // This loop replaces the CPU loop that occurs when a game is run while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) { if (PowerPC::GetState() == PowerPC::CPU_RUNNING) { if (m_CurrentFrame >= m_FrameRangeEnd) { if (m_Loop) { m_CurrentFrame = m_FrameRangeStart; PowerPC::ppcState.downcount = 0; CoreTiming::Advance(); } else { PowerPC::Stop(); Host_Message(WM_USER_STOP); } } else { if (m_FrameWrittenCb) m_FrameWrittenCb(); if (m_EarlyMemoryUpdates && m_CurrentFrame == m_FrameRangeStart) WriteAllMemoryUpdates(); WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); ++m_CurrentFrame; } } } IsPlayingBackFifologWithBrokenEFBCopies = false; return true; }
bool FifoPlayer::Play() { if (!m_File) return false; if (m_File->GetFrameCount() == 0) return false; m_CurrentFrame = m_FrameRangeStart; LoadMemory(); // This loop replaces the CPU loop that occurs when a game is run while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) { if (PowerPC::GetState() == PowerPC::CPU_RUNNING) { if (m_CurrentFrame >= m_FrameRangeEnd) { m_CurrentFrame = m_FrameRangeStart; CoreTiming::downcount = 0; CoreTiming::Advance(); } else { if (m_FrameWrittenCb) m_FrameWrittenCb(); if (m_EarlyMemoryUpdates && m_CurrentFrame == m_FrameRangeStart) WriteAllMemoryUpdates(); WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); ++m_CurrentFrame; } } } return true; }
int FifoPlayer::AdvanceFrame() { if (m_CurrentFrame >= m_FrameRangeEnd) { if (!m_Loop) return CPU::CPU_POWERDOWN; // If there are zero frames in the range then sleep instead of busy spinning if (m_FrameRangeStart >= m_FrameRangeEnd) return CPU::CPU_STEPPING; m_CurrentFrame = m_FrameRangeStart; } if (m_FrameWrittenCb) m_FrameWrittenCb(); if (m_EarlyMemoryUpdates && m_CurrentFrame == m_FrameRangeStart) WriteAllMemoryUpdates(); WriteFrame(m_File->GetFrame(m_CurrentFrame), m_FrameInfo[m_CurrentFrame]); ++m_CurrentFrame; return CPU::CPU_RUNNING; }