rend: last frame was sometimes presented after the game is stopped

When the clearLastFrame flag is set, renderers should return false from
Present() and RenderLastFrame() until a new frame is rendered.
This commit is contained in:
Flyinghead 2024-12-15 15:55:28 +01:00
parent ecd0305a60
commit 3f8d645c42
11 changed files with 21 additions and 9 deletions

View File

@ -525,6 +525,7 @@ bool DX11Renderer::Render()
#endif
frameRendered = true;
frameRenderedOnce = true;
clearLastFrame = false;
}
return !is_rtt;
@ -1040,6 +1041,7 @@ void DX11Renderer::RenderFramebuffer(const FramebufferInfo& info)
#endif
frameRendered = true;
frameRenderedOnce = true;
clearLastFrame = false;
}
void DX11Renderer::setBaseScissor()

View File

@ -42,10 +42,9 @@ struct DX11Renderer : public Renderer
bool Present() override
{
if (!frameRendered)
if (!frameRendered || clearLastFrame)
return false;
frameRendered = false;
clearLastFrame = false;
#ifndef LIBRETRO
imguiDriver->setFrameRendered();
#else

View File

@ -694,6 +694,7 @@ struct DX11OITRenderer : public DX11Renderer
#endif
frameRendered = true;
frameRenderedOnce = true;
clearLastFrame = false;
}
return !is_rtt;

View File

@ -302,6 +302,7 @@ void D3DRenderer::RenderFramebuffer(const FramebufferInfo& info)
drawOSD();
frameRendered = true;
frameRenderedOnce = true;
clearLastFrame = false;
theDXContext.setFrameRendered();
}
@ -1181,6 +1182,7 @@ bool D3DRenderer::Render()
drawOSD();
frameRendered = true;
frameRenderedOnce = true;
clearLastFrame = false;
theDXContext.setFrameRendered();
}

View File

@ -106,11 +106,10 @@ struct D3DRenderer : public Renderer
bool RenderLastFrame() override;
bool Present() override
{
if (!frameRendered)
if (!frameRendered || clearLastFrame)
return false;
imguiDriver->setFrameRendered();
frameRendered = false;
clearLastFrame = false;
return true;
}
BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override;

View File

@ -713,6 +713,7 @@ struct OpenGL4Renderer : OpenGLRenderer
if (!config::EmulateFramebuffer)
{
frameRendered = true;
clearLastFrame = false;
drawOSD();
renderVideoRouting();
}

View File

@ -688,6 +688,7 @@ void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info)
drawOSD();
frameRendered = true;
clearLastFrame = false;
renderVideoRouting();
restoreCurrentFramebuffer();
}

View File

@ -1361,6 +1361,7 @@ bool OpenGLRenderer::Render()
if (!config::EmulateFramebuffer)
{
frameRendered = true;
clearLastFrame = false;
drawOSD();
renderVideoRouting();
}

View File

@ -516,12 +516,11 @@ struct OpenGLRenderer : Renderer
bool Present() override
{
if (!frameRendered)
if (!frameRendered || clearLastFrame)
return false;
#ifndef LIBRETRO
imguiDriver->setFrameRendered();
#endif
clearLastFrame = false;
frameRendered = false;
return true;
}

View File

@ -105,7 +105,8 @@ public:
bool Present() override
{
clearLastFrame = false;
if (clearLastFrame)
return false;
if (config::EmulateFramebuffer || framebufferRendered)
return presentFramebuffer();
else

View File

@ -86,7 +86,11 @@ BaseTextureCacheData *BaseVulkanRenderer::GetTexture(TSP tsp, TCW tcw)
void BaseVulkanRenderer::Process(TA_context* ctx)
{
framebufferRendered = false;
if (!ctx->rend.isRTT) {
framebufferRendered = false;
if (!config::EmulateFramebuffer)
clearLastFrame = false;
}
if (resetTextureCache) {
textureCache.Clear();
resetTextureCache = false;
@ -156,6 +160,7 @@ void BaseVulkanRenderer::RenderFramebuffer(const FramebufferInfo& info)
commandBuffer.end();
fbCommandPool.EndFrame();
framebufferRendered = true;
clearLastFrame = false;
}
void BaseVulkanRenderer::RenderVideoRouting()
@ -300,7 +305,8 @@ public:
bool Present() override
{
clearLastFrame = false;
if (clearLastFrame)
return false;
if (config::EmulateFramebuffer || framebufferRendered)
return presentFramebuffer();
else