From e5efc4b348448964c4baf7906093e9ba1c71060c Mon Sep 17 00:00:00 2001 From: Jesse Talavera-Greenberg Date: Tue, 24 Oct 2023 14:51:45 -0400 Subject: [PATCH] First crack at ensuring the render thread doesn't touch GPU state while it's being serialized --- src/GPU3D.cpp | 10 ++++++++++ src/GPU3D_Soft.cpp | 13 +++++++++++-- src/GPU3D_Soft.h | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index 8cc380ad..181e4104 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -393,6 +393,12 @@ void DoSavestate(Savestate* file) { file->Section("GP3D"); + SoftRenderer* softRenderer = dynamic_cast(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(); + } } diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 8848a541..b9eefc48 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -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() diff --git a/src/GPU3D_Soft.h b/src/GPU3D_Soft.h index 948832f4..0e4bb66e 100644 --- a/src/GPU3D_Soft.h +++ b/src/GPU3D_Soft.h @@ -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: //