summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/RenderBase.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2017-09-13 23:46:30 -0500
committeriwubcode <iwubcode@users.noreply.github.com>2017-11-17 22:11:32 -0600
commita129a53e56cdff93e2fd092fd56f3e0726408a60 (patch)
tree7be3863250ab93c7bb814c115968a7c433403a9a /Source/Core/VideoCommon/RenderBase.cpp
parent53684701fa1f9a787f8d089d864c5c1c97effa8c (diff)
Video Common: Improve texture dumping to work with fifoci and
fifo_comparer
Diffstat (limited to 'Source/Core/VideoCommon/RenderBase.cpp')
-rw-r--r--Source/Core/VideoCommon/RenderBase.cpp43
1 files changed, 29 insertions, 14 deletions
diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp
index ba909a22b3..e63282d527 100644
--- a/Source/Core/VideoCommon/RenderBase.cpp
+++ b/Source/Core/VideoCommon/RenderBase.cpp
@@ -97,11 +97,15 @@ Renderer::Renderer(int backbuffer_width, int backbuffer_height)
m_last_host_config_bits = ShaderHostConfig::GetCurrent().bits;
}
-Renderer::~Renderer()
+Renderer::~Renderer() = default;
+
+void Renderer::ExitFramedumping()
{
ShutdownFrameDumping();
if (m_frame_dump_thread.joinable())
m_frame_dump_thread.join();
+
+ m_dump_texture.reset();
}
void Renderer::RenderToXFB(u32 xfbAddr, const EFBRectangle& sourceRc, u32 fbStride, u32 fbHeight,
@@ -625,20 +629,13 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const
m_aspect_wide = flush_count_anamorphic > 0.75 * flush_total;
}
- // The FinishFrameData call here is necessary even after frame dumping is stopped.
- // If left out, screenshots are "one frame" behind, as an extra frame is dumped and buffered.
- FinishFrameData();
if (IsFrameDumping() && m_last_xfb_texture)
{
- UpdateFrameDumpTexture(horizontal_scale);
-
- auto result = m_dump_texture->Map();
- if (result.has_value())
- {
- auto raw_data = result.value();
- DumpFrameData(raw_data.data, raw_data.width, raw_data.height, raw_data.stride,
- AVIDump::FetchState(ticks));
- }
+ FinishFrameData();
+ }
+ else
+ {
+ ShutdownFrameDumping();
}
bool update_frame_count = false;
@@ -653,12 +650,18 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const
{
m_last_xfb_texture = xfb_entry->texture.get();
m_last_xfb_id = xfb_entry->id;
+ m_last_xfb_ticks = ticks;
+ m_last_xfb_horizontal_scale = horizontal_scale;
// TODO: merge more generic parts into VideoCommon
g_renderer->SwapImpl(xfb_entry->texture.get(), rc, ticks, xfb_entry->gamma);
m_fps_counter.Update();
update_frame_count = true;
+ if (IsFrameDumping())
+ {
+ DoDumpFrame();
+ }
}
// Update our last xfb values
@@ -685,10 +688,22 @@ bool Renderer::IsFrameDumping()
if (SConfig::GetInstance().m_DumpFrames)
return true;
- ShutdownFrameDumping();
return false;
}
+void Renderer::DoDumpFrame()
+{
+ UpdateFrameDumpTexture(m_last_xfb_horizontal_scale);
+
+ auto result = m_dump_texture->Map();
+ if (result.has_value())
+ {
+ auto raw_data = result.value();
+ DumpFrameData(raw_data.data, raw_data.width, raw_data.height, raw_data.stride,
+ AVIDump::FetchState(m_last_xfb_ticks));
+ }
+}
+
void Renderer::UpdateFrameDumpTexture(float horizontal_scale)
{
int target_width, target_height;