First crack at ensuring the render thread doesn't touch GPU state while it's being serialized
This commit is contained in:
parent
3ab752b8ca
commit
e5efc4b348
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue