diff options
| author | NeoBrainX <NeoBrainX@googlemail.com> | 2010-12-16 18:21:14 +0000 |
|---|---|---|
| committer | NeoBrainX <NeoBrainX@googlemail.com> | 2010-12-16 18:21:14 +0000 |
| commit | 455369907732006c7244152366ac309505e5c82c (patch) | |
| tree | a9ce7dca97b153bc1929707ed07b74fd677d41eb /Source/Core/VideoCommon/Src/MainBase.cpp | |
| parent | aa226aaf415f19d02a923ac04c8ac15ce4139839 (diff) | |
Merge some state loading stuff to VideoCommon and fixed a crash on Linux system when trying to save a state.
Credits go to miquelmartos from the forums for the patch ;)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6593 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/MainBase.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/MainBase.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
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) |
