From 66a7db3850480bf7f1303fc1251d64a01091fef2 Mon Sep 17 00:00:00 2001 From: weihuoya Date: Tue, 8 Jan 2019 18:28:59 +0800 Subject: [PATCH] Always flush on swap --- Source/Core/VideoBackends/OGL/Render.cpp | 7 +++++++ Source/Core/VideoBackends/OGL/Render.h | 1 + Source/Core/VideoBackends/Vulkan/Renderer.cpp | 5 +++++ Source/Core/VideoBackends/Vulkan/Renderer.h | 1 + Source/Core/VideoCommon/RenderBase.cpp | 8 ++++++++ Source/Core/VideoCommon/RenderBase.h | 1 + 6 files changed, 23 insertions(+) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 55de5ec0dc..186b6a7da5 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1528,6 +1528,13 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region ClearEFBCache(); } +void Renderer::Flush() +{ + // ensure all commands are sent to the GPU. + // Otherwise the driver could batch several frames togehter. + glFlush(); +} + void Renderer::CheckForSurfaceChange() { if (!m_surface_changed.TestAndClear()) diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index 2de8ff01a5..f520c6faa4 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -133,6 +133,7 @@ public: TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override; void SwapImpl(AbstractTexture* texture, const EFBRectangle& rc, u64 ticks) override; + void Flush() override; void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z) override; diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 6bec599882..718bdec8d7 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -640,6 +640,11 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region TextureCache::GetInstance()->Cleanup(frameCount); } +void Renderer::Flush() +{ + Util::ExecuteCurrentCommandsAndRestoreState(true, false); +} + void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region) { VkResult res; diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h index bd7efc88ca..d5e89b17e2 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.h +++ b/Source/Core/VideoBackends/Vulkan/Renderer.h @@ -63,6 +63,7 @@ public: TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override; void SwapImpl(AbstractTexture* texture, const EFBRectangle& rc, u64 ticks) override; + void Flush() override; void ClearScreen(const EFBRectangle& rc, bool color_enable, bool alpha_enable, bool z_enable, u32 color, u32 z) override; diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index ba60e1636c..7e01182127 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -751,11 +751,19 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const Core::Callback_VideoCopiedToXFB(true); } + else + { + Flush(); + } // Update our last xfb values m_last_xfb_width = (fbStride < 1 || fbStride > MAX_XFB_WIDTH) ? MAX_XFB_WIDTH : fbStride; m_last_xfb_height = (fbHeight < 1 || fbHeight > MAX_XFB_HEIGHT) ? MAX_XFB_HEIGHT : fbHeight; } + else + { + Flush(); + } } bool Renderer::IsFrameDumping() diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index bea1f5ba0a..4e9c60efae 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -184,6 +184,7 @@ public: void Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc, u64 ticks); virtual void SwapImpl(AbstractTexture* texture, const EFBRectangle& rc, u64 ticks) = 0; + virtual void Flush() {} PEControl::PixelFormat GetPrevPixelFormat() const { return m_prev_efb_format; } void StorePixelFormat(PEControl::PixelFormat new_format) { m_prev_efb_format = new_format; }