diff --git a/Source/Core/VideoCommon/Src/MainBase.cpp b/Source/Core/VideoCommon/Src/MainBase.cpp index f9981b6a65..f21f3d431c 100644 --- a/Source/Core/VideoCommon/Src/MainBase.cpp +++ b/Source/Core/VideoCommon/Src/MainBase.cpp @@ -5,10 +5,12 @@ #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" bool s_PluginInitialized = false; @@ -162,10 +164,65 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData) return 0; } +static volatile struct +{ + unsigned char **ptr; + int mode; +} s_doStateArgs; + +// Run from the GPU thread on X11, CPU thread on the rest +static void check_DoState() { +#if defined(HAVE_X11) && HAVE_X11 + if (Common::AtomicLoadAcquire(s_doStateRequested)) + { +#endif + // Clear all caches that touch RAM + CommandProcessor::FifoCriticalEnter(); + TextureCache::Invalidate(false); + VertexLoaderManager::MarkAllDirty(); + CommandProcessor::FifoCriticalLeave(); + + PointerWrap p(s_doStateArgs.ptr, s_doStateArgs.mode); + VideoCommon_DoState(p); + + // Refresh state. + if (s_doStateArgs.mode == PointerWrap::MODE_READ) + { + BPReload(); + RecomputeCachedArraybases(); + } + +#if defined(HAVE_X11) && HAVE_X11 + Common::AtomicStoreRelease(s_doStateRequested, FALSE); + } +#endif +} + +// Run from the CPU thread +void DoState(unsigned char **ptr, int mode) +{ + s_doStateArgs.ptr = ptr; + s_doStateArgs.mode = mode; +#if defined(HAVE_X11) && HAVE_X11 + Common::AtomicStoreRelease(s_doStateRequested, TRUE); + if (g_VideoInitialize.bOnThread) + { + while (Common::AtomicLoadAcquire(s_doStateRequested) && !s_FifoShuttingDown) + //Common::SleepCurrentThread(1); + Common::YieldCPU(); + } + else +#endif + check_DoState(); +} + void VideoFifo_CheckAsyncRequest() { VideoFifo_CheckSwapRequest(); VideoFifo_CheckEFBAccess(); +#if defined(HAVE_X11) && HAVE_X11 + check_DoState(); +#endif } void Video_CommandProcessorRead16(u16& _rReturnValue, const u32 _Address) diff --git a/Source/Plugins/Plugin_VideoDX11/Src/main.cpp b/Source/Plugins/Plugin_VideoDX11/Src/main.cpp index bea3c75f7b..46eaabc006 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/main.cpp @@ -311,14 +311,3 @@ void Shutdown() s_PluginInitialized = false; } - -void DoState(unsigned char **ptr, int mode) -{ - // Clear texture cache because it might have written to RAM - CommandProcessor::FifoCriticalEnter(); - TextureCache::Invalidate(false); - CommandProcessor::FifoCriticalLeave(); - // No need to clear shader caches - PointerWrap p(ptr, mode); - VideoCommon_DoState(p); -} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp index 4928754cc6..4f5704fe81 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp @@ -286,14 +286,3 @@ void Shutdown() D3D::Shutdown(); EmuWindow::Close(); } - -void DoState(unsigned char **ptr, int mode) -{ - // Clear texture cache because it might have written to RAM - CommandProcessor::FifoCriticalEnter(); - TextureCache::Invalidate(false); - CommandProcessor::FifoCriticalLeave(); - // No need to clear shader caches - PointerWrap p(ptr, mode); - VideoCommon_DoState(p); -} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index a841efd82c..142e99ccf0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -292,53 +292,3 @@ void Shutdown() delete g_renderer; OpenGL_Shutdown(); } - -static volatile struct -{ - unsigned char **ptr; - int mode; -} s_doStateArgs; - -// Run from the GPU thread on X11, CPU thread on the rest -static void check_DoState() { -#if defined(HAVE_X11) && HAVE_X11 - if (Common::AtomicLoadAcquire(s_doStateRequested)) - { -#endif - // Clear all caches that touch RAM - TextureCache::Invalidate(false); - VertexLoaderManager::MarkAllDirty(); - - PointerWrap p(s_doStateArgs.ptr, s_doStateArgs.mode); - VideoCommon_DoState(p); - - // Refresh state. - if (s_doStateArgs.mode == PointerWrap::MODE_READ) - { - BPReload(); - RecomputeCachedArraybases(); - } - -#if defined(HAVE_X11) && HAVE_X11 - Common::AtomicStoreRelease(s_doStateRequested, FALSE); - } -#endif -} - -// Run from the CPU thread -void DoState(unsigned char **ptr, int mode) -{ - s_doStateArgs.ptr = ptr; - s_doStateArgs.mode = mode; -#if defined(HAVE_X11) && HAVE_X11 - Common::AtomicStoreRelease(s_doStateRequested, TRUE); - if (g_VideoInitialize.bOnThread) - { - while (Common::AtomicLoadAcquire(s_doStateRequested) && !s_FifoShuttingDown) - //Common::SleepCurrentThread(1); - Common::YieldCPU(); - } - else -#endif - check_DoState(); -}