summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-11-23 16:53:44 +1000
committerStenzek <stenzek@gmail.com>2017-11-23 16:53:55 +1000
commit32125cf1817b57f0b6eb390409ba7167a1671cf7 (patch)
treecc043e67e9ea25c2c9defaad6993ff0f8e675bab /Source/Core
parentab44536a3c5e03851a94848c8c08779d11eedf3d (diff)
OGL: Fix headless frame dumping
Also skips swapping the window system buffers in headless mode, as there may not be a surface which can be swapped in the first place. Instead, we call glFlush() at the end of a frame in this case.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp48
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.cpp8
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.cpp2
-rw-r--r--Source/Core/VideoCommon/RenderBase.cpp8
-rw-r--r--Source/Core/VideoCommon/RenderBase.h4
5 files changed, 47 insertions, 23 deletions
diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp
index 8408d3bcae..84c1ce0dfc 100644
--- a/Source/Core/VideoBackends/OGL/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Render.cpp
@@ -1349,25 +1349,35 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region
// Flip top and bottom for some reason; TODO: Fix the code to suck less?
std::swap(flipped_trc.top, flipped_trc.bottom);
- // Copy the framebuffer to screen.
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- BlitScreen(sourceRc, flipped_trc, xfb_texture->GetRawTexIdentifier(),
- xfb_texture->GetConfig().width, xfb_texture->GetConfig().height);
+ // Do our OSD callbacks
+ OSD::DoCallbacks(OSD::CallbackType::OnFrame);
- // Finish up the current frame, print some stats
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ // Skip screen rendering when running in headless mode.
+ if (!IsHeadless())
+ {
+ // Copy the framebuffer to screen.
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ BlitScreen(sourceRc, flipped_trc, xfb_texture->GetRawTexIdentifier(),
+ xfb_texture->GetConfig().width, xfb_texture->GetConfig().height);
- // Reset viewport for drawing text
- glViewport(0, 0, GLInterface->GetBackBufferWidth(), GLInterface->GetBackBufferHeight());
- DrawDebugText();
+ // Finish up the current frame, print some stats
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // Do our OSD callbacks
- OSD::DoCallbacks(OSD::CallbackType::OnFrame);
- OSD::DrawMessages();
+ // Reset viewport for drawing text
+ glViewport(0, 0, GLInterface->GetBackBufferWidth(), GLInterface->GetBackBufferHeight());
+ DrawDebugText();
+ OSD::DrawMessages();
- // Copy the rendered frame to the real window.
- GLInterface->Swap();
+ // Copy the rendered frame to the real window.
+ GLInterface->Swap();
+ }
+ else
+ {
+ // Since we're not swapping in headless mode, ensure all commands are sent to the GPU.
+ // Otherwise the driver could batch several frames togehter.
+ glFlush();
+ }
#ifdef ANDROID
// Handle surface changes on Android.
@@ -1375,6 +1385,7 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region
{
GLInterface->UpdateHandle(m_new_surface_handle);
GLInterface->UpdateSurface();
+ m_surface_handle = m_new_surface_handle;
m_new_surface_handle = nullptr;
m_surface_needs_change.Clear();
m_surface_changed.Set();
@@ -1431,8 +1442,11 @@ void Renderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_region
}
// Clear framebuffer
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if (!IsHeadless())
+ {
+ glClearColor(0, 0, 0, 0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
if (s_vsync != g_ActiveConfig.IsVSync())
{
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp
index 69523efe78..4c298e927e 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.cpp
+++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp
@@ -45,9 +45,11 @@ void SWRenderer::SwapImpl(AbstractTexture* texture, const EFBRectangle& xfb_regi
{
OSD::DoCallbacks(OSD::CallbackType::OnFrame);
- DrawDebugText();
-
- SWOGLWindow::s_instance->ShowImage(texture, xfb_region);
+ if (!IsHeadless())
+ {
+ DrawDebugText();
+ SWOGLWindow::s_instance->ShowImage(texture, xfb_region);
+ }
UpdateActiveConfig();
}
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
index 8f83e2b202..084e7a2880 100644
--- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp
+++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
@@ -600,7 +600,6 @@ void Renderer::DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region
VK_SUBPASS_CONTENTS_INLINE);
// Draw
- TargetRectangle source_rc = xfb_texture->GetConfig().GetRect();
BlitScreen(m_swap_chain->GetRenderPass(), GetTargetRectangle(), xfb_region,
xfb_texture->GetRawTexIdentifier());
@@ -702,6 +701,7 @@ void Renderer::CheckForSurfaceChange()
// Notify calling thread.
m_surface_needs_change.Clear();
+ m_surface_handle = m_new_surface_handle;
m_new_surface_handle = nullptr;
m_surface_changed.Set();
}
diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp
index 4a46475344..2edd6dcfd5 100644
--- a/Source/Core/VideoCommon/RenderBase.cpp
+++ b/Source/Core/VideoCommon/RenderBase.cpp
@@ -94,6 +94,7 @@ Renderer::Renderer(int backbuffer_width, int backbuffer_height)
if (SConfig::GetInstance().bWii)
m_aspect_wide = Config::Get(Config::SYSCONF_WIDESCREEN);
+ m_surface_handle = Host_GetRenderHandle();
m_last_host_config_bits = ShaderHostConfig::GetCurrent().bits;
}
@@ -400,6 +401,11 @@ float Renderer::CalculateDrawAspectRatio() const
}
}
+bool Renderer::IsHeadless() const
+{
+ return !m_surface_handle;
+}
+
std::tuple<float, float> Renderer::ScaleToDisplayAspectRatio(const int width,
const int height) const
{
@@ -711,7 +717,7 @@ void Renderer::DoDumpFrame()
void Renderer::UpdateFrameDumpTexture()
{
int target_width, target_height;
- if (!g_ActiveConfig.bInternalResolutionFrameDumps)
+ if (!g_ActiveConfig.bInternalResolutionFrameDumps && !IsHeadless())
{
auto target_rect = GetTargetRectangle();
target_width = target_rect.GetWidth();
diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h
index b622372b90..1edb5c75d4 100644
--- a/Source/Core/VideoCommon/RenderBase.h
+++ b/Source/Core/VideoCommon/RenderBase.h
@@ -94,6 +94,7 @@ public:
const TargetRectangle& GetTargetRectangle() const { return m_target_rectangle; }
float CalculateDrawAspectRatio() const;
+ bool IsHeadless() const;
std::tuple<float, float> ScaleToDisplayAspectRatio(int width, int height) const;
void UpdateDrawRectangle();
@@ -176,9 +177,10 @@ protected:
static const float GX_MAX_DEPTH;
+ void* m_surface_handle = nullptr;
+ void* m_new_surface_handle = nullptr;
Common::Flag m_surface_needs_change;
Common::Event m_surface_changed;
- void* m_new_surface_handle = nullptr;
u32 m_last_host_config_bits = 0;