summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/MainBase.cpp
diff options
context:
space:
mode:
authorNeoBrainX <NeoBrainX@googlemail.com>2010-12-16 18:21:14 +0000
committerNeoBrainX <NeoBrainX@googlemail.com>2010-12-16 18:21:14 +0000
commit455369907732006c7244152366ac309505e5c82c (patch)
treea9ce7dca97b153bc1929707ed07b74fd677d41eb /Source/Core/VideoCommon/Src/MainBase.cpp
parentaa226aaf415f19d02a923ac04c8ac15ce4139839 (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.cpp57
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)