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; @@ -62,6 +63,10 @@ public: u16* data; } bbox; + struct + { + } fifo_reset; + struct { } perf_query;