From 4a4244f04d80dbca76aa560debe139aa6121125b Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Sat, 22 May 2021 19:58:27 -0700 Subject: [PATCH] Software: Fix bad backbuffer size MAX_XFB_WIDTH/HEIGHT are the largest XFB sizes seen in practice, but do not make sense to use for the backbuffer size, which should be the size of the window. The old code created screenshots with a size of 720x540 on NTSC games when "Dump Frames at Internal Resolution" is unchecked; now, the window size is used. --- Source/Core/VideoBackends/Software/SWRenderer.cpp | 15 ++++++++++++++- Source/Core/VideoBackends/Software/SWRenderer.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp index 51433d311f..cde409d321 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.cpp +++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp @@ -27,7 +27,8 @@ namespace SW { SWRenderer::SWRenderer(std::unique_ptr window) - : ::Renderer(static_cast(MAX_XFB_WIDTH), static_cast(MAX_XFB_HEIGHT), 1.0f, + : ::Renderer(static_cast(std::max(window->GetContext()->GetBackBufferWidth(), 1u)), + static_cast(std::max(window->GetContext()->GetBackBufferHeight(), 1u)), 1.0f, AbstractTextureFormat::RGBA8), m_window(std::move(window)) { @@ -56,6 +57,18 @@ SWRenderer::CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture static_cast(depth_attachment)); } +void SWRenderer::BindBackbuffer(const ClearColor& clear_color) +{ + // Look for framebuffer resizes + if (!m_surface_resized.TestAndClear()) + return; + + GLContext* context = m_window->GetContext(); + context->Update(); + m_backbuffer_width = context->GetBackBufferWidth(); + m_backbuffer_height = context->GetBackBufferHeight(); +} + class SWShader final : public AbstractShader { public: diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h index f2434d92c0..7c47207326 100644 --- a/Source/Core/VideoBackends/Software/SWRenderer.h +++ b/Source/Core/VideoBackends/Software/SWRenderer.h @@ -27,6 +27,8 @@ public: std::unique_ptr CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment) override; + void BindBackbuffer(const ClearColor& clear_color = {}) override; + std::unique_ptr CreateShaderFromSource(ShaderStage stage, std::string_view source) override; std::unique_ptr CreateShaderFromBinary(ShaderStage stage, const void* data,