From c422fb7e82e2ebc89c06aef1d3fbe964657fffb4 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 5 Oct 2016 22:02:04 +1000 Subject: [PATCH 1/3] Vulkan: Set alpha channel of swap chain buffers to 1.0. Copying the alpha channel from the game causes issues with frame dumping, since we're using a buffer directly from the GPU as a source for AVIDump. --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 2 +- Source/Core/VideoBackends/Vulkan/Renderer.h | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 7bb15aacdf..36be733b39 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -1521,7 +1521,7 @@ bool Renderer::CompileShaders() void main() { - ocol0 = texture(samp0, uv0); + ocol0 = float4(texture(samp0, uv0).xyz, 1.0); } )"; diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h index 18fa5cc0c4..f292d722a0 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.h +++ b/Source/Core/VideoBackends/Vulkan/Renderer.h @@ -118,6 +118,10 @@ private: // Shaders used for clear/blit. VkShaderModule m_clear_fragment_shader = VK_NULL_HANDLE; + + // NOTE: The blit shader here is used for the final copy from the source buffer(s) to the swap + // chain buffer for presentation. It ignores the alpha channel of the input image and sets the + // alpha channel to 1.0 to avoid issues with frame dumping and screenshots. VkShaderModule m_blit_fragment_shader = VK_NULL_HANDLE; // Texture used for screenshot/frame dumping From 400ba3c7e52b47d061a6abd95999c47da539ec4b Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 5 Oct 2016 22:03:43 +1000 Subject: [PATCH 2/3] Vulkan: Stop dumping frames on shutdown if left enabled --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 36be733b39..74e2707a5d 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -65,6 +65,15 @@ Renderer::Renderer(std::unique_ptr swap_chain) : m_swap_chain(std::mo Renderer::~Renderer() { +#if defined(HAVE_LIBAV) || defined(_WIN32) + // Stop frame dumping if it was left enabled at shutdown time. + if (bAVIDumping) + { + AVIDump::Stop(); + bAVIDumping = false; + } +#endif + g_Config.bRunning = false; UpdateActiveConfig(); DestroyScreenshotResources(); From b39ac950eb8fa71fd745e4c42d2805d3317daeda Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 5 Oct 2016 22:27:37 +1000 Subject: [PATCH 3/3] Vulkan: Don't save borders to screenshots/frame dumps This matches the behavior on GL, making for easier comparisons. --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 74e2707a5d..c8f9aaa4d3 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -618,8 +618,15 @@ void Renderer::DrawScreen(const TargetRectangle& src_rect, const Texture2D* src_ bool Renderer::DrawScreenshot(const TargetRectangle& src_rect, const Texture2D* src_tex) { - u32 width = std::max(1u, static_cast(s_backbuffer_width)); - u32 height = std::max(1u, static_cast(s_backbuffer_height)); + // Draw the screenshot to an image containing only the active screen area, removing any + // borders as a result of the game rendering in a different aspect ratio. + TargetRectangle target_rect = GetTargetRectangle(); + target_rect.right = target_rect.GetWidth(); + target_rect.bottom = target_rect.GetHeight(); + target_rect.left = 0; + target_rect.top = 0; + u32 width = std::max(1u, static_cast(target_rect.GetWidth())); + u32 height = std::max(1u, static_cast(target_rect.GetHeight())); if (!ResizeScreenshotBuffer(width, height)) return false; @@ -637,8 +644,8 @@ bool Renderer::DrawScreenshot(const TargetRectangle& src_rect, const Texture2D* VK_SUBPASS_CONTENTS_INLINE); vkCmdClearAttachments(g_command_buffer_mgr->GetCurrentCommandBuffer(), 1, &clear_attachment, 1, &clear_rect); - BlitScreen(m_framebuffer_mgr->GetColorCopyForReadbackRenderPass(), GetTargetRectangle(), src_rect, - src_tex, true); + BlitScreen(m_framebuffer_mgr->GetColorCopyForReadbackRenderPass(), target_rect, src_rect, src_tex, + true); vkCmdEndRenderPass(g_command_buffer_mgr->GetCurrentCommandBuffer()); // Copy to the readback texture.