First crack at ensuring the render thread doesn't touch GPU state while it's being serialized

This commit is contained in:
Jesse Talavera-Greenberg 2023-10-24 14:51:45 -04:00
parent 3ab752b8ca
commit e5efc4b348
3 changed files with 23 additions and 2 deletions

View File

@ -393,6 +393,12 @@ void DoSavestate(Savestate* file)
{
file->Section("GP3D");
SoftRenderer* softRenderer = dynamic_cast<SoftRenderer*>(CurrentRenderer.get());
if (softRenderer && softRenderer->IsThreaded())
{
softRenderer->SetupRenderThread();
}
CmdFIFO.DoSavestate(file);
CmdPIPE.DoSavestate(file);
@ -630,6 +636,10 @@ void DoSavestate(Savestate* file)
file->VarArray(ShininessTable, 128*sizeof(u8));
file->Bool32(&AbortFrame);
if (softRenderer && softRenderer->IsThreaded())
{
softRenderer->EnableRenderThread();
}
}

View File

@ -62,8 +62,7 @@ void SoftRenderer::SetupRenderThread()
Platform::Semaphore_Reset(Sema_RenderDone);
Platform::Semaphore_Reset(Sema_RenderStart);
Platform::Semaphore_Reset(Sema_ScanlineCount);
Platform::Semaphore_Post(Sema_RenderStart);
Platform::Semaphore_Wait(Sema_RenderStart);
}
else
{
@ -71,6 +70,13 @@ void SoftRenderer::SetupRenderThread()
}
}
void SoftRenderer::EnableRenderThread()
{
if (Threaded && Sema_RenderStart)
{
Platform::Semaphore_Post(Sema_RenderStart);
}
}
SoftRenderer::SoftRenderer() noexcept
: Renderer3D(false)
@ -103,12 +109,14 @@ void SoftRenderer::Reset()
PrevIsShadowMask = false;
SetupRenderThread();
EnableRenderThread();
}
void SoftRenderer::SetRenderSettings(GPU::RenderSettings& settings)
{
Threaded = settings.Soft_Threaded;
SetupRenderThread();
EnableRenderThread();
}
void SoftRenderer::TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u16* color, u8* alpha)
@ -1726,6 +1734,7 @@ void SoftRenderer::RenderFrame()
void SoftRenderer::RestartFrame()
{
SetupRenderThread();
EnableRenderThread();
}
void SoftRenderer::RenderThreadFunc()

View File

@ -40,7 +40,9 @@ public:
virtual u32* GetLine(int line) override;
void SetupRenderThread();
void EnableRenderThread();
void StopRenderThread();
bool IsThreaded() const noexcept { return Threaded; }
private:
// Notes on the interpolator:
//