Fifo: Create a "Fifo" namespace.
This commit is contained in:
parent
c3481a576b
commit
5f244abf28
|
@ -264,7 +264,7 @@ void Stop() // - Hammertime!
|
||||||
|
|
||||||
s_is_stopping = true;
|
s_is_stopping = true;
|
||||||
|
|
||||||
EmulatorState(false);
|
Fifo::EmulatorState(false);
|
||||||
|
|
||||||
INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutting down ----");
|
INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutting down ----");
|
||||||
|
|
||||||
|
@ -536,7 +536,7 @@ void EmuThread()
|
||||||
s_cpu_thread = std::thread(cpuThreadFunc);
|
s_cpu_thread = std::thread(cpuThreadFunc);
|
||||||
|
|
||||||
// become the GPU thread
|
// become the GPU thread
|
||||||
RunGpuLoop();
|
Fifo::RunGpuLoop();
|
||||||
|
|
||||||
// We have now exited the Video Loop
|
// We have now exited the Video Loop
|
||||||
INFO_LOG(CONSOLE, "%s", StopMessage(false, "Video Loop Ended").c_str());
|
INFO_LOG(CONSOLE, "%s", StopMessage(false, "Video Loop Ended").c_str());
|
||||||
|
@ -738,7 +738,7 @@ bool PauseAndLock(bool doLock, bool unpauseOnUnlock)
|
||||||
DSP::GetDSPEmulator()->PauseAndLock(doLock, unpauseOnUnlock);
|
DSP::GetDSPEmulator()->PauseAndLock(doLock, unpauseOnUnlock);
|
||||||
|
|
||||||
// video has to come after CPU, because CPU thread can wait for video thread (s_efbAccessRequested).
|
// video has to come after CPU, because CPU thread can wait for video thread (s_efbAccessRequested).
|
||||||
Fifo_PauseAndLock(doLock, unpauseOnUnlock);
|
Fifo::PauseAndLock(doLock, unpauseOnUnlock);
|
||||||
|
|
||||||
#if defined(__LIBUSB__) || defined(_WIN32)
|
#if defined(__LIBUSB__) || defined(_WIN32)
|
||||||
GCAdapter::ResetRumble();
|
GCAdapter::ResetRumble();
|
||||||
|
@ -890,7 +890,7 @@ void UpdateWantDeterminism(bool initial)
|
||||||
|
|
||||||
g_want_determinism = new_want_determinism;
|
g_want_determinism = new_want_determinism;
|
||||||
WiiSockMan::GetInstance().UpdateWantDeterminism(new_want_determinism);
|
WiiSockMan::GetInstance().UpdateWantDeterminism(new_want_determinism);
|
||||||
Fifo_UpdateWantDeterminism(new_want_determinism);
|
Fifo::UpdateWantDeterminism(new_want_determinism);
|
||||||
// We need to clear the cache because some parts of the JIT depend on want_determinism, e.g. use of FMA.
|
// We need to clear the cache because some parts of the JIT depend on want_determinism, e.g. use of FMA.
|
||||||
JitInterface::ClearCache();
|
JitInterface::ClearCache();
|
||||||
Common::InitializeWiiRoot(g_want_determinism);
|
Common::InitializeWiiRoot(g_want_determinism);
|
||||||
|
|
|
@ -446,7 +446,7 @@ void Idle()
|
||||||
//the VI will be desynchronized. So, We are waiting until the FIFO finish and
|
//the VI will be desynchronized. So, We are waiting until the FIFO finish and
|
||||||
//while we process only the events required by the FIFO.
|
//while we process only the events required by the FIFO.
|
||||||
ProcessFifoWaitEvents();
|
ProcessFifoWaitEvents();
|
||||||
Fifo_Update(0);
|
Fifo::Update(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
idledCycles += DowncountToCycles(PowerPC::ppcState.downcount);
|
idledCycles += DowncountToCycles(PowerPC::ppcState.downcount);
|
||||||
|
|
|
@ -115,7 +115,7 @@ void EnableStepping(const bool stepping)
|
||||||
{
|
{
|
||||||
PowerPC::Pause();
|
PowerPC::Pause();
|
||||||
m_StepEvent.Reset();
|
m_StepEvent.Reset();
|
||||||
EmulatorState(false);
|
Fifo::EmulatorState(false);
|
||||||
AudioCommon::ClearAudioBuffer(true);
|
AudioCommon::ClearAudioBuffer(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -138,7 +138,7 @@ void EnableStepping(const bool stepping)
|
||||||
}
|
}
|
||||||
PowerPC::Start();
|
PowerPC::Start();
|
||||||
m_StepEvent.Set();
|
m_StepEvent.Set();
|
||||||
EmulatorState(true);
|
Fifo::EmulatorState(true);
|
||||||
AudioCommon::ClearAudioBuffer(false);
|
AudioCommon::ClearAudioBuffer(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,7 @@ static void VICallback(u64 userdata, int cyclesLate)
|
||||||
static void CPCallback(u64 userdata, int cyclesLate)
|
static void CPCallback(u64 userdata, int cyclesLate)
|
||||||
{
|
{
|
||||||
u64 now = CoreTiming::GetTicks();
|
u64 now = CoreTiming::GetTicks();
|
||||||
int next = Fifo_Update((int)(now - s_last_sync_gpu_tick));
|
int next = Fifo::Update((int)(now - s_last_sync_gpu_tick));
|
||||||
s_last_sync_gpu_tick = now;
|
s_last_sync_gpu_tick = now;
|
||||||
|
|
||||||
if (next > 0)
|
if (next > 0)
|
||||||
|
@ -181,7 +181,7 @@ static void PatchEngineCallback(u64 userdata, int cyclesLate)
|
||||||
static void ThrottleCallback(u64 last_time, int cyclesLate)
|
static void ThrottleCallback(u64 last_time, int cyclesLate)
|
||||||
{
|
{
|
||||||
// Allow the GPU thread to sleep. Setting this flag here limits the wakeups to 1 kHz.
|
// Allow the GPU thread to sleep. Setting this flag here limits the wakeups to 1 kHz.
|
||||||
GpuMaySleep();
|
Fifo::GpuMaySleep();
|
||||||
|
|
||||||
u32 time = Common::Timer::GetTimeMs();
|
u32 time = Common::Timer::GetTimeMs();
|
||||||
|
|
||||||
|
|
|
@ -241,7 +241,7 @@ void SetFrameSkipping(unsigned int framesToSkip)
|
||||||
// Don't forget to re-enable rendering in case it wasn't...
|
// Don't forget to re-enable rendering in case it wasn't...
|
||||||
// as this won't be changed anymore when frameskip is turned off
|
// as this won't be changed anymore when frameskip is turned off
|
||||||
if (framesToSkip == 0)
|
if (framesToSkip == 0)
|
||||||
Fifo_SetRendering(true);
|
Fifo::SetRendering(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetPolledDevice()
|
void SetPolledDevice()
|
||||||
|
@ -289,7 +289,7 @@ void FrameSkipping()
|
||||||
if (s_frameSkipCounter > s_framesToSkip || Core::ShouldSkipFrame(s_frameSkipCounter) == false)
|
if (s_frameSkipCounter > s_framesToSkip || Core::ShouldSkipFrame(s_frameSkipCounter) == false)
|
||||||
s_frameSkipCounter = 0;
|
s_frameSkipCounter = 0;
|
||||||
|
|
||||||
Fifo_SetRendering(!s_frameSkipCounter);
|
Fifo::SetRendering(!s_frameSkipCounter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -718,7 +718,7 @@ void formatBufferDump(const u8* in, u8* out, int w, int h, int p)
|
||||||
// This function has the final picture. We adjust the aspect ratio here.
|
// This function has the final picture. We adjust the aspect ratio here.
|
||||||
void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc, float Gamma)
|
void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc, float Gamma)
|
||||||
{
|
{
|
||||||
if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
if (Fifo::g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
||||||
{
|
{
|
||||||
if (SConfig::GetInstance().m_DumpFrames && !frame_data.empty())
|
if (SConfig::GetInstance().m_DumpFrames && !frame_data.empty())
|
||||||
AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight);
|
AVIDump::AddFrame(&frame_data[0], fbWidth, fbHeight);
|
||||||
|
|
|
@ -183,7 +183,7 @@ void VideoBackend::Video_Prepare()
|
||||||
|
|
||||||
// VideoCommon
|
// VideoCommon
|
||||||
BPInit();
|
BPInit();
|
||||||
Fifo_Init();
|
Fifo::Init();
|
||||||
IndexGenerator::Init();
|
IndexGenerator::Init();
|
||||||
VertexLoaderManager::Init();
|
VertexLoaderManager::Init();
|
||||||
OpcodeDecoder_Init();
|
OpcodeDecoder_Init();
|
||||||
|
@ -206,7 +206,7 @@ void VideoBackend::Shutdown()
|
||||||
if (g_renderer)
|
if (g_renderer)
|
||||||
{
|
{
|
||||||
// VideoCommon
|
// VideoCommon
|
||||||
Fifo_Shutdown();
|
Fifo::Shutdown();
|
||||||
CommandProcessor::Shutdown();
|
CommandProcessor::Shutdown();
|
||||||
GeometryShaderManager::Shutdown();
|
GeometryShaderManager::Shutdown();
|
||||||
PixelShaderManager::Shutdown();
|
PixelShaderManager::Shutdown();
|
||||||
|
|
|
@ -1235,7 +1235,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||||
}
|
}
|
||||||
|
|
||||||
static int w = 0, h = 0;
|
static int w = 0, h = 0;
|
||||||
if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
if (Fifo::g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
|
||||||
{
|
{
|
||||||
DumpFrame(frame_data, w, h);
|
DumpFrame(frame_data, w, h);
|
||||||
Core::Callback_VideoCopiedToXFB(false);
|
Core::Callback_VideoCopiedToXFB(false);
|
||||||
|
|
|
@ -181,7 +181,7 @@ void VideoBackend::Video_Prepare()
|
||||||
BPInit();
|
BPInit();
|
||||||
g_vertex_manager = std::make_unique<VertexManager>();
|
g_vertex_manager = std::make_unique<VertexManager>();
|
||||||
g_perf_query = GetPerfQuery();
|
g_perf_query = GetPerfQuery();
|
||||||
Fifo_Init(); // must be done before OpcodeDecoder_Init()
|
Fifo::Init(); // must be done before OpcodeDecoder_Init()
|
||||||
OpcodeDecoder_Init();
|
OpcodeDecoder_Init();
|
||||||
IndexGenerator::Init();
|
IndexGenerator::Init();
|
||||||
VertexShaderManager::Init();
|
VertexShaderManager::Init();
|
||||||
|
@ -215,7 +215,7 @@ void VideoBackend::Video_Cleanup()
|
||||||
if (!g_renderer)
|
if (!g_renderer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Fifo_Shutdown();
|
Fifo::Shutdown();
|
||||||
|
|
||||||
// The following calls are NOT Thread Safe
|
// The following calls are NOT Thread Safe
|
||||||
// And need to be called from the video thread
|
// And need to be called from the video thread
|
||||||
|
|
|
@ -191,7 +191,7 @@ void CopyTempBuffer(s16 x, s16 y, int bufferBase, int subBuffer, const char *nam
|
||||||
|
|
||||||
void OnObjectBegin()
|
void OnObjectBegin()
|
||||||
{
|
{
|
||||||
if (!g_bSkipCurrentFrame)
|
if (!Fifo::g_bSkipCurrentFrame)
|
||||||
{
|
{
|
||||||
if (g_ActiveConfig.bDumpTextures && stats.thisFrame.numDrawnObjects >= g_ActiveConfig.drawStart && stats.thisFrame.numDrawnObjects < g_ActiveConfig.drawEnd)
|
if (g_ActiveConfig.bDumpTextures && stats.thisFrame.numDrawnObjects >= g_ActiveConfig.drawStart && stats.thisFrame.numDrawnObjects < g_ActiveConfig.drawEnd)
|
||||||
DumpActiveTextures();
|
DumpActiveTextures();
|
||||||
|
@ -200,7 +200,7 @@ void OnObjectBegin()
|
||||||
|
|
||||||
void OnObjectEnd()
|
void OnObjectEnd()
|
||||||
{
|
{
|
||||||
if (!g_bSkipCurrentFrame)
|
if (!Fifo::g_bSkipCurrentFrame)
|
||||||
{
|
{
|
||||||
if (g_ActiveConfig.bDumpObjects && stats.thisFrame.numDrawnObjects >= g_ActiveConfig.drawStart && stats.thisFrame.numDrawnObjects < g_ActiveConfig.drawEnd)
|
if (g_ActiveConfig.bDumpObjects && stats.thisFrame.numDrawnObjects >= g_ActiveConfig.drawStart && stats.thisFrame.numDrawnObjects < g_ActiveConfig.drawEnd)
|
||||||
DumpEfb(StringFromFormat("%sobject%i.png",
|
DumpEfb(StringFromFormat("%sobject%i.png",
|
||||||
|
|
|
@ -73,7 +73,7 @@ namespace EfbCopy
|
||||||
rc.right = rc.left + (int)bpmem.copyTexSrcWH.x + 1;
|
rc.right = rc.left + (int)bpmem.copyTexSrcWH.x + 1;
|
||||||
rc.bottom = rc.top + (int)bpmem.copyTexSrcWH.y + 1;
|
rc.bottom = rc.top + (int)bpmem.copyTexSrcWH.y + 1;
|
||||||
|
|
||||||
if (!g_bSkipCurrentFrame)
|
if (!Fifo::g_bSkipCurrentFrame)
|
||||||
{
|
{
|
||||||
if (bpmem.triggerEFBCopy.copy_to_xfb)
|
if (bpmem.triggerEFBCopy.copy_to_xfb)
|
||||||
{
|
{
|
||||||
|
|
|
@ -108,7 +108,7 @@ void SWRenderer::UpdateColorTexture(EfbInterface::yuv422_packed *xfb, u32 fbWidt
|
||||||
// Called on the GPU thread
|
// Called on the GPU thread
|
||||||
void SWRenderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc, float Gamma)
|
void SWRenderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc, float Gamma)
|
||||||
{
|
{
|
||||||
if (!g_bSkipCurrentFrame)
|
if (!Fifo::g_bSkipCurrentFrame)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (g_ActiveConfig.bUseXFB)
|
if (g_ActiveConfig.bUseXFB)
|
||||||
|
|
|
@ -198,8 +198,7 @@ void VideoSoftware::Video_Cleanup()
|
||||||
{
|
{
|
||||||
if (g_renderer)
|
if (g_renderer)
|
||||||
{
|
{
|
||||||
Fifo_Shutdown();
|
Fifo::Shutdown();
|
||||||
|
|
||||||
SWRenderer::Shutdown();
|
SWRenderer::Shutdown();
|
||||||
DebugUtil::Shutdown();
|
DebugUtil::Shutdown();
|
||||||
// The following calls are NOT Thread Safe
|
// The following calls are NOT Thread Safe
|
||||||
|
@ -228,7 +227,7 @@ void VideoSoftware::Video_Prepare()
|
||||||
BPInit();
|
BPInit();
|
||||||
g_vertex_manager = std::make_unique<SWVertexLoader>();
|
g_vertex_manager = std::make_unique<SWVertexLoader>();
|
||||||
g_perf_query = std::make_unique<PerfQuery>();
|
g_perf_query = std::make_unique<PerfQuery>();
|
||||||
Fifo_Init(); // must be done before OpcodeDecoder_Init()
|
Fifo::Init(); // must be done before OpcodeDecoder_Init()
|
||||||
OpcodeDecoder_Init();
|
OpcodeDecoder_Init();
|
||||||
IndexGenerator::Init();
|
IndexGenerator::Init();
|
||||||
VertexShaderManager::Init();
|
VertexShaderManager::Init();
|
||||||
|
|
|
@ -81,7 +81,7 @@ void AsyncRequests::PushEvent(const AsyncRequests::Event& event, bool blocking)
|
||||||
|
|
||||||
m_queue.push(event);
|
m_queue.push(event);
|
||||||
|
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
if (blocking)
|
if (blocking)
|
||||||
{
|
{
|
||||||
m_cond.wait(lock, [this]{return m_queue.empty();});
|
m_cond.wait(lock, [this]{return m_queue.empty();});
|
||||||
|
|
|
@ -177,7 +177,7 @@ static void BPWritten(const BPCmd& bp)
|
||||||
switch (bp.newvalue & 0xFF)
|
switch (bp.newvalue & 0xFF)
|
||||||
{
|
{
|
||||||
case 0x02:
|
case 0x02:
|
||||||
if (!g_use_deterministic_gpu_thread)
|
if (!Fifo::g_use_deterministic_gpu_thread)
|
||||||
PixelEngine::SetFinish(); // may generate interrupt
|
PixelEngine::SetFinish(); // may generate interrupt
|
||||||
DEBUG_LOG(VIDEO, "GXSetDrawDone SetPEFinish (value: 0x%02X)", (bp.newvalue & 0xFFFF));
|
DEBUG_LOG(VIDEO, "GXSetDrawDone SetPEFinish (value: 0x%02X)", (bp.newvalue & 0xFFFF));
|
||||||
return;
|
return;
|
||||||
|
@ -188,12 +188,12 @@ static void BPWritten(const BPCmd& bp)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case BPMEM_PE_TOKEN_ID: // Pixel Engine Token ID
|
case BPMEM_PE_TOKEN_ID: // Pixel Engine Token ID
|
||||||
if (!g_use_deterministic_gpu_thread)
|
if (!Fifo::g_use_deterministic_gpu_thread)
|
||||||
PixelEngine::SetToken(static_cast<u16>(bp.newvalue & 0xFFFF), false);
|
PixelEngine::SetToken(static_cast<u16>(bp.newvalue & 0xFFFF), false);
|
||||||
DEBUG_LOG(VIDEO, "SetPEToken 0x%04x", (bp.newvalue & 0xFFFF));
|
DEBUG_LOG(VIDEO, "SetPEToken 0x%04x", (bp.newvalue & 0xFFFF));
|
||||||
return;
|
return;
|
||||||
case BPMEM_PE_TOKEN_INT_ID: // Pixel Engine Interrupt Token ID
|
case BPMEM_PE_TOKEN_INT_ID: // Pixel Engine Interrupt Token ID
|
||||||
if (!g_use_deterministic_gpu_thread)
|
if (!Fifo::g_use_deterministic_gpu_thread)
|
||||||
PixelEngine::SetToken(static_cast<u16>(bp.newvalue & 0xFFFF), true);
|
PixelEngine::SetToken(static_cast<u16>(bp.newvalue & 0xFFFF), true);
|
||||||
DEBUG_LOG(VIDEO, "SetPEToken + INT 0x%04x", (bp.newvalue & 0xFFFF));
|
DEBUG_LOG(VIDEO, "SetPEToken + INT 0x%04x", (bp.newvalue & 0xFFFF));
|
||||||
return;
|
return;
|
||||||
|
@ -378,7 +378,7 @@ static void BPWritten(const BPCmd& bp)
|
||||||
case BPMEM_CLEARBBOX2:
|
case BPMEM_CLEARBBOX2:
|
||||||
// Don't compute bounding box if this frame is being skipped!
|
// Don't compute bounding box if this frame is being skipped!
|
||||||
// Wrong but valid values are better than bogus values...
|
// Wrong but valid values are better than bogus values...
|
||||||
if (!g_bSkipCurrentFrame)
|
if (!Fifo::g_bSkipCurrentFrame)
|
||||||
{
|
{
|
||||||
u8 offset = bp.address & 2;
|
u8 offset = bp.address & 2;
|
||||||
BoundingBox::active = true;
|
BoundingBox::active = true;
|
||||||
|
|
|
@ -223,7 +223,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
UCPCtrlReg tmp(val);
|
UCPCtrlReg tmp(val);
|
||||||
m_CPCtrlReg.Hex = tmp.Hex;
|
m_CPCtrlReg.Hex = tmp.Hex;
|
||||||
SetCpControlRegister();
|
SetCpControlRegister();
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
UCPClearReg tmp(val);
|
UCPClearReg tmp(val);
|
||||||
m_CPClearReg.Hex = tmp.Hex;
|
m_CPClearReg.Hex = tmp.Hex;
|
||||||
SetCpClearRegister();
|
SetCpClearRegister();
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -265,17 +265,17 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
: MMIO::DirectRead<u16>(MMIO::Utils::HighPart(&fifo.CPReadWriteDistance)),
|
: MMIO::DirectRead<u16>(MMIO::Utils::HighPart(&fifo.CPReadWriteDistance)),
|
||||||
MMIO::ComplexWrite<u16>([](u32, u16 val) {
|
MMIO::ComplexWrite<u16>([](u32, u16 val) {
|
||||||
WriteHigh(fifo.CPReadWriteDistance, val);
|
WriteHigh(fifo.CPReadWriteDistance, val);
|
||||||
SyncGPU(SYNC_GPU_OTHER);
|
Fifo::SyncGPU(Fifo::SYNC_GPU_OTHER);
|
||||||
if (fifo.CPReadWriteDistance == 0)
|
if (fifo.CPReadWriteDistance == 0)
|
||||||
{
|
{
|
||||||
GPFifo::ResetGatherPipe();
|
GPFifo::ResetGatherPipe();
|
||||||
ResetVideoBuffer();
|
Fifo::ResetVideoBuffer();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ResetVideoBuffer();
|
Fifo::ResetVideoBuffer();
|
||||||
}
|
}
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
mmio->Register(base | FIFO_READ_POINTER_LO,
|
mmio->Register(base | FIFO_READ_POINTER_LO,
|
||||||
|
@ -306,7 +306,7 @@ void GatherPipeBursted()
|
||||||
// if we aren't linked, we don't care about gather pipe data
|
// if we aren't linked, we don't care about gather pipe data
|
||||||
if (!m_CPCtrlReg.GPLinkEnable)
|
if (!m_CPCtrlReg.GPLinkEnable)
|
||||||
{
|
{
|
||||||
if (IsOnThread() && !g_use_deterministic_gpu_thread)
|
if (IsOnThread() && !Fifo::g_use_deterministic_gpu_thread)
|
||||||
{
|
{
|
||||||
// In multibuffer mode is not allowed write in the same FIFO attached to the GPU.
|
// In multibuffer mode is not allowed write in the same FIFO attached to the GPU.
|
||||||
// Fix Pokemon XD in DC mode.
|
// Fix Pokemon XD in DC mode.
|
||||||
|
@ -314,10 +314,10 @@ void GatherPipeBursted()
|
||||||
(ProcessorInterface::Fifo_CPUBase == fifo.CPBase) &&
|
(ProcessorInterface::Fifo_CPUBase == fifo.CPBase) &&
|
||||||
fifo.CPReadWriteDistance > 0)
|
fifo.CPReadWriteDistance > 0)
|
||||||
{
|
{
|
||||||
FlushGpu();
|
Fifo::FlushGpu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +340,7 @@ void GatherPipeBursted()
|
||||||
|
|
||||||
Common::AtomicAdd(fifo.CPReadWriteDistance, GATHER_PIPE_SIZE);
|
Common::AtomicAdd(fifo.CPReadWriteDistance, GATHER_PIPE_SIZE);
|
||||||
|
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
|
|
||||||
_assert_msg_(COMMANDPROCESSOR, fifo.CPReadWriteDistance <= fifo.CPEnd - fifo.CPBase,
|
_assert_msg_(COMMANDPROCESSOR, fifo.CPReadWriteDistance <= fifo.CPEnd - fifo.CPBase,
|
||||||
"FIFO is overflowed by GatherPipe !\nCPU thread is too fast!");
|
"FIFO is overflowed by GatherPipe !\nCPU thread is too fast!");
|
||||||
|
@ -367,12 +367,12 @@ void UpdateInterrupts(u64 userdata)
|
||||||
}
|
}
|
||||||
CoreTiming::ForceExceptionCheck(0);
|
CoreTiming::ForceExceptionCheck(0);
|
||||||
s_interrupt_waiting.store(false);
|
s_interrupt_waiting.store(false);
|
||||||
RunGpu();
|
Fifo::RunGpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateInterruptsFromVideoBackend(u64 userdata)
|
void UpdateInterruptsFromVideoBackend(u64 userdata)
|
||||||
{
|
{
|
||||||
if (!g_use_deterministic_gpu_thread)
|
if (!Fifo::g_use_deterministic_gpu_thread)
|
||||||
CoreTiming::ScheduleEvent_Threadsafe(0, et_UpdateInterrupts, userdata);
|
CoreTiming::ScheduleEvent_Threadsafe(0, et_UpdateInterrupts, userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,7 +494,7 @@ void SetCpStatusRegister()
|
||||||
// Here always there is one fifo attached to the GPU
|
// Here always there is one fifo attached to the GPU
|
||||||
m_CPStatusReg.Breakpoint = fifo.bFF_Breakpoint;
|
m_CPStatusReg.Breakpoint = fifo.bFF_Breakpoint;
|
||||||
m_CPStatusReg.ReadIdle = !fifo.CPReadWriteDistance || (fifo.CPReadPointer == fifo.CPWritePointer);
|
m_CPStatusReg.ReadIdle = !fifo.CPReadWriteDistance || (fifo.CPReadPointer == fifo.CPWritePointer);
|
||||||
m_CPStatusReg.CommandIdle = !fifo.CPReadWriteDistance || AtBreakpoint() || !fifo.bFF_GPReadEnable;
|
m_CPStatusReg.CommandIdle = !fifo.CPReadWriteDistance || Fifo::AtBreakpoint() || !fifo.bFF_GPReadEnable;
|
||||||
m_CPStatusReg.UnderflowLoWatermark = fifo.bFF_LoWatermark;
|
m_CPStatusReg.UnderflowLoWatermark = fifo.bFF_LoWatermark;
|
||||||
m_CPStatusReg.OverflowHiWatermark = fifo.bFF_HiWatermark;
|
m_CPStatusReg.OverflowHiWatermark = fifo.bFF_HiWatermark;
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ void SetCpControlRegister()
|
||||||
if (fifo.bFF_GPReadEnable && !m_CPCtrlReg.GPReadEnable)
|
if (fifo.bFF_GPReadEnable && !m_CPCtrlReg.GPReadEnable)
|
||||||
{
|
{
|
||||||
fifo.bFF_GPReadEnable = m_CPCtrlReg.GPReadEnable;
|
fifo.bFF_GPReadEnable = m_CPCtrlReg.GPReadEnable;
|
||||||
FlushGpu();
|
Fifo::FlushGpu();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
#include "VideoCommon/VertexManagerBase.h"
|
#include "VideoCommon/VertexManagerBase.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
|
||||||
|
namespace Fifo
|
||||||
|
{
|
||||||
|
|
||||||
static constexpr u32 FIFO_SIZE = 2 * 1024 * 1024;
|
static constexpr u32 FIFO_SIZE = 2 * 1024 * 1024;
|
||||||
|
|
||||||
bool g_bSkipCurrentFrame = false;
|
bool g_bSkipCurrentFrame = false;
|
||||||
|
@ -66,7 +69,7 @@ static u8* s_video_buffer_pp_read_ptr;
|
||||||
static std::atomic<int> s_sync_ticks;
|
static std::atomic<int> s_sync_ticks;
|
||||||
static Common::Event s_sync_wakeup_event;
|
static Common::Event s_sync_wakeup_event;
|
||||||
|
|
||||||
void Fifo_DoState(PointerWrap &p)
|
void DoState(PointerWrap &p)
|
||||||
{
|
{
|
||||||
p.DoArray(s_video_buffer, FIFO_SIZE);
|
p.DoArray(s_video_buffer, FIFO_SIZE);
|
||||||
u8* write_ptr = s_video_buffer_write_ptr;
|
u8* write_ptr = s_video_buffer_write_ptr;
|
||||||
|
@ -81,7 +84,7 @@ void Fifo_DoState(PointerWrap &p)
|
||||||
p.Do(g_bSkipCurrentFrame);
|
p.Do(g_bSkipCurrentFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fifo_PauseAndLock(bool doLock, bool unpauseOnUnlock)
|
void PauseAndLock(bool doLock, bool unpauseOnUnlock)
|
||||||
{
|
{
|
||||||
if (doLock)
|
if (doLock)
|
||||||
{
|
{
|
||||||
|
@ -97,7 +100,7 @@ void Fifo_PauseAndLock(bool doLock, bool unpauseOnUnlock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Fifo_Init()
|
void Init()
|
||||||
{
|
{
|
||||||
// Padded so that SIMD overreads in the vertex loader are safe
|
// Padded so that SIMD overreads in the vertex loader are safe
|
||||||
s_video_buffer = (u8*)AllocateMemoryPages(FIFO_SIZE + 4);
|
s_video_buffer = (u8*)AllocateMemoryPages(FIFO_SIZE + 4);
|
||||||
|
@ -107,7 +110,7 @@ void Fifo_Init()
|
||||||
s_sync_ticks.store(0);
|
s_sync_ticks.store(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fifo_Shutdown()
|
void Shutdown()
|
||||||
{
|
{
|
||||||
if (s_gpu_mainloop.IsRunning())
|
if (s_gpu_mainloop.IsRunning())
|
||||||
PanicAlert("Fifo shutting down while active");
|
PanicAlert("Fifo shutting down while active");
|
||||||
|
@ -122,7 +125,7 @@ void Fifo_Shutdown()
|
||||||
s_fifo_aux_read_ptr = nullptr;
|
s_fifo_aux_read_ptr = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fifo_SetRendering(bool enabled)
|
void SetRendering(bool enabled)
|
||||||
{
|
{
|
||||||
g_bSkipCurrentFrame = !enabled;
|
g_bSkipCurrentFrame = !enabled;
|
||||||
}
|
}
|
||||||
|
@ -450,7 +453,7 @@ void RunGpu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fifo_UpdateWantDeterminism(bool want)
|
void UpdateWantDeterminism(bool want)
|
||||||
{
|
{
|
||||||
// We are paused (or not running at all yet), so
|
// We are paused (or not running at all yet), so
|
||||||
// it should be safe to change this.
|
// it should be safe to change this.
|
||||||
|
@ -492,7 +495,7 @@ void Fifo_UpdateWantDeterminism(bool want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Fifo_Update(int ticks)
|
int Update(int ticks)
|
||||||
{
|
{
|
||||||
const SConfig& param = SConfig::GetInstance();
|
const SConfig& param = SConfig::GetInstance();
|
||||||
|
|
||||||
|
@ -528,3 +531,5 @@ int Fifo_Update(int ticks)
|
||||||
|
|
||||||
return param.iSyncGpuMaxDistance - s_sync_ticks.load();
|
return param.iSyncGpuMaxDistance - s_sync_ticks.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
class PointerWrap;
|
class PointerWrap;
|
||||||
|
|
||||||
|
namespace Fifo
|
||||||
|
{
|
||||||
|
|
||||||
extern bool g_bSkipCurrentFrame;
|
extern bool g_bSkipCurrentFrame;
|
||||||
|
|
||||||
// This could be in SConfig, but it depends on multiple settings
|
// This could be in SConfig, but it depends on multiple settings
|
||||||
|
@ -16,11 +19,11 @@ extern bool g_bSkipCurrentFrame;
|
||||||
extern bool g_use_deterministic_gpu_thread;
|
extern bool g_use_deterministic_gpu_thread;
|
||||||
extern std::atomic<u8*> g_video_buffer_write_ptr_xthread;
|
extern std::atomic<u8*> g_video_buffer_write_ptr_xthread;
|
||||||
|
|
||||||
void Fifo_Init();
|
void Init();
|
||||||
void Fifo_Shutdown();
|
void Shutdown();
|
||||||
void Fifo_DoState(PointerWrap &f);
|
void DoState(PointerWrap &f);
|
||||||
void Fifo_PauseAndLock(bool doLock, bool unpauseOnUnlock);
|
void PauseAndLock(bool doLock, bool unpauseOnUnlock);
|
||||||
void Fifo_UpdateWantDeterminism(bool want);
|
void UpdateWantDeterminism(bool want);
|
||||||
|
|
||||||
// Used for diagnostics.
|
// Used for diagnostics.
|
||||||
enum SyncGPUReason
|
enum SyncGPUReason
|
||||||
|
@ -47,5 +50,7 @@ void ExitGpuLoop();
|
||||||
void EmulatorState(bool running);
|
void EmulatorState(bool running);
|
||||||
bool AtBreakpoint();
|
bool AtBreakpoint();
|
||||||
void ResetVideoBuffer();
|
void ResetVideoBuffer();
|
||||||
void Fifo_SetRendering(bool bEnabled);
|
void SetRendering(bool bEnabled);
|
||||||
int Fifo_Update(int ticks);
|
int Update(int ticks);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
|
@ -31,7 +31,7 @@ static volatile struct
|
||||||
|
|
||||||
void VideoBackendBase::Video_ExitLoop()
|
void VideoBackendBase::Video_ExitLoop()
|
||||||
{
|
{
|
||||||
ExitGpuLoop();
|
Fifo::ExitGpuLoop();
|
||||||
s_FifoShuttingDown.Set();
|
s_FifoShuttingDown.Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ void VideoBackendBase::Video_EndField()
|
||||||
{
|
{
|
||||||
if (m_initialized && g_ActiveConfig.bUseXFB && g_renderer)
|
if (m_initialized && g_ActiveConfig.bUseXFB && g_renderer)
|
||||||
{
|
{
|
||||||
SyncGPU(SYNC_GPU_SWAP);
|
Fifo::SyncGPU(Fifo::SYNC_GPU_SWAP);
|
||||||
|
|
||||||
AsyncRequests::Event e;
|
AsyncRequests::Event e;
|
||||||
e.time = 0;
|
e.time = 0;
|
||||||
|
@ -105,7 +105,7 @@ u32 VideoBackendBase::Video_GetQueryResult(PerfQueryType type)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncGPU(SYNC_GPU_PERFQUERY);
|
Fifo::SyncGPU(Fifo::SYNC_GPU_PERFQUERY);
|
||||||
|
|
||||||
AsyncRequests::Event e;
|
AsyncRequests::Event e;
|
||||||
e.time = 0;
|
e.time = 0;
|
||||||
|
@ -131,7 +131,7 @@ u16 VideoBackendBase::Video_GetBoundingBox(int index)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncGPU(SYNC_GPU_BBOX);
|
Fifo::SyncGPU(Fifo::SYNC_GPU_BBOX);
|
||||||
|
|
||||||
AsyncRequests::Event e;
|
AsyncRequests::Event e;
|
||||||
u16 result;
|
u16 result;
|
||||||
|
|
|
@ -39,8 +39,8 @@ static u32 InterpretDisplayList(u32 address, u32 size)
|
||||||
{
|
{
|
||||||
u8* startAddress;
|
u8* startAddress;
|
||||||
|
|
||||||
if (g_use_deterministic_gpu_thread)
|
if (Fifo::g_use_deterministic_gpu_thread)
|
||||||
startAddress = (u8*)PopFifoAuxBuffer(size);
|
startAddress = (u8*)Fifo::PopFifoAuxBuffer(size);
|
||||||
else
|
else
|
||||||
startAddress = Memory::GetPointer(address);
|
startAddress = Memory::GetPointer(address);
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ static void InterpretDisplayListPreprocess(u32 address, u32 size)
|
||||||
{
|
{
|
||||||
u8* startAddress = Memory::GetPointer(address);
|
u8* startAddress = Memory::GetPointer(address);
|
||||||
|
|
||||||
PushFifoAuxBuffer(startAddress, size);
|
Fifo::PushFifoAuxBuffer(startAddress, size);
|
||||||
|
|
||||||
if (startAddress != nullptr)
|
if (startAddress != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -278,7 +278,7 @@ u8* OpcodeDecoder_Run(DataReader src, u32* cycles, bool in_display_list)
|
||||||
(cmd_byte & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT,
|
(cmd_byte & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT,
|
||||||
num_vertices,
|
num_vertices,
|
||||||
src,
|
src,
|
||||||
g_bSkipCurrentFrame,
|
Fifo::g_bSkipCurrentFrame,
|
||||||
is_preprocess);
|
is_preprocess);
|
||||||
|
|
||||||
if (bytes < 0)
|
if (bytes < 0)
|
||||||
|
|
|
@ -298,7 +298,7 @@ void SetToken(const u16 _token, const int _bSetTokenAcknowledge)
|
||||||
|
|
||||||
CommandProcessor::SetInterruptTokenWaiting(true);
|
CommandProcessor::SetInterruptTokenWaiting(true);
|
||||||
|
|
||||||
if (!SConfig::GetInstance().bCPUThread || g_use_deterministic_gpu_thread)
|
if (!SConfig::GetInstance().bCPUThread || Fifo::g_use_deterministic_gpu_thread)
|
||||||
CoreTiming::ScheduleEvent(0, et_SetTokenOnMainThread, _token | (_bSetTokenAcknowledge << 16));
|
CoreTiming::ScheduleEvent(0, et_SetTokenOnMainThread, _token | (_bSetTokenAcknowledge << 16));
|
||||||
else
|
else
|
||||||
CoreTiming::ScheduleEvent_Threadsafe(0, et_SetTokenOnMainThread, _token | (_bSetTokenAcknowledge << 16));
|
CoreTiming::ScheduleEvent_Threadsafe(0, et_SetTokenOnMainThread, _token | (_bSetTokenAcknowledge << 16));
|
||||||
|
@ -310,7 +310,7 @@ void SetFinish()
|
||||||
{
|
{
|
||||||
CommandProcessor::SetInterruptFinishWaiting(true);
|
CommandProcessor::SetInterruptFinishWaiting(true);
|
||||||
|
|
||||||
if (!SConfig::GetInstance().bCPUThread || g_use_deterministic_gpu_thread)
|
if (!SConfig::GetInstance().bCPUThread || Fifo::g_use_deterministic_gpu_thread)
|
||||||
CoreTiming::ScheduleEvent(0, et_SetFinishOnMainThread, 0);
|
CoreTiming::ScheduleEvent(0, et_SetFinishOnMainThread, 0);
|
||||||
else
|
else
|
||||||
CoreTiming::ScheduleEvent_Threadsafe(0, et_SetFinishOnMainThread, 0);
|
CoreTiming::ScheduleEvent_Threadsafe(0, et_SetFinishOnMainThread, 0);
|
||||||
|
|
|
@ -35,7 +35,7 @@ static void DoState(PointerWrap &p)
|
||||||
p.DoMarker("texMem");
|
p.DoMarker("texMem");
|
||||||
|
|
||||||
// FIFO
|
// FIFO
|
||||||
Fifo_DoState(p);
|
Fifo::DoState(p);
|
||||||
p.DoMarker("Fifo");
|
p.DoMarker("Fifo");
|
||||||
|
|
||||||
CommandProcessor::DoState(p);
|
CommandProcessor::DoState(p);
|
||||||
|
@ -71,7 +71,7 @@ void VideoCommon_DoState(PointerWrap &p)
|
||||||
|
|
||||||
void VideoCommon_RunLoop(bool enable)
|
void VideoCommon_RunLoop(bool enable)
|
||||||
{
|
{
|
||||||
EmulatorState(enable);
|
Fifo::EmulatorState(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoCommon_Init()
|
void VideoCommon_Init()
|
||||||
|
|
|
@ -258,9 +258,9 @@ void LoadIndexedXF(u32 val, int refarray)
|
||||||
|
|
||||||
u32* currData = (u32*)(&xfmem) + address;
|
u32* currData = (u32*)(&xfmem) + address;
|
||||||
u32* newData;
|
u32* newData;
|
||||||
if (g_use_deterministic_gpu_thread)
|
if (Fifo::g_use_deterministic_gpu_thread)
|
||||||
{
|
{
|
||||||
newData = (u32*)PopFifoAuxBuffer(size * sizeof(u32));
|
newData = (u32*)Fifo::PopFifoAuxBuffer(size * sizeof(u32));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -291,5 +291,5 @@ void PreprocessIndexedXF(u32 val, int refarray)
|
||||||
u32* new_data = (u32*)Memory::GetPointer(g_preprocess_cp_state.array_bases[refarray] + g_preprocess_cp_state.array_strides[refarray] * index);
|
u32* new_data = (u32*)Memory::GetPointer(g_preprocess_cp_state.array_bases[refarray] + g_preprocess_cp_state.array_strides[refarray] * index);
|
||||||
|
|
||||||
size_t buf_size = size * sizeof(u32);
|
size_t buf_size = size * sizeof(u32);
|
||||||
PushFifoAuxBuffer(new_data, buf_size);
|
Fifo::PushFifoAuxBuffer(new_data, buf_size);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue