Lock the GPU3D state when rendering on the render thread or serializing it

This commit is contained in:
Jesse Talavera-Greenberg 2023-10-26 09:37:39 -04:00
parent 2c921ba024
commit 2f49a551c1
2 changed files with 16 additions and 0 deletions

View File

@ -275,6 +275,7 @@ u32 RenderNumPolygons;
u32 FlushRequest; u32 FlushRequest;
u32 FlushAttributes; u32 FlushAttributes;
Platform::Mutex* StateLock;
std::unique_ptr<GPU3D::Renderer3D> CurrentRenderer = {}; std::unique_ptr<GPU3D::Renderer3D> CurrentRenderer = {};
bool AbortFrame; bool AbortFrame;
@ -294,12 +295,22 @@ void Vertex::DoSavestate(Savestate* file) noexcept
bool Init() bool Init()
{ {
if (StateLock)
{
Platform::Mutex_Free(StateLock);
}
StateLock = Platform::Mutex_Create();
return true; return true;
} }
void DeInit() void DeInit()
{ {
CurrentRenderer = nullptr; CurrentRenderer = nullptr;
if (StateLock)
{
Platform::Mutex_Free(StateLock);
StateLock = nullptr;
}
} }
void ResetRenderingState() void ResetRenderingState()
@ -410,6 +421,7 @@ void DoSavestate(Savestate* file)
if (softRenderer && softRenderer->IsThreaded()) if (softRenderer && softRenderer->IsThreaded())
{ {
softRenderer->SetupRenderThread(); softRenderer->SetupRenderThread();
Platform::Mutex_Lock(StateLock);
} }
CmdFIFO.DoSavestate(file); CmdFIFO.DoSavestate(file);
@ -643,6 +655,7 @@ void DoSavestate(Savestate* file)
file->Var32(&TexPalette); file->Var32(&TexPalette);
if (softRenderer && softRenderer->IsThreaded()) if (softRenderer && softRenderer->IsThreaded())
{ {
Platform::Mutex_Unlock(StateLock);
softRenderer->EnableRenderThread(); softRenderer->EnableRenderThread();
} }
} }

View File

@ -1736,6 +1736,7 @@ void SoftRenderer::RestartFrame()
EnableRenderThread(); EnableRenderThread();
} }
extern Platform::Mutex* StateLock;
void SoftRenderer::RenderThreadFunc() void SoftRenderer::RenderThreadFunc()
{ {
for (;;) for (;;)
@ -1750,8 +1751,10 @@ void SoftRenderer::RenderThreadFunc()
} }
else else
{ {
Platform::Mutex_Lock(StateLock);
ClearBuffers(); ClearBuffers();
RenderPolygons(true, &RenderPolygonRAM[0], RenderNumPolygons); RenderPolygons(true, &RenderPolygonRAM[0], RenderNumPolygons);
Platform::Mutex_Unlock(StateLock);
} }
Platform::Semaphore_Post(Sema_RenderDone); Platform::Semaphore_Post(Sema_RenderDone);