From eb3e731e3a6a669ff4ee719c6350e7f38eacf2cd Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Thu, 13 Mar 2025 12:30:35 -0300 Subject: [PATCH] handle games with abnormal aspect ratios --- src/video_core/renderer_vulkan/vk_presenter.cpp | 12 ++++++++---- src/video_core/renderer_vulkan/vk_presenter.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index b909c8a92..4a6a5c7c2 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -315,6 +315,11 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) if (image_id != VideoCore::NULL_IMAGE_ID) { auto& image = texture_cache.GetImage(image_id); vk::Extent2D image_size = {image.info.size.width, image.info.size.height}; + float ratio = (float)image_size.width / (float)image_size.height; + if (ratio != expected_ratio) { + expected_ratio = ratio; + } + image.Transit(vk::ImageLayout::eShaderReadOnlyOptimal, vk::AccessFlagBits2::eShaderRead, {}, cmdbuf); @@ -636,15 +641,14 @@ Frame* Presenter::GetRenderFrame() { } void Presenter::SetExpectedGameSize(s32 width, s32 height) { - constexpr float expectedRatio = 1920.0 / 1080.0f; const float ratio = (float)width / (float)height; expected_frame_height = height; expected_frame_width = width; - if (ratio > expectedRatio) { - expected_frame_width = static_cast(height * expectedRatio); + if (ratio > expected_ratio) { + expected_frame_width = static_cast(height * expected_ratio); } else { - expected_frame_height = static_cast(width / expectedRatio); + expected_frame_height = static_cast(width / expected_ratio); } } diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 8b3bc75a9..ad2708474 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -125,6 +125,7 @@ private: void SetExpectedGameSize(s32 width, s32 height); private: + float expected_ratio{1920.0 / 1080.0f}; u32 expected_frame_width{1920}; u32 expected_frame_height{1080};