diff options
| author | 2021-07-26 01:52:33 -0400 | |
|---|---|---|
| committer | 2021-07-28 21:46:08 -0400 | |
| commit | 7ac99bb127fe6c09794b7e7ebe4d1c518817f40a (patch) | |
| tree | 7ed5381e6e328611773754fb8a800559c7e0b692 | |
| parent | renderer_vulkan: Implement screenshots (diff) | |
| download | yuzu-7ac99bb127fe6c09794b7e7ebe4d1c518817f40a.tar.gz yuzu-7ac99bb127fe6c09794b7e7ebe4d1c518817f40a.tar.xz yuzu-7ac99bb127fe6c09794b7e7ebe4d1c518817f40a.zip | |
renderers: Add explicit invert_y bool to screenshot callback
OpenGL and Vulkan images render in different coordinate systems. This allows us to specify the coordinate system of the screenshot within each renderer
| -rw-r--r-- | src/video_core/renderer_base.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_base.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/bootmanager.cpp | 4 |
5 files changed, 7 insertions, 7 deletions
diff --git a/src/video_core/renderer_base.cpp b/src/video_core/renderer_base.cpp index 3ea72fda9..a99c33c37 100644 --- a/src/video_core/renderer_base.cpp +++ b/src/video_core/renderer_base.cpp | |||
| @@ -27,7 +27,7 @@ void RendererBase::UpdateCurrentFramebufferLayout() { | |||
| 27 | render_window.UpdateCurrentFramebufferLayout(layout.width, layout.height); | 27 | render_window.UpdateCurrentFramebufferLayout(layout.width, layout.height); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | void RendererBase::RequestScreenshot(void* data, std::function<void()> callback, | 30 | void RendererBase::RequestScreenshot(void* data, std::function<void(bool)> callback, |
| 31 | const Layout::FramebufferLayout& layout) { | 31 | const Layout::FramebufferLayout& layout) { |
| 32 | if (renderer_settings.screenshot_requested) { | 32 | if (renderer_settings.screenshot_requested) { |
| 33 | LOG_ERROR(Render, "A screenshot is already requested or in progress, ignoring the request"); | 33 | LOG_ERROR(Render, "A screenshot is already requested or in progress, ignoring the request"); |
diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index 22b80c328..bb204454e 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h | |||
| @@ -24,7 +24,7 @@ struct RendererSettings { | |||
| 24 | // Screenshot | 24 | // Screenshot |
| 25 | std::atomic<bool> screenshot_requested{false}; | 25 | std::atomic<bool> screenshot_requested{false}; |
| 26 | void* screenshot_bits{}; | 26 | void* screenshot_bits{}; |
| 27 | std::function<void()> screenshot_complete_callback; | 27 | std::function<void(bool)> screenshot_complete_callback; |
| 28 | Layout::FramebufferLayout screenshot_framebuffer_layout; | 28 | Layout::FramebufferLayout screenshot_framebuffer_layout; |
| 29 | }; | 29 | }; |
| 30 | 30 | ||
| @@ -80,7 +80,7 @@ public: | |||
| 80 | void RefreshBaseSettings(); | 80 | void RefreshBaseSettings(); |
| 81 | 81 | ||
| 82 | /// Request a screenshot of the next frame | 82 | /// Request a screenshot of the next frame |
| 83 | void RequestScreenshot(void* data, std::function<void()> callback, | 83 | void RequestScreenshot(void* data, std::function<void(bool)> callback, |
| 84 | const Layout::FramebufferLayout& layout); | 84 | const Layout::FramebufferLayout& layout); |
| 85 | 85 | ||
| 86 | protected: | 86 | protected: |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index f1b00c24c..7d7cba69c 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -486,7 +486,7 @@ void RendererOpenGL::RenderScreenshot() { | |||
| 486 | glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read_fb); | 486 | glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read_fb); |
| 487 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw_fb); | 487 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw_fb); |
| 488 | 488 | ||
| 489 | renderer_settings.screenshot_complete_callback(); | 489 | renderer_settings.screenshot_complete_callback(true); |
| 490 | renderer_settings.screenshot_requested = false; | 490 | renderer_settings.screenshot_requested = false; |
| 491 | } | 491 | } |
| 492 | 492 | ||
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index c92718a1f..7c9b0d6db 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -339,7 +339,7 @@ void Vulkan::RendererVulkan::RenderScreenshot(const Tegra::FramebufferConfig& fr | |||
| 339 | // Copy backing image data to the QImage screenshot buffer | 339 | // Copy backing image data to the QImage screenshot buffer |
| 340 | const auto dst_memory_map = dst_buffer_memory.Map(); | 340 | const auto dst_memory_map = dst_buffer_memory.Map(); |
| 341 | std::memcpy(renderer_settings.screenshot_bits, dst_memory_map.data(), dst_memory_map.size()); | 341 | std::memcpy(renderer_settings.screenshot_bits, dst_memory_map.data(), dst_memory_map.size()); |
| 342 | renderer_settings.screenshot_complete_callback(); | 342 | renderer_settings.screenshot_complete_callback(false); |
| 343 | renderer_settings.screenshot_requested = false; | 343 | renderer_settings.screenshot_requested = false; |
| 344 | } | 344 | } |
| 345 | 345 | ||
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 25b658b2a..2e0ade815 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp | |||
| @@ -632,9 +632,9 @@ void GRenderWindow::CaptureScreenshot(u32 res_scale, const QString& screenshot_p | |||
| 632 | screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32); | 632 | screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32); |
| 633 | renderer.RequestScreenshot( | 633 | renderer.RequestScreenshot( |
| 634 | screenshot_image.bits(), | 634 | screenshot_image.bits(), |
| 635 | [=, this] { | 635 | [=, this](bool invert_y) { |
| 636 | const std::string std_screenshot_path = screenshot_path.toStdString(); | 636 | const std::string std_screenshot_path = screenshot_path.toStdString(); |
| 637 | if (screenshot_image.mirrored(false, true).save(screenshot_path)) { | 637 | if (screenshot_image.mirrored(false, invert_y).save(screenshot_path)) { |
| 638 | LOG_INFO(Frontend, "Screenshot saved to \"{}\"", std_screenshot_path); | 638 | LOG_INFO(Frontend, "Screenshot saved to \"{}\"", std_screenshot_path); |
| 639 | } else { | 639 | } else { |
| 640 | LOG_ERROR(Frontend, "Failed to save screenshot to \"{}\"", std_screenshot_path); | 640 | LOG_ERROR(Frontend, "Failed to save screenshot to \"{}\"", std_screenshot_path); |