summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorCasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com>2022-08-18 13:38:37 -0700
committerCasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com>2022-08-18 13:38:37 -0700
commitab8a8e6f84652d9072bb8296e461d0d54f403edb (patch)
tree0e9685ed27900682278e3516b05e2f7ab016f417 /Source
parentb6a18b0da51ec0733dc6fcc78725fa4f800fc035 (diff)
Fix crashes in dual core mode on a PI_FIFO_RESET
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/HW/ProcessorInterface.cpp15
-rw-r--r--Source/Core/VideoCommon/AsyncRequests.cpp4
-rw-r--r--Source/Core/VideoCommon/AsyncRequests.h5
3 files changed, 23 insertions, 1 deletions
diff --git a/Source/Core/Core/HW/ProcessorInterface.cpp b/Source/Core/Core/HW/ProcessorInterface.cpp
index 5e752c13f7..bf4cb29f17 100644
--- a/Source/Core/Core/HW/ProcessorInterface.cpp
+++ b/Source/Core/Core/HW/ProcessorInterface.cpp
@@ -18,6 +18,7 @@
#include "Core/IOS/IOS.h"
#include "Core/IOS/STM/STM.h"
#include "Core/PowerPC/PowerPC.h"
+#include "VideoCommon/AsyncRequests.h"
#include "VideoCommon/Fifo.h"
namespace ProcessorInterface
@@ -108,7 +109,19 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
if ((val & 1) != 0)
{
GPFifo::ResetGatherPipe();
- Fifo::ResetVideoBuffer();
+
+ // Call Fifo::ResetVideoBuffer() from the video thread. Since that function
+ // resets various pointers used by the video thread, we can't call it directly
+ // from the CPU thread, so queue a task to do it instead. In single-core mode,
+ // AsyncRequests is in passthrough mode, so this will be safely and immediately
+ // called on the CPU thread.
+
+ // NOTE: GPFifo::ResetGatherPipe() only affects
+ // CPU state, so we can call it directly
+
+ AsyncRequests::Event ev = {};
+ ev.type = AsyncRequests::Event::FIFO_RESET;
+ AsyncRequests::GetInstance()->PushEvent(ev);
}
}));
diff --git a/Source/Core/VideoCommon/AsyncRequests.cpp b/Source/Core/VideoCommon/AsyncRequests.cpp
index f8306ddc3e..0371683376 100644
--- a/Source/Core/VideoCommon/AsyncRequests.cpp
+++ b/Source/Core/VideoCommon/AsyncRequests.cpp
@@ -158,6 +158,10 @@ void AsyncRequests::HandleEvent(const AsyncRequests::Event& e)
*e.bbox.data = g_renderer->BBoxRead(e.bbox.index);
break;
+ case Event::FIFO_RESET:
+ Fifo::ResetVideoBuffer();
+ break;
+
case Event::PERF_QUERY:
g_perf_query->FlushResults();
break;
diff --git a/Source/Core/VideoCommon/AsyncRequests.h b/Source/Core/VideoCommon/AsyncRequests.h
index c76b3b7834..5271426f1f 100644
--- a/Source/Core/VideoCommon/AsyncRequests.h
+++ b/Source/Core/VideoCommon/AsyncRequests.h
@@ -27,6 +27,7 @@ public:
EFB_PEEK_Z,
SWAP_EVENT,
BBOX_READ,
+ FIFO_RESET,
PERF_QUERY,
DO_SAVE_STATE,
} type;
@@ -64,6 +65,10 @@ public:
struct
{
+ } fifo_reset;
+
+ struct
+ {
} perf_query;
struct