summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/MainBase.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-12-07 15:14:29 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2013-12-31 14:03:19 -0500
commit34692ab826abc8f8faa61bdb2280b742424528f1 (patch)
treeb0eedc645badbea316ff59c125eaf808b28777ec /Source/Core/VideoCommon/MainBase.cpp
parent43e618682e8093602fc83dfa902ee7ae3fd3a4f6 (diff)
Remove unnecessary Src/ folders
Diffstat (limited to 'Source/Core/VideoCommon/MainBase.cpp')
-rw-r--r--Source/Core/VideoCommon/MainBase.cpp329
1 files changed, 329 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/MainBase.cpp b/Source/Core/VideoCommon/MainBase.cpp
new file mode 100644
index 0000000000..320f2d6752
--- /dev/null
+++ b/Source/Core/VideoCommon/MainBase.cpp
@@ -0,0 +1,329 @@
+
+#include "MainBase.h"
+#include "VideoState.h"
+#include "VideoConfig.h"
+#include "RenderBase.h"
+#include "FramebufferManagerBase.h"
+#include "TextureCacheBase.h"
+#include "VertexLoaderManager.h"
+#include "CommandProcessor.h"
+#include "PixelEngine.h"
+#include "Atomic.h"
+#include "Fifo.h"
+#include "BPStructs.h"
+#include "OnScreenDisplay.h"
+#include "VideoBackendBase.h"
+#include "ConfigManager.h"
+
+bool s_BackendInitialized = false;
+
+volatile u32 s_swapRequested = false;
+u32 s_efbAccessRequested = false;
+volatile u32 s_FifoShuttingDown = false;
+
+std::condition_variable s_perf_query_cond;
+std::mutex s_perf_query_lock;
+static volatile bool s_perf_query_requested;
+
+static volatile struct
+{
+ u32 xfbAddr;
+ u32 fbWidth;
+ u32 fbHeight;
+} s_beginFieldArgs;
+
+static struct
+{
+ EFBAccessType type;
+ u32 x;
+ u32 y;
+ u32 Data;
+} s_accessEFBArgs;
+
+static u32 s_AccessEFBResult = 0;
+
+void VideoBackendHardware::EmuStateChange(EMUSTATE_CHANGE newState)
+{
+ EmulatorState((newState == EMUSTATE_CHANGE_PLAY) ? true : false);
+}
+
+// Enter and exit the video loop
+void VideoBackendHardware::Video_EnterLoop()
+{
+ RunGpuLoop();
+}
+
+void VideoBackendHardware::Video_ExitLoop()
+{
+ ExitGpuLoop();
+ s_FifoShuttingDown = true;
+}
+
+void VideoBackendHardware::Video_SetRendering(bool bEnabled)
+{
+ Fifo_SetRendering(bEnabled);
+}
+
+// Run from the graphics thread (from Fifo.cpp)
+void VideoFifo_CheckSwapRequest()
+{
+ if(g_ActiveConfig.bUseXFB)
+ {
+ if (Common::AtomicLoadAcquire(s_swapRequested))
+ {
+ EFBRectangle rc;
+ g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc);
+ Common::AtomicStoreRelease(s_swapRequested, false);
+ }
+ }
+}
+
+// Run from the graphics thread (from Fifo.cpp)
+void VideoFifo_CheckSwapRequestAt(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
+{
+ if (g_ActiveConfig.bUseXFB)
+ {
+ if(Common::AtomicLoadAcquire(s_swapRequested))
+ {
+ u32 aLower = xfbAddr;
+ u32 aUpper = xfbAddr + 2 * fbWidth * fbHeight;
+ u32 bLower = s_beginFieldArgs.xfbAddr;
+ u32 bUpper = s_beginFieldArgs.xfbAddr + 2 * s_beginFieldArgs.fbWidth * s_beginFieldArgs.fbHeight;
+
+ if (addrRangesOverlap(aLower, aUpper, bLower, bUpper))
+ VideoFifo_CheckSwapRequest();
+ }
+ }
+}
+
+// Run from the CPU thread (from VideoInterface.cpp)
+void VideoBackendHardware::Video_BeginField(u32 xfbAddr, u32 fbWidth, u32 fbHeight)
+{
+ if (s_BackendInitialized && g_ActiveConfig.bUseXFB)
+ {
+ if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
+ VideoFifo_CheckSwapRequest();
+ s_beginFieldArgs.xfbAddr = xfbAddr;
+ s_beginFieldArgs.fbWidth = fbWidth;
+ s_beginFieldArgs.fbHeight = fbHeight;
+ }
+}
+
+// Run from the CPU thread (from VideoInterface.cpp)
+void VideoBackendHardware::Video_EndField()
+{
+ if (s_BackendInitialized)
+ {
+ Common::AtomicStoreRelease(s_swapRequested, true);
+ }
+}
+
+void VideoBackendHardware::Video_AddMessage(const char* pstr, u32 milliseconds)
+{
+ OSD::AddMessage(pstr, milliseconds);
+}
+
+void VideoBackendHardware::Video_ClearMessages()
+{
+ OSD::ClearMessages();
+}
+
+// Screenshot
+bool VideoBackendHardware::Video_Screenshot(const char *_szFilename)
+{
+ Renderer::SetScreenshot(_szFilename);
+ return true;
+}
+
+void VideoFifo_CheckEFBAccess()
+{
+ if (Common::AtomicLoadAcquire(s_efbAccessRequested))
+ {
+ s_AccessEFBResult = g_renderer->AccessEFB(s_accessEFBArgs.type, s_accessEFBArgs.x, s_accessEFBArgs.y, s_accessEFBArgs.Data);
+
+ Common::AtomicStoreRelease(s_efbAccessRequested, false);
+ }
+}
+
+u32 VideoBackendHardware::Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData)
+{
+ if (s_BackendInitialized)
+ {
+ s_accessEFBArgs.type = type;
+ s_accessEFBArgs.x = x;
+ s_accessEFBArgs.y = y;
+ s_accessEFBArgs.Data = InputData;
+
+ Common::AtomicStoreRelease(s_efbAccessRequested, true);
+
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
+ {
+ while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
+ //Common::SleepCurrentThread(1);
+ Common::YieldCPU();
+ }
+ else
+ VideoFifo_CheckEFBAccess();
+
+ return s_AccessEFBResult;
+ }
+
+ return 0;
+}
+
+static bool QueryResultIsReady()
+{
+ return !s_perf_query_requested || s_FifoShuttingDown;
+}
+
+void VideoFifo_CheckPerfQueryRequest()
+{
+ if (s_perf_query_requested)
+ {
+ g_perf_query->FlushResults();
+
+ {
+ std::lock_guard<std::mutex> lk(s_perf_query_lock);
+ s_perf_query_requested = false;
+ }
+
+ s_perf_query_cond.notify_one();
+ }
+}
+
+u32 VideoBackendHardware::Video_GetQueryResult(PerfQueryType type)
+{
+ // TODO: Is this check sane?
+ if (!g_perf_query->IsFlushed())
+ {
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
+ {
+ s_perf_query_requested = true;
+ std::unique_lock<std::mutex> lk(s_perf_query_lock);
+ s_perf_query_cond.wait(lk, QueryResultIsReady);
+ }
+ else
+ g_perf_query->FlushResults();
+ }
+
+ return g_perf_query->GetQueryResult(type);
+}
+
+void VideoBackendHardware::InitializeShared()
+{
+ VideoCommon_Init();
+
+ s_swapRequested = 0;
+ s_efbAccessRequested = 0;
+ s_perf_query_requested = false;
+ s_FifoShuttingDown = 0;
+ memset((void*)&s_beginFieldArgs, 0, sizeof(s_beginFieldArgs));
+ memset(&s_accessEFBArgs, 0, sizeof(s_accessEFBArgs));
+ s_AccessEFBResult = 0;
+ m_invalid = false;
+}
+
+// Run from the CPU thread
+void VideoBackendHardware::DoState(PointerWrap& p)
+{
+ bool software = false;
+ p.Do(software);
+
+ if (p.GetMode() == PointerWrap::MODE_READ && software == true)
+ {
+ // change mode to abort load of incompatible save state.
+ p.SetMode(PointerWrap::MODE_VERIFY);
+ }
+
+ VideoCommon_DoState(p);
+ p.DoMarker("VideoCommon");
+
+ p.Do(s_swapRequested);
+ p.Do(s_efbAccessRequested);
+ p.Do(s_beginFieldArgs);
+ p.Do(s_accessEFBArgs);
+ p.Do(s_AccessEFBResult);
+ p.DoMarker("VideoBackendHardware");
+
+ // Refresh state.
+ if (p.GetMode() == PointerWrap::MODE_READ)
+ {
+ m_invalid = true;
+ RecomputeCachedArraybases();
+
+ // Clear all caches that touch RAM
+ // (? these don't appear to touch any emulation state that gets saved. moved to on load only.)
+ VertexLoaderManager::MarkAllDirty();
+ }
+}
+
+void VideoBackendHardware::CheckInvalidState()
+{
+ if (m_invalid)
+ {
+ m_invalid = false;
+
+ BPReload();
+ TextureCache::Invalidate();
+ }
+}
+
+void VideoBackendHardware::PauseAndLock(bool doLock, bool unpauseOnUnlock)
+{
+ Fifo_PauseAndLock(doLock, unpauseOnUnlock);
+}
+
+
+void VideoBackendHardware::RunLoop(bool enable)
+{
+ VideoCommon_RunLoop(enable);
+}
+
+void VideoFifo_CheckAsyncRequest()
+{
+ VideoFifo_CheckSwapRequest();
+ VideoFifo_CheckEFBAccess();
+ VideoFifo_CheckPerfQueryRequest();
+}
+
+void VideoBackendHardware::Video_GatherPipeBursted()
+{
+ CommandProcessor::GatherPipeBursted();
+}
+
+bool VideoBackendHardware::Video_IsPossibleWaitingSetDrawDone()
+{
+ return CommandProcessor::isPossibleWaitingSetDrawDone;
+}
+
+bool VideoBackendHardware::Video_IsHiWatermarkActive()
+{
+ return CommandProcessor::isHiWatermarkActive;
+}
+
+void VideoBackendHardware::Video_AbortFrame()
+{
+ CommandProcessor::AbortFrame();
+}
+
+readFn16 VideoBackendHardware::Video_CPRead16()
+{
+ return CommandProcessor::Read16;
+}
+writeFn16 VideoBackendHardware::Video_CPWrite16()
+{
+ return CommandProcessor::Write16;
+}
+
+readFn16 VideoBackendHardware::Video_PERead16()
+{
+ return PixelEngine::Read16;
+}
+writeFn16 VideoBackendHardware::Video_PEWrite16()
+{
+ return PixelEngine::Write16;
+}
+writeFn32 VideoBackendHardware::Video_PEWrite32()
+{
+ return PixelEngine::Write32;
+}