summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/MainBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/Src/MainBase.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/MainBase.cpp214
1 files changed, 214 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/Src/MainBase.cpp b/Source/Core/VideoCommon/Src/MainBase.cpp
new file mode 100644
index 0000000000..f9981b6a65
--- /dev/null
+++ b/Source/Core/VideoCommon/Src/MainBase.cpp
@@ -0,0 +1,214 @@
+
+#include "MainBase.h"
+#include "VideoState.h"
+#include "VideoConfig.h"
+#include "RenderBase.h"
+#include "FramebufferManagerBase.h"
+#include "TextureCacheBase.h"
+#include "CommandProcessor.h"
+#include "PixelEngine.h"
+#include "Atomic.h"
+#include "Fifo.h"
+#include "OnScreenDisplay.h"
+
+bool s_PluginInitialized = false;
+
+volatile u32 s_swapRequested = false;
+u32 s_efbAccessRequested = false;
+volatile u32 s_FifoShuttingDown = false;
+
+static volatile struct
+{
+ u32 xfbAddr;
+ FieldType field;
+ u32 fbWidth;
+ u32 fbHeight;
+} s_beginFieldArgs;
+
+static volatile EFBAccessType s_AccessEFBType;
+
+static struct
+{
+ EFBAccessType type;
+ u32 x;
+ u32 y;
+ u32 Data;
+} s_accessEFBArgs;
+
+static u32 s_AccessEFBResult = 0;
+
+
+void EmuStateChange(PLUGIN_EMUSTATE newState)
+{
+ Fifo_RunLoop((newState == PLUGIN_EMUSTATE_PLAY) ? true : false);
+}
+
+// Enter and exit the video loop
+void Video_EnterLoop()
+{
+ Fifo_EnterLoop(g_VideoInitialize);
+}
+
+void Video_ExitLoop()
+{
+ Fifo_ExitLoop();
+ s_FifoShuttingDown = true;
+}
+
+void 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.field, 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 Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
+{
+ if (s_PluginInitialized && g_ActiveConfig.bUseXFB)
+ {
+ if (!g_VideoInitialize.bOnThread)
+ VideoFifo_CheckSwapRequest();
+ s_beginFieldArgs.xfbAddr = xfbAddr;
+ s_beginFieldArgs.field = field;
+ s_beginFieldArgs.fbWidth = fbWidth;
+ s_beginFieldArgs.fbHeight = fbHeight;
+ }
+}
+
+// Run from the CPU thread (from VideoInterface.cpp)
+void Video_EndField()
+{
+ if (s_PluginInitialized)
+ {
+ Common::AtomicStoreRelease(s_swapRequested, TRUE);
+ }
+}
+
+void Video_AddMessage(const char* pstr, u32 milliseconds)
+{
+ OSD::AddMessage(pstr, milliseconds);
+}
+
+// Screenshot
+void Video_Screenshot(const char *_szFilename)
+{
+ Renderer::SetScreenshot(_szFilename);
+}
+
+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 Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData)
+{
+ if (s_PluginInitialized)
+ {
+ s_accessEFBArgs.type = type;
+ s_accessEFBArgs.x = x;
+ s_accessEFBArgs.y = y;
+ s_accessEFBArgs.Data = InputData;
+
+ Common::AtomicStoreRelease(s_efbAccessRequested, TRUE);
+
+ if (g_VideoInitialize.bOnThread)
+ {
+ while (Common::AtomicLoadAcquire(s_efbAccessRequested) && !s_FifoShuttingDown)
+ //Common::SleepCurrentThread(1);
+ Common::YieldCPU();
+ }
+ else
+ VideoFifo_CheckEFBAccess();
+
+ return s_AccessEFBResult;
+ }
+
+ return 0;
+}
+
+void VideoFifo_CheckAsyncRequest()
+{
+ VideoFifo_CheckSwapRequest();
+ VideoFifo_CheckEFBAccess();
+}
+
+void Video_CommandProcessorRead16(u16& _rReturnValue, const u32 _Address)
+{
+ CommandProcessor::Read16(_rReturnValue, _Address);
+}
+
+void Video_CommandProcessorWrite16(const u16 _Data, const u32 _Address)
+{
+ CommandProcessor::Write16(_Data, _Address);
+}
+
+void Video_PixelEngineRead16(u16& _rReturnValue, const u32 _Address)
+{
+ PixelEngine::Read16(_rReturnValue, _Address);
+}
+
+void Video_PixelEngineWrite16(const u16 _Data, const u32 _Address)
+{
+ PixelEngine::Write16(_Data, _Address);
+}
+
+void Video_PixelEngineWrite32(const u32 _Data, const u32 _Address)
+{
+ PixelEngine::Write32(_Data, _Address);
+}
+
+void Video_GatherPipeBursted(void)
+{
+ CommandProcessor::GatherPipeBursted();
+}
+
+void Video_WaitForFrameFinish(void)
+{
+ CommandProcessor::WaitForFrameFinish();
+}
+
+bool Video_IsFifoBusy(void)
+{
+ return CommandProcessor::isFifoBusy;
+}
+
+void Video_AbortFrame(void)
+{
+ CommandProcessor::AbortFrame();
+}