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:
parent
ecd0305a60
commit
3f8d645c42
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -694,6 +694,7 @@ struct DX11OITRenderer : public DX11Renderer
|
|||
#endif
|
||||
frameRendered = true;
|
||||
frameRenderedOnce = true;
|
||||
clearLastFrame = false;
|
||||
}
|
||||
|
||||
return !is_rtt;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -713,6 +713,7 @@ struct OpenGL4Renderer : OpenGLRenderer
|
|||
if (!config::EmulateFramebuffer)
|
||||
{
|
||||
frameRendered = true;
|
||||
clearLastFrame = false;
|
||||
drawOSD();
|
||||
renderVideoRouting();
|
||||
}
|
||||
|
|
|
@ -688,6 +688,7 @@ void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info)
|
|||
|
||||
drawOSD();
|
||||
frameRendered = true;
|
||||
clearLastFrame = false;
|
||||
renderVideoRouting();
|
||||
restoreCurrentFramebuffer();
|
||||
}
|
||||
|
|
|
@ -1361,6 +1361,7 @@ bool OpenGLRenderer::Render()
|
|||
if (!config::EmulateFramebuffer)
|
||||
{
|
||||
frameRendered = true;
|
||||
clearLastFrame = false;
|
||||
drawOSD();
|
||||
renderVideoRouting();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -105,7 +105,8 @@ public:
|
|||
|
||||
bool Present() override
|
||||
{
|
||||
clearLastFrame = false;
|
||||
if (clearLastFrame)
|
||||
return false;
|
||||
if (config::EmulateFramebuffer || framebufferRendered)
|
||||
return presentFramebuffer();
|
||||
else
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue