mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-08-03 03:28:54 -06:00
First crack at ensuring the render thread doesn't touch GPU state while it's being serialized
This commit is contained in:
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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:
|
||||||
//
|
//
|
||||||
|
Reference in New Issue
Block a user