summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
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/VideoBackends
parent562bc01d0e21f103fa9d8ee1993654a81e51fb26 (diff)
parent64927a2f81fe64503060c949ead525995fd63a2a (diff)
Merge pull request #4326 from degasus/framedump
Framedump: Merge screenshot code with framedumping.
Diffstat (limited to 'Source/Core/VideoBackends')
-rw-r--r--Source/Core/VideoBackends/D3D/Render.cpp49
-rw-r--r--Source/Core/VideoBackends/D3D/Render.h2
-rw-r--r--Source/Core/VideoBackends/D3D12/Render.cpp72
-rw-r--r--Source/Core/VideoBackends/D3D12/Render.h2
-rw-r--r--Source/Core/VideoBackends/Null/Render.h4
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp33
-rw-r--r--Source/Core/VideoBackends/OGL/Render.h2
-rw-r--r--Source/Core/VideoBackends/OGL/VertexManager.cpp13
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.h4
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.cpp41
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.h6
11 files changed, 10 insertions, 218 deletions
diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp
index 19f2feb963..9452d03f86 100644
--- a/Source/Core/VideoBackends/D3D/Render.cpp
+++ b/Source/Core/VideoBackends/D3D/Render.cpp
@@ -32,7 +32,6 @@
#include "VideoCommon/AVIDump.h"
#include "VideoCommon/BPFunctions.h"
#include "VideoCommon/Fifo.h"
-#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/PixelEngine.h"
#include "VideoCommon/PixelShaderManager.h"
@@ -712,39 +711,6 @@ void Renderer::SetBlendMode(bool forceUpdate)
}
}
-bool Renderer::SaveScreenshot(const std::string& filename, const TargetRectangle& rc)
-{
- if (!s_screenshot_texture)
- CreateScreenshotTexture();
-
- // copy back buffer to system memory
- D3D11_BOX source_box = GetScreenshotSourceBox(rc);
- D3D::context->CopySubresourceRegion(s_screenshot_texture, 0, 0, 0, 0,
- (ID3D11Resource*)D3D::GetBackBuffer()->GetTex(), 0,
- &source_box);
-
- D3D11_MAPPED_SUBRESOURCE map;
- D3D::context->Map(s_screenshot_texture, 0, D3D11_MAP_READ_WRITE, 0, &map);
-
- bool saved_png =
- TextureToPng((u8*)map.pData, map.RowPitch, filename, source_box.right - source_box.left,
- source_box.bottom - source_box.top, false);
-
- D3D::context->Unmap(s_screenshot_texture, 0);
-
- if (saved_png)
- {
- OSD::AddMessage(
- StringFromFormat("Saved %i x %i %s", rc.GetWidth(), rc.GetHeight(), filename.c_str()));
- }
- else
- {
- OSD::AddMessage(StringFromFormat("Error saving %s", filename.c_str()));
- }
-
- return saved_png;
-}
-
// This function has the final picture. We adjust the aspect ratio here.
void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
const EFBRectangle& rc, float Gamma)
@@ -842,17 +808,6 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
BlitScreen(sourceRc, targetRc, read_texture, GetTargetWidth(), GetTargetHeight(), Gamma);
}
- // done with drawing the game stuff, good moment to save a screenshot
- if (s_bScreenshot)
- {
- std::lock_guard<std::mutex> guard(s_criticalScreenshot);
-
- SaveScreenshot(s_sScreenshotName, GetTargetRectangle());
- s_sScreenshotName.clear();
- s_bScreenshot = false;
- s_screenshotCompleted.Set();
- }
-
// Dump frames
if (IsFrameDumping())
{
@@ -869,8 +824,8 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
D3D11_MAPPED_SUBRESOURCE map;
D3D::context->Map(s_screenshot_texture, 0, D3D11_MAP_READ, 0, &map);
- DumpFrameData(reinterpret_cast<const u8*>(map.pData), source_width, source_height, map.RowPitch,
- AVIDump::DumpFormat::FORMAT_RGBA);
+ DumpFrameData(reinterpret_cast<const u8*>(map.pData), source_width, source_height,
+ map.RowPitch);
FinishFrameData();
D3D::context->Unmap(s_screenshot_texture, 0);
diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h
index 6dec232d33..9119573655 100644
--- a/Source/Core/VideoBackends/D3D/Render.h
+++ b/Source/Core/VideoBackends/D3D/Render.h
@@ -54,8 +54,6 @@ public:
void ReinterpretPixelData(unsigned int convtype) override;
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override;
-
static bool CheckForResize();
u32 GetMaxTextureSize() override;
diff --git a/Source/Core/VideoBackends/D3D12/Render.cpp b/Source/Core/VideoBackends/D3D12/Render.cpp
index 9809e55c02..7e94638321 100644
--- a/Source/Core/VideoBackends/D3D12/Render.cpp
+++ b/Source/Core/VideoBackends/D3D12/Render.cpp
@@ -34,7 +34,6 @@
#include "VideoCommon/AVIDump.h"
#include "VideoCommon/BPFunctions.h"
#include "VideoCommon/Fifo.h"
-#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/PixelEngine.h"
#include "VideoCommon/PixelShaderManager.h"
@@ -631,63 +630,6 @@ void Renderer::SetBlendMode(bool force_update)
D3D::command_list_mgr->SetCommandListDirtyState(COMMAND_LIST_STATE_PSO, true);
}
-bool Renderer::SaveScreenshot(const std::string& filename, const TargetRectangle& rc)
-{
- if (!s_screenshot_texture)
- CreateScreenshotTexture();
-
- // copy back buffer to system memory
- bool saved_png = false;
-
- D3D12_BOX source_box = GetScreenshotSourceBox(rc);
-
- D3D12_TEXTURE_COPY_LOCATION dst_location = {};
- dst_location.pResource = s_screenshot_texture;
- dst_location.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
- dst_location.PlacedFootprint.Offset = 0;
- dst_location.PlacedFootprint.Footprint.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- dst_location.PlacedFootprint.Footprint.Width = D3D::GetBackBufferWidth();
- dst_location.PlacedFootprint.Footprint.Height = D3D::GetBackBufferHeight();
- dst_location.PlacedFootprint.Footprint.Depth = 1;
- dst_location.PlacedFootprint.Footprint.RowPitch = D3D::AlignValue(
- dst_location.PlacedFootprint.Footprint.Width * 4, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
-
- D3D12_TEXTURE_COPY_LOCATION src_location = {};
- src_location.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
- src_location.SubresourceIndex = 0;
- src_location.pResource = D3D::GetBackBuffer()->GetTex12();
-
- D3D::GetBackBuffer()->TransitionToResourceState(D3D::current_command_list,
- D3D12_RESOURCE_STATE_COPY_SOURCE);
- D3D::current_command_list->CopyTextureRegion(&dst_location, 0, 0, 0, &src_location, &source_box);
-
- D3D::command_list_mgr->ExecuteQueuedWork(true);
-
- void* screenshot_texture_map;
- D3D12_RANGE read_range = {0, dst_location.PlacedFootprint.Footprint.RowPitch *
- (source_box.bottom - source_box.top)};
- CheckHR(s_screenshot_texture->Map(0, &read_range, &screenshot_texture_map));
-
- saved_png = TextureToPng(
- static_cast<u8*>(screenshot_texture_map), dst_location.PlacedFootprint.Footprint.RowPitch,
- filename, source_box.right - source_box.left, source_box.bottom - source_box.top, false);
-
- D3D12_RANGE write_range = {};
- s_screenshot_texture->Unmap(0, &write_range);
-
- if (saved_png)
- {
- OSD::AddMessage(
- StringFromFormat("Saved %i x %i %s", rc.GetWidth(), rc.GetHeight(), filename.c_str()));
- }
- else
- {
- OSD::AddMessage(StringFromFormat("Error saving %s", filename.c_str()));
- }
-
- return saved_png;
-}
-
// This function has the final picture. We adjust the aspect ratio here.
void Renderer::SwapImpl(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height,
const EFBRectangle& rc, float gamma)
@@ -797,17 +739,6 @@ void Renderer::SwapImpl(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height
BlitScreen(source_rc, target_rc, read_texture, GetTargetWidth(), GetTargetHeight(), gamma);
}
- // done with drawing the game stuff, good moment to save a screenshot
- if (s_bScreenshot)
- {
- std::lock_guard<std::mutex> guard(s_criticalScreenshot);
-
- SaveScreenshot(s_sScreenshotName, GetTargetRectangle());
- s_sScreenshotName.clear();
- s_bScreenshot = false;
- s_screenshotCompleted.Set();
- }
-
// Dump frames
if (IsFrameDumping())
{
@@ -847,8 +778,7 @@ void Renderer::SwapImpl(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height
CheckHR(s_screenshot_texture->Map(0, &read_range, &screenshot_texture_map));
DumpFrameData(reinterpret_cast<const u8*>(screenshot_texture_map), source_width, source_height,
- dst_location.PlacedFootprint.Footprint.RowPitch,
- AVIDump::DumpFormat::FORMAT_RGBA);
+ dst_location.PlacedFootprint.Footprint.RowPitch);
FinishFrameData();
D3D12_RANGE write_range = {};
diff --git a/Source/Core/VideoBackends/D3D12/Render.h b/Source/Core/VideoBackends/D3D12/Render.h
index 7d6a6ee82d..fabc1680f9 100644
--- a/Source/Core/VideoBackends/D3D12/Render.h
+++ b/Source/Core/VideoBackends/D3D12/Render.h
@@ -54,8 +54,6 @@ public:
void ReinterpretPixelData(unsigned int conv_type) override;
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override;
-
static bool CheckForResize();
u32 GetMaxTextureSize() override;
diff --git a/Source/Core/VideoBackends/Null/Render.h b/Source/Core/VideoBackends/Null/Render.h
index 6ef5428185..73e35d886d 100644
--- a/Source/Core/VideoBackends/Null/Render.h
+++ b/Source/Core/VideoBackends/Null/Render.h
@@ -31,9 +31,5 @@ public:
}
void ReinterpretPixelData(unsigned int convtype) override {}
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override
- {
- return false;
- }
};
}
diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp
index 9e133191b2..047ac0f69e 100644
--- a/Source/Core/VideoBackends/OGL/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Render.cpp
@@ -36,7 +36,6 @@
#include "VideoCommon/BPFunctions.h"
#include "VideoCommon/DriverDetails.h"
#include "VideoCommon/Fifo.h"
-#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/IndexGenerator.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/PixelEngine.h"
@@ -1444,23 +1443,8 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
- // Save screenshot
- if (s_bScreenshot)
- {
- std::lock_guard<std::mutex> lk(s_criticalScreenshot);
-
- if (SaveScreenshot(s_sScreenshotName, flipped_trc))
- OSD::AddMessage("Screenshot saved to " + s_sScreenshotName);
-
- // Reset settings
- s_sScreenshotName.clear();
- s_bScreenshot = false;
- s_screenshotCompleted.Set();
- }
-
if (IsFrameDumping())
{
- std::lock_guard<std::mutex> lk(s_criticalScreenshot);
std::vector<u8> image(flipped_trc.GetWidth() * flipped_trc.GetHeight() * 4);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
@@ -1468,7 +1452,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight,
flipped_trc.GetHeight(), GL_RGBA, GL_UNSIGNED_BYTE, image.data());
DumpFrameData(image.data(), flipped_trc.GetWidth(), flipped_trc.GetHeight(),
- flipped_trc.GetWidth() * 4, AVIDump::DumpFormat::FORMAT_RGBA, true);
+ flipped_trc.GetWidth() * 4, true);
FinishFrameData();
}
// Finish up the current frame, print some stats
@@ -1726,21 +1710,6 @@ void Renderer::SetInterlacingMode()
namespace OGL
{
-bool Renderer::SaveScreenshot(const std::string& filename, const TargetRectangle& back_rc)
-{
- u32 W = back_rc.GetWidth();
- u32 H = back_rc.GetHeight();
- std::unique_ptr<u8[]> data(new u8[W * 4 * H]);
- glPixelStorei(GL_PACK_ALIGNMENT, 1);
-
- glReadPixels(back_rc.left, back_rc.bottom, W, H, GL_RGBA, GL_UNSIGNED_BYTE, data.get());
-
- // Turn image upside down
- FlipImageData(data.get(), W, H, 4);
-
- return TextureToPng(data.get(), W * 4, filename, W, H, false);
-}
-
u32 Renderer::GetMaxTextureSize()
{
// Right now nvidia seems to do something very weird if we try to cache GL_MAX_TEXTURE_SIZE in
diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h
index edfdd0090c..7fb14771b5 100644
--- a/Source/Core/VideoBackends/OGL/Render.h
+++ b/Source/Core/VideoBackends/OGL/Render.h
@@ -101,8 +101,6 @@ public:
void ReinterpretPixelData(unsigned int convtype) override;
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override;
-
u32 GetMaxTextureSize() override;
void ChangeSurface(void* new_surface_handle) override;
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp
index feb2351e49..6b18517555 100644
--- a/Source/Core/VideoBackends/OGL/VertexManager.cpp
+++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp
@@ -220,19 +220,6 @@ void VertexManager::vFlush(bool useDstAlpha)
OpenFStream(fvs, filename, std::ios_base::out);
fvs << prog.shader.strvprog;
}
-
- if (g_ActiveConfig.iLog & CONF_SAVETARGETS)
- {
- std::string filename =
- StringFromFormat("%starg%.3d.png", File::GetUserPath(D_DUMPFRAMES_IDX).c_str(),
- g_ActiveConfig.iSaveTargetId);
- TargetRectangle tr;
- tr.left = 0;
- tr.right = Renderer::GetTargetWidth();
- tr.top = 0;
- tr.bottom = Renderer::GetTargetHeight();
- g_renderer->SaveScreenshot(filename, tr);
- }
#endif
g_Config.iSaveTargetId++;
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h
index 73cc977b31..749a24e782 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.h
+++ b/Source/Core/VideoBackends/Software/SWRenderer.h
@@ -40,8 +40,4 @@ public:
u32 color, u32 z) override;
void ReinterpretPixelData(unsigned int convtype) override {}
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override
- {
- return true;
- };
};
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
index f164f132a7..7192f93169 100644
--- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp
+++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
@@ -29,7 +29,6 @@
#include "VideoCommon/AVIDump.h"
#include "VideoCommon/BPFunctions.h"
#include "VideoCommon/BPMemory.h"
-#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/PixelEngine.h"
#include "VideoCommon/PixelShaderManager.h"
@@ -482,24 +481,13 @@ void Renderer::SwapImpl(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
// Draw to the screenshot buffer if needed.
- bool needs_framedump = IsFrameDumping();
- bool needs_screenshot = s_bScreenshot || needs_framedump;
- if (needs_screenshot && DrawScreenshot(source_rc, efb_color_texture))
+ if (IsFrameDumping() && DrawScreenshot(source_rc, efb_color_texture))
{
- if (s_bScreenshot)
- {
- WriteScreenshot();
- }
-
- if (needs_framedump)
- {
- DumpFrameData(reinterpret_cast<const u8*>(m_screenshot_readback_texture->GetMapPointer()),
- static_cast<int>(m_screenshot_render_texture->GetWidth()),
- static_cast<int>(m_screenshot_render_texture->GetHeight()),
- static_cast<int>(m_screenshot_readback_texture->GetRowStride()),
- AVIDump::DumpFormat::FORMAT_RGBA);
- FinishFrameData();
- }
+ DumpFrameData(reinterpret_cast<const u8*>(m_screenshot_readback_texture->GetMapPointer()),
+ static_cast<int>(m_screenshot_render_texture->GetWidth()),
+ static_cast<int>(m_screenshot_render_texture->GetHeight()),
+ static_cast<int>(m_screenshot_readback_texture->GetRowStride()));
+ FinishFrameData();
}
// Restore the EFB color texture to color attachment ready for rendering the next frame.
@@ -760,23 +748,6 @@ void Renderer::DestroyScreenshotResources()
m_screenshot_readback_texture.reset();
}
-void Renderer::WriteScreenshot()
-{
- std::lock_guard<std::mutex> guard(s_criticalScreenshot);
-
- if (!TextureToPng(reinterpret_cast<u8*>(m_screenshot_readback_texture->GetMapPointer()),
- static_cast<int>(m_screenshot_readback_texture->GetRowStride()),
- s_sScreenshotName, static_cast<int>(m_screenshot_render_texture->GetWidth()),
- static_cast<int>(m_screenshot_render_texture->GetHeight()), false))
- {
- WARN_LOG(VIDEO, "Failed to write screenshot to %s", s_sScreenshotName.c_str());
- }
-
- s_sScreenshotName.clear();
- s_bScreenshot = false;
- s_screenshotCompleted.Set();
-}
-
void Renderer::CheckForTargetResize(u32 fb_width, u32 fb_stride, u32 fb_height)
{
if (FramebufferManagerBase::LastXfbWidth() == fb_stride &&
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h
index b80b6c191b..c97ee50a06 100644
--- a/Source/Core/VideoBackends/Vulkan/Renderer.h
+++ b/Source/Core/VideoBackends/Vulkan/Renderer.h
@@ -49,11 +49,6 @@ public:
void ReinterpretPixelData(unsigned int convtype) override;
- bool SaveScreenshot(const std::string& filename, const TargetRectangle& rc) override
- {
- return false;
- }
-
void ApplyState(bool bUseDstAlpha) override;
void ResetAPIState() override;
@@ -99,7 +94,6 @@ private:
const TargetRectangle& src_rect, const Texture2D* src_tex, bool linear_filter);
bool ResizeScreenshotBuffer(u32 new_width, u32 new_height);
void DestroyScreenshotResources();
- void WriteScreenshot();
FramebufferManager* m_framebuffer_mgr = nullptr;
VkSemaphore m_image_available_semaphore = VK_NULL_HANDLE;