Fix crashes in dual core mode on a PI_FIFO_RESET

This commit is contained in:
CasualPokePlayer 2022-08-18 13:38:37 -07:00
parent b6a18b0da5
commit ab8a8e6f84
3 changed files with 23 additions and 1 deletions

View File

@ -18,6 +18,7 @@
#include "Core/IOS/IOS.h" #include "Core/IOS/IOS.h"
#include "Core/IOS/STM/STM.h" #include "Core/IOS/STM/STM.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "VideoCommon/AsyncRequests.h"
#include "VideoCommon/Fifo.h" #include "VideoCommon/Fifo.h"
namespace ProcessorInterface namespace ProcessorInterface
@ -108,7 +109,19 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
if ((val & 1) != 0) if ((val & 1) != 0)
{ {
GPFifo::ResetGatherPipe(); 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);
} }
})); }));

View File

@ -158,6 +158,10 @@ void AsyncRequests::HandleEvent(const AsyncRequests::Event& e)
*e.bbox.data = g_renderer->BBoxRead(e.bbox.index); *e.bbox.data = g_renderer->BBoxRead(e.bbox.index);
break; break;
case Event::FIFO_RESET:
Fifo::ResetVideoBuffer();
break;
case Event::PERF_QUERY: case Event::PERF_QUERY:
g_perf_query->FlushResults(); g_perf_query->FlushResults();
break; break;

View File

@ -27,6 +27,7 @@ public:
EFB_PEEK_Z, EFB_PEEK_Z,
SWAP_EVENT, SWAP_EVENT,
BBOX_READ, BBOX_READ,
FIFO_RESET,
PERF_QUERY, PERF_QUERY,
DO_SAVE_STATE, DO_SAVE_STATE,
} type; } type;
@ -62,6 +63,10 @@ public:
u16* data; u16* data;
} bbox; } bbox;
struct
{
} fifo_reset;
struct struct
{ {
} perf_query; } perf_query;