From 52caa4f2f56f2fae4ec679944782c73315fd1ad7 Mon Sep 17 00:00:00 2001 From: degasus Date: Mon, 7 Nov 2016 22:46:48 +0100 Subject: [PATCH] VideoCommon/Render: Inplace frame dump encoding. This increase the performance of good backends a bit, but slows down the bads one a lot. Let's fix those backends instead of forcing stupid memcpy in the common code. --- Source/Core/VideoCommon/RenderBase.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 94d51ee481..c1298e0822 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -705,23 +705,20 @@ void Renderer::RunFrameDumps() if (!m_frame_dump_thread_running.IsSet()) break; - const auto config = m_frame_dump_config; - - // TODO: Refactor this. Right now it's needed for the implace flipping of the image. - data.assign(config.data, config.data + config.stride * config.height); - - // As we've done a copy now, there is no need to block the GPU thread any longer. - m_frame_dump_done.Set(); + auto config = m_frame_dump_config; if (config.upside_down) - FlipImageData(data.data(), config.width, config.height, 4); + { + config.data = config.data + (config.height - 1) * config.stride; + config.stride = -config.stride; + } // Save screenshot if (s_screenshot.TestAndClear()) { std::lock_guard lk(s_criticalScreenshot); - if (TextureToPng(data.data(), config.stride, s_sScreenshotName, config.width, config.height, + if (TextureToPng(config.data, config.stride, s_sScreenshotName, config.width, config.height, false)) OSD::AddMessage("Screenshot saved to " + s_sScreenshotName); @@ -745,9 +742,11 @@ void Renderer::RunFrameDumps() } } - AVIDump::AddFrame(data.data(), config.width, config.height, config.stride, config.state); + AVIDump::AddFrame(config.data, config.width, config.height, config.stride, config.state); } #endif + + m_frame_dump_done.Set(); } #if defined(HAVE_LIBAV) || defined(_WIN32)