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"); file->Section("GP3D");
SoftRenderer* softRenderer = dynamic_cast<SoftRenderer*>(CurrentRenderer.get());
if (softRenderer && softRenderer->IsThreaded())
{
softRenderer->SetupRenderThread();
}
CmdFIFO.DoSavestate(file); CmdFIFO.DoSavestate(file);
CmdPIPE.DoSavestate(file); CmdPIPE.DoSavestate(file);
@ -630,6 +636,10 @@ void DoSavestate(Savestate* file)
file->VarArray(ShininessTable, 128*sizeof(u8)); file->VarArray(ShininessTable, 128*sizeof(u8));
file->Bool32(&AbortFrame); 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_RenderDone);
Platform::Semaphore_Reset(Sema_RenderStart); Platform::Semaphore_Reset(Sema_RenderStart);
Platform::Semaphore_Reset(Sema_ScanlineCount); Platform::Semaphore_Reset(Sema_ScanlineCount);
Platform::Semaphore_Wait(Sema_RenderStart);
Platform::Semaphore_Post(Sema_RenderStart);
} }
else else
{ {
@ -71,6 +70,13 @@ void SoftRenderer::SetupRenderThread()
} }
} }
void SoftRenderer::EnableRenderThread()
{
if (Threaded && Sema_RenderStart)
{
Platform::Semaphore_Post(Sema_RenderStart);
}
}
SoftRenderer::SoftRenderer() noexcept SoftRenderer::SoftRenderer() noexcept
: Renderer3D(false) : Renderer3D(false)
@ -103,12 +109,14 @@ void SoftRenderer::Reset()
PrevIsShadowMask = false; PrevIsShadowMask = false;
SetupRenderThread(); SetupRenderThread();
EnableRenderThread();
} }
void SoftRenderer::SetRenderSettings(GPU::RenderSettings& settings) void SoftRenderer::SetRenderSettings(GPU::RenderSettings& settings)
{ {
Threaded = settings.Soft_Threaded; Threaded = settings.Soft_Threaded;
SetupRenderThread(); SetupRenderThread();
EnableRenderThread();
} }
void SoftRenderer::TextureLookup(u32 texparam, u32 texpal, s16 s, s16 t, u16* color, u8* alpha) 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() void SoftRenderer::RestartFrame()
{ {
SetupRenderThread(); SetupRenderThread();
EnableRenderThread();
} }
void SoftRenderer::RenderThreadFunc() void SoftRenderer::RenderThreadFunc()

View File

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