From 47e8d90e25c5857bcfd4604dee6d9c7ff8255314 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 12 Aug 2025 00:33:59 +1000 Subject: [PATCH] GPU: Fix screenshot size when showing VRAM --- src/core/gpu_presenter.cpp | 50 ++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/core/gpu_presenter.cpp b/src/core/gpu_presenter.cpp index 83dc317ea..bead15c6b 100644 --- a/src/core/gpu_presenter.cpp +++ b/src/core/gpu_presenter.cpp @@ -1199,35 +1199,39 @@ bool GPUPresenter::RenderScreenshotToBuffer(u32 width, u32 height, bool postfx, GSVector2i GPUPresenter::CalculateScreenshotSize(DisplayScreenshotMode mode) const { - const bool internal_resolution = (mode != DisplayScreenshotMode::ScreenResolution || g_gpu_settings.gpu_show_vram); - if (internal_resolution && m_display_texture_view_width != 0 && m_display_texture_view_height != 0) + if (m_display_texture_view_width != 0 && m_display_texture_view_height != 0) { - float f_width = - m_display_width * (static_cast(m_display_texture_view_width) / static_cast(m_display_vram_width)); - float f_height = m_display_height * - (static_cast(m_display_texture_view_height) / static_cast(m_display_vram_height)); - if (!g_gpu_settings.gpu_show_vram && mode != DisplayScreenshotMode::UncorrectedInternalResolution) - GPU::ApplyPixelAspectRatioToSize(m_display_pixel_aspect_ratio, &f_width, &f_height); - - // DX11 won't go past 16K texture size. - const float max_texture_size = static_cast(g_gpu_device->GetMaxTextureSize()); - if (f_width > max_texture_size) + if (g_gpu_settings.gpu_show_vram) { - f_height = f_height / (f_width / max_texture_size); - f_width = max_texture_size; + return GSVector2i(m_display_texture_view_width, m_display_texture_view_height); } - if (f_height > max_texture_size) + else if (mode != DisplayScreenshotMode::ScreenResolution) { - f_height = max_texture_size; - f_width = f_width / (f_height / max_texture_size); - } + float f_width = + m_display_width * (static_cast(m_display_texture_view_width) / static_cast(m_display_vram_width)); + float f_height = m_display_height * + (static_cast(m_display_texture_view_height) / static_cast(m_display_vram_height)); + if (mode != DisplayScreenshotMode::UncorrectedInternalResolution) + GPU::ApplyPixelAspectRatioToSize(m_display_pixel_aspect_ratio, &f_width, &f_height); + + // DX11 won't go past 16K texture size. + const float max_texture_size = static_cast(g_gpu_device->GetMaxTextureSize()); + if (f_width > max_texture_size) + { + f_height = f_height / (f_width / max_texture_size); + f_width = max_texture_size; + } + if (f_height > max_texture_size) + { + f_height = max_texture_size; + f_width = f_width / (f_height / max_texture_size); + } - return GSVector2i(static_cast(std::ceil(f_width)), static_cast(std::ceil(f_height))); - } - else - { - return g_gpu_device->HasMainSwapChain() ? g_gpu_device->GetMainSwapChain()->GetSizeVec() : GSVector2i(1, 1); + return GSVector2i(static_cast(std::ceil(f_width)), static_cast(std::ceil(f_height))); + } } + + return g_gpu_device->HasMainSwapChain() ? g_gpu_device->GetMainSwapChain()->GetSizeVec() : GSVector2i(1, 1); } void GPUPresenter::LoadPostProcessingSettings(bool force_load)