Merge pull request #4432 from degasus/framedump
Framedump: Inplace encoding.
This commit is contained in:
commit
a7789edc8e
|
@ -768,6 +768,7 @@ Renderer::Renderer()
|
||||||
Renderer::~Renderer()
|
Renderer::~Renderer()
|
||||||
{
|
{
|
||||||
FlushFrameDump();
|
FlushFrameDump();
|
||||||
|
FinishFrameData();
|
||||||
if (m_frame_dumping_pbo[0])
|
if (m_frame_dumping_pbo[0])
|
||||||
glDeleteBuffers(2, m_frame_dumping_pbo.data());
|
glDeleteBuffers(2, m_frame_dumping_pbo.data());
|
||||||
}
|
}
|
||||||
|
@ -1450,7 +1451,6 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
|
||||||
|
|
||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
FlushFrameDump();
|
|
||||||
DumpFrame(flipped_trc, ticks);
|
DumpFrame(flipped_trc, ticks);
|
||||||
|
|
||||||
// Finish up the current frame, print some stats
|
// Finish up the current frame, print some stats
|
||||||
|
@ -1609,6 +1609,7 @@ void Renderer::DumpFrame(const TargetRectangle& flipped_trc, u64 ticks)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
FlushFrameDump();
|
||||||
std::swap(m_frame_dumping_pbo[0], m_frame_dumping_pbo[1]);
|
std::swap(m_frame_dumping_pbo[0], m_frame_dumping_pbo[1]);
|
||||||
std::swap(m_frame_pbo_is_mapped[0], m_frame_pbo_is_mapped[1]);
|
std::swap(m_frame_pbo_is_mapped[0], m_frame_pbo_is_mapped[1]);
|
||||||
std::swap(m_last_frame_width[0], m_last_frame_width[1]);
|
std::swap(m_last_frame_width[0], m_last_frame_width[1]);
|
||||||
|
|
|
@ -705,23 +705,20 @@ void Renderer::RunFrameDumps()
|
||||||
if (!m_frame_dump_thread_running.IsSet())
|
if (!m_frame_dump_thread_running.IsSet())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const auto config = m_frame_dump_config;
|
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();
|
|
||||||
|
|
||||||
if (config.upside_down)
|
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
|
// Save screenshot
|
||||||
if (s_screenshot.TestAndClear())
|
if (s_screenshot.TestAndClear())
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(s_criticalScreenshot);
|
std::lock_guard<std::mutex> 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))
|
false))
|
||||||
OSD::AddMessage("Screenshot saved to " + s_sScreenshotName);
|
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
|
#endif
|
||||||
|
|
||||||
|
m_frame_dump_done.Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_LIBAV) || defined(_WIN32)
|
#if defined(HAVE_LIBAV) || defined(_WIN32)
|
||||||
|
@ -758,16 +757,3 @@ void Renderer::RunFrameDumps()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::FlipImageData(u8* data, int w, int h, int pixel_width)
|
|
||||||
{
|
|
||||||
for (int y = 0; y < h / 2; ++y)
|
|
||||||
{
|
|
||||||
for (int x = 0; x < w; ++x)
|
|
||||||
{
|
|
||||||
for (int delta = 0; delta < pixel_width; ++delta)
|
|
||||||
std::swap(data[(y * w + x) * pixel_width + delta],
|
|
||||||
data[((h - 1 - y) * w + x) * pixel_width + delta]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -122,8 +122,6 @@ public:
|
||||||
virtual u16 BBoxRead(int index) = 0;
|
virtual u16 BBoxRead(int index) = 0;
|
||||||
virtual void BBoxWrite(int index, u16 value) = 0;
|
virtual void BBoxWrite(int index, u16 value) = 0;
|
||||||
|
|
||||||
static void FlipImageData(u8* data, int w, int h, int pixel_width = 3);
|
|
||||||
|
|
||||||
// Finish up the current frame, print some stats
|
// Finish up the current frame, print some stats
|
||||||
static void Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc,
|
static void Swap(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, const EFBRectangle& rc,
|
||||||
u64 ticks, float Gamma = 1.0f);
|
u64 ticks, float Gamma = 1.0f);
|
||||||
|
|
Loading…
Reference in New Issue