summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorweihuoya <zwdreams@gmail.com>2019-01-08 18:28:59 +0800
committerweihuoya <zwdreams@gmail.com>2019-01-08 18:28:59 +0800
commit66a7db3850480bf7f1303fc1251d64a01091fef2 (patch)
treee3747265776055b97cbf8c08cc8a8ab2318d2be1 /Source/Core
parent3fa81f39fb577214d2fe83b51eac8ce2430aaa31 (diff)
Always flush on swap
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp7
-rw-r--r--Source/Core/VideoBackends/OGL/Render.h1
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.cpp5
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.h1
-rw-r--r--Source/Core/VideoCommon/RenderBase.cpp8
-rw-r--r--Source/Core/VideoCommon/RenderBase.h1
6 files changed, 23 insertions, 0 deletions
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; }