summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2016-10-10 11:48:57 +0200
committerGitHub <noreply@github.com>2016-10-10 11:48:57 +0200
commita583d36c7f38fac9fb66c059bf6990bfd819591f (patch)
tree842adfb6ca1a3ac76b290677bd72db2a406b781f /Source/Core/VideoCommon
parent562bc01d0e21f103fa9d8ee1993654a81e51fb26 (diff)
parent64927a2f81fe64503060c949ead525995fd63a2a (diff)
Merge pull request #4326 from degasus/framedump
Framedump: Merge screenshot code with framedumping.
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/AVIDump.cpp16
-rw-r--r--Source/Core/VideoCommon/AVIDump.h8
-rw-r--r--Source/Core/VideoCommon/RenderBase.cpp64
-rw-r--r--Source/Core/VideoCommon/RenderBase.h9
4 files changed, 44 insertions, 53 deletions
diff --git a/Source/Core/VideoCommon/AVIDump.cpp b/Source/Core/VideoCommon/AVIDump.cpp
index ab5b99c993..80af9f8d84 100644
--- a/Source/Core/VideoCommon/AVIDump.cpp
+++ b/Source/Core/VideoCommon/AVIDump.cpp
@@ -47,7 +47,6 @@ static u64 s_last_pts;
static int s_current_width;
static int s_current_height;
static int s_file_index = 0;
-static AVIDump::DumpFormat s_current_format;
static const u8* s_stored_frame_data;
static int s_stored_frame_width;
static int s_stored_frame_height;
@@ -63,18 +62,9 @@ static void InitAVCodec()
}
}
-bool AVIDump::Start(int w, int h, DumpFormat format)
+bool AVIDump::Start(int w, int h)
{
- if (format == DumpFormat::FORMAT_BGR)
- {
- s_pix_fmt = AV_PIX_FMT_BGR24;
- }
- else
- {
- s_pix_fmt = AV_PIX_FMT_RGBA;
- }
-
- s_current_format = format;
+ s_pix_fmt = AV_PIX_FMT_RGBA;
s_width = w;
s_height = h;
@@ -320,7 +310,7 @@ void AVIDump::CheckResolution(int width, int height)
int temp_file_index = s_file_index;
Stop();
s_file_index = temp_file_index + 1;
- Start(width, height, s_current_format);
+ Start(width, height);
s_current_width = width;
s_current_height = height;
}
diff --git a/Source/Core/VideoCommon/AVIDump.h b/Source/Core/VideoCommon/AVIDump.h
index a3b2ef4bd5..2d1dc89185 100644
--- a/Source/Core/VideoCommon/AVIDump.h
+++ b/Source/Core/VideoCommon/AVIDump.h
@@ -15,13 +15,7 @@ private:
static void StoreFrameData(const u8* data, int width, int height, int stride);
public:
- enum class DumpFormat
- {
- FORMAT_BGR,
- FORMAT_RGBA
- };
-
- static bool Start(int w, int h, DumpFormat format);
+ static bool Start(int w, int h);
static void AddFrame(const u8* data, int width, int height, int stride);
static void Stop();
static void DoState();
diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp
index e523fd8a67..9a81fa5e4d 100644
--- a/Source/Core/VideoCommon/RenderBase.cpp
+++ b/Source/Core/VideoCommon/RenderBase.cpp
@@ -41,6 +41,7 @@
#include "VideoCommon/Debugger.h"
#include "VideoCommon/FPSCounter.h"
#include "VideoCommon/FramebufferManagerBase.h"
+#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/PostProcessing.h"
#include "VideoCommon/RenderBase.h"
#include "VideoCommon/Statistics.h"
@@ -538,6 +539,9 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const
bool Renderer::IsFrameDumping()
{
+ if (s_bScreenshot)
+ return true;
+
#if defined(HAVE_LIBAV) || defined(_WIN32)
if (SConfig::GetInstance().m_DumpFrames)
return true;
@@ -546,7 +550,6 @@ bool Renderer::IsFrameDumping()
{
AVIDump::Stop();
std::vector<u8>().swap(m_frame_data);
- m_last_framedump_width = m_last_framedump_height = 0;
m_AVI_dumping = false;
OSD::AddMessage("Stop dumping frames", 2000);
}
@@ -555,43 +558,54 @@ bool Renderer::IsFrameDumping()
return false;
}
-void Renderer::DumpFrameData(const u8* data, int w, int h, int stride, AVIDump::DumpFormat format,
- bool swap_upside_down)
+void Renderer::DumpFrameData(const u8* data, int w, int h, int stride, bool swap_upside_down)
{
-#if defined(HAVE_LIBAV) || defined(_WIN32)
if (w == 0 || h == 0)
return;
- m_last_framedump_width = w;
- m_last_framedump_height = h;
- m_last_framedump_format = format;
- m_last_framedump_stride = stride;
-
// TODO: Refactor this. Right now it's needed for the implace flipping of the image.
m_frame_data.assign(data, data + stride * h);
+ if (swap_upside_down)
+ FlipImageData(m_frame_data.data(), w, h, 4);
- if (!m_last_frame_dumped)
+ // Save screenshot
+ if (s_bScreenshot)
{
- m_AVI_dumping = AVIDump::Start(w, h, format);
- if (!m_AVI_dumping)
+ std::lock_guard<std::mutex> lk(s_criticalScreenshot);
+
+ if (TextureToPng(m_frame_data.data(), stride, s_sScreenshotName, w, h, false))
+ OSD::AddMessage("Screenshot saved to " + s_sScreenshotName);
+
+ // Reset settings
+ s_sScreenshotName.clear();
+ s_bScreenshot = false;
+ s_screenshotCompleted.Set();
+ }
+
+#if defined(HAVE_LIBAV) || defined(_WIN32)
+ if (SConfig::GetInstance().m_DumpFrames)
+ {
+ if (!m_last_frame_dumped)
{
- OSD::AddMessage("AVIDump Start failed", 2000);
+ m_AVI_dumping = AVIDump::Start(w, h);
+ if (!m_AVI_dumping)
+ {
+ OSD::AddMessage("AVIDump Start failed", 2000);
+ }
+ else
+ {
+ OSD::AddMessage(StringFromFormat("Dumping Frames to \"%sframedump0.avi\" (%dx%d RGB24)",
+ File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), w, h),
+ 2000);
+ }
}
- else
+ if (m_AVI_dumping)
{
- OSD::AddMessage(StringFromFormat("Dumping Frames to \"%sframedump0.avi\" (%dx%d RGB24)",
- File::GetUserPath(D_DUMPFRAMES_IDX).c_str(), w, h),
- 2000);
+ AVIDump::AddFrame(m_frame_data.data(), w, h, stride);
}
- }
- if (m_AVI_dumping)
- {
- if (swap_upside_down)
- FlipImageData(m_frame_data.data(), w, h, 4);
- AVIDump::AddFrame(m_frame_data.data(), w, h, stride);
- }
- m_last_frame_dumped = true;
+ m_last_frame_dumped = true;
+ }
#endif
}
diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h
index 9a78ce4a4b..f405ddc5eb 100644
--- a/Source/Core/VideoCommon/RenderBase.h
+++ b/Source/Core/VideoCommon/RenderBase.h
@@ -127,8 +127,6 @@ public:
virtual void SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
const EFBRectangle& rc, float Gamma = 1.0f) = 0;
- virtual bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) = 0;
-
static PEControl::PixelFormat GetPrevPixelFormat() { return prev_efb_format; }
static void StorePixelFormat(PEControl::PixelFormat new_format) { prev_efb_format = new_format; }
PostProcessingShaderImplementation* GetPostProcessor() { return m_post_processor.get(); }
@@ -148,8 +146,7 @@ protected:
static void RecordVideoMemory();
bool IsFrameDumping();
- void DumpFrameData(const u8* data, int w, int h, int stride, AVIDump::DumpFormat format,
- bool swap_upside_down = false);
+ void DumpFrameData(const u8* data, int w, int h, int stride, bool swap_upside_down = false);
void FinishFrameData();
static volatile bool s_bScreenshot;
@@ -192,10 +189,6 @@ private:
std::vector<u8> m_frame_data;
bool m_AVI_dumping = false;
bool m_last_frame_dumped = false;
- int m_last_framedump_width = 0;
- int m_last_framedump_height = 0;
- int m_last_framedump_stride = 0;
- AVIDump::DumpFormat m_last_framedump_format;
};
extern std::unique_ptr<Renderer> g_renderer;