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

View file

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