From 27e19f87c63437db641b736429ac3503160f21ae Mon Sep 17 00:00:00 2001 From: Morph <39850852+Morph1984@users.noreply.github.com> Date: Thu, 13 Feb 2020 22:17:28 -0500 Subject: [PATCH 1/4] Add following aspect ratios: 16:9, 21:9, Stretch to Window Available as a drop down within the configure graphics tab. --- src/core/frontend/framebuffer_layout.cpp | 17 +++++++++-- src/core/settings.h | 1 + src/yuzu/configuration/config.cpp | 2 ++ src/yuzu/configuration/configure_graphics.cpp | 2 ++ src/yuzu/configuration/configure_graphics.ui | 30 +++++++++++++++++++ src/yuzu_cmd/config.cpp | 2 ++ src/yuzu_cmd/default_ini.h | 4 +++ src/yuzu_tester/config.cpp | 2 ++ src/yuzu_tester/default_ini.h | 4 +++ 9 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d6d2cf3f0..f94fa0041 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -27,9 +27,22 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { // so just calculate them both even if the other isn't showing. FramebufferLayout res{width, height}; - const float emulation_aspect_ratio{static_cast(ScreenUndocked::Height) / - ScreenUndocked::Width}; const auto window_aspect_ratio = static_cast(height) / width; + float emulation_aspect_ratio; + + switch (Settings::values.aspect_ratio) { + case 0: // 16:9 (Default) + emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + break; + case 1: // 21:9 + emulation_aspect_ratio = 9.f / 21; + break; + case 2: // Stretch to Window + emulation_aspect_ratio = window_aspect_ratio; + break; + default: // 16:9 + emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + } const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); diff --git a/src/core/settings.h b/src/core/settings.h index e1a9a0ffa..f837d3fbc 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -429,6 +429,7 @@ struct Values { int vulkan_device; float resolution_factor; + int aspect_ratio; bool use_frame_limit; u16 frame_limit; bool use_disk_shader_cache; diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index cd94693c1..6209fff75 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -630,6 +630,7 @@ void Config::ReadRendererValues() { Settings::values.vulkan_device = ReadSetting(QStringLiteral("vulkan_device"), 0).toInt(); Settings::values.resolution_factor = ReadSetting(QStringLiteral("resolution_factor"), 1.0).toFloat(); + Settings::values.aspect_ratio = ReadSetting(QStringLiteral("aspect_ratio"), 0).toInt(); Settings::values.use_frame_limit = ReadSetting(QStringLiteral("use_frame_limit"), true).toBool(); Settings::values.frame_limit = ReadSetting(QStringLiteral("frame_limit"), 100).toInt(); @@ -1064,6 +1065,7 @@ void Config::SaveRendererValues() { WriteSetting(QStringLiteral("vulkan_device"), Settings::values.vulkan_device, 0); WriteSetting(QStringLiteral("resolution_factor"), static_cast(Settings::values.resolution_factor), 1.0); + WriteSetting(QStringLiteral("aspect_ratio"), Settings::values.aspect_ratio, 0); WriteSetting(QStringLiteral("use_frame_limit"), Settings::values.use_frame_limit, true); WriteSetting(QStringLiteral("frame_limit"), Settings::values.frame_limit, 100); WriteSetting(QStringLiteral("use_disk_shader_cache"), Settings::values.use_disk_shader_cache, diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index f57a24e36..ea899c080 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -97,6 +97,7 @@ void ConfigureGraphics::SetConfiguration() { ui->api->setCurrentIndex(static_cast(Settings::values.renderer_backend)); ui->resolution_factor_combobox->setCurrentIndex( static_cast(FromResolutionFactor(Settings::values.resolution_factor))); + ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio); ui->use_disk_shader_cache->setEnabled(runtime_lock); ui->use_disk_shader_cache->setChecked(Settings::values.use_disk_shader_cache); ui->use_accurate_gpu_emulation->setChecked(Settings::values.use_accurate_gpu_emulation); @@ -114,6 +115,7 @@ void ConfigureGraphics::ApplyConfiguration() { Settings::values.vulkan_device = vulkan_device; Settings::values.resolution_factor = ToResolutionFactor(static_cast(ui->resolution_factor_combobox->currentIndex())); + Settings::values.aspect_ratio = ui->aspect_ratio_combobox->currentIndex(); Settings::values.use_disk_shader_cache = ui->use_disk_shader_cache->isChecked(); Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked(); Settings::values.use_asynchronous_gpu_emulation = diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index e24372204..ca79909d0 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -138,6 +138,36 @@ + + + + + + Aspect Ratio: + + + + + + + + Default (16:9) + + + + + Force 21:9 + + + + + Stretch to Window + + + + + + diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index b01a36023..96f1ce3af 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -379,6 +379,8 @@ void Config::ReadValues() { Settings::values.resolution_factor = static_cast(sdl2_config->GetReal("Renderer", "resolution_factor", 1.0)); + Settings::values.aspect_ratio = + static_cast(sdl2_config->GetInteger("Renderer", "aspect_ratio", 0)); Settings::values.use_frame_limit = sdl2_config->GetBoolean("Renderer", "use_frame_limit", true); Settings::values.frame_limit = static_cast(sdl2_config->GetInteger("Renderer", "frame_limit", 100)); diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index 00fd88279..6522c9652 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h @@ -122,6 +122,10 @@ use_shader_jit = # factor for the Switch resolution resolution_factor = +# Aspect ratio +# 0: Default (16:9), 1: Force 21:9, 2: Stretch to Window +aspect_ratio = + # Whether to enable V-Sync (caps the framerate at 60FPS) or not. # 0 (default): Off, 1: On use_vsync = diff --git a/src/yuzu_tester/config.cpp b/src/yuzu_tester/config.cpp index 84ab4d687..0ac93b62a 100644 --- a/src/yuzu_tester/config.cpp +++ b/src/yuzu_tester/config.cpp @@ -118,6 +118,8 @@ void Config::ReadValues() { // Renderer Settings::values.resolution_factor = static_cast(sdl2_config->GetReal("Renderer", "resolution_factor", 1.0)); + Settings::values.aspect_ratio = + static_cast(sdl2_config->GetInteger("Renderer", "aspect_ratio", 0)); Settings::values.use_frame_limit = false; Settings::values.frame_limit = 100; Settings::values.use_disk_shader_cache = diff --git a/src/yuzu_tester/default_ini.h b/src/yuzu_tester/default_ini.h index 9a3e86d68..676592db0 100644 --- a/src/yuzu_tester/default_ini.h +++ b/src/yuzu_tester/default_ini.h @@ -26,6 +26,10 @@ use_shader_jit = # factor for the Switch resolution resolution_factor = +# Aspect ratio +# 0: Default (16:9), 1: Force 21:9, 2: Stretch to Window +aspect_ratio = + # Whether to enable V-Sync (caps the framerate at 60FPS) or not. # 0 (default): Off, 1: On use_vsync = From 22f58cca5e0be7a40c8c8fbebe3d45fb68dfcf10 Mon Sep 17 00:00:00 2001 From: Morph <39850852+Morph1984@users.noreply.github.com> Date: Thu, 13 Feb 2020 23:13:23 -0500 Subject: [PATCH 2/4] Use enumeration instead of magic numbers --- src/core/frontend/framebuffer_layout.cpp | 10 +++++----- src/core/frontend/framebuffer_layout.h | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index f94fa0041..d8821f8fd 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -30,17 +30,17 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { const auto window_aspect_ratio = static_cast(height) / width; float emulation_aspect_ratio; - switch (Settings::values.aspect_ratio) { - case 0: // 16:9 (Default) + switch (static_cast(Settings::values.aspect_ratio)) { + case Aspect::AspectDefault: emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; break; - case 1: // 21:9 + case Aspect::Aspect21by9: emulation_aspect_ratio = 9.f / 21; break; - case 2: // Stretch to Window + case Aspect::AspectStretch: emulation_aspect_ratio = window_aspect_ratio; break; - default: // 16:9 + default: emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; } diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index d2370adde..948c140ac 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -18,6 +18,12 @@ enum ScreenDocked : u32 { HeightDocked = 1080, }; +enum class Aspect { + AspectDefault, + Aspect21by9, + AspectStretch, +}; + /// Describes the layout of the window framebuffer struct FramebufferLayout { u32 width{ScreenUndocked::Width}; From 20dc2e3622df0c97e4d41030fd66df1087f8ef7b Mon Sep 17 00:00:00 2001 From: Morph <39850852+Morph1984@users.noreply.github.com> Date: Fri, 14 Feb 2020 00:06:26 -0500 Subject: [PATCH 3/4] Address feedback --- src/core/frontend/framebuffer_layout.cpp | 32 ++++++++++++------------ src/core/frontend/framebuffer_layout.h | 12 +++++++-- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d8821f8fd..1b4f0255e 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -27,22 +27,9 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { // so just calculate them both even if the other isn't showing. FramebufferLayout res{width, height}; - const auto window_aspect_ratio = static_cast(height) / width; - float emulation_aspect_ratio; - - switch (static_cast(Settings::values.aspect_ratio)) { - case Aspect::AspectDefault: - emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - break; - case Aspect::Aspect21by9: - emulation_aspect_ratio = 9.f / 21; - break; - case Aspect::AspectStretch: - emulation_aspect_ratio = window_aspect_ratio; - break; - default: - emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - } + const float window_aspect_ratio = static_cast(height) / width; + float emulation_aspect_ratio = EmulationAspectRatio( + static_cast(Settings::values.aspect_ratio), window_aspect_ratio); const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); @@ -71,4 +58,17 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { return DefaultFrameLayout(width, height); } +float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio) { + switch (aspect) { + case Aspect::Default: + return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + case Aspect::Aspect21by9: + return 9.0f / 21.0f; + case Aspect::StretchToWindow: + return window_aspect_ratio; + default: + return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + } +} + } // namespace Layout diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 948c140ac..7f6fbe468 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -19,9 +19,9 @@ enum ScreenDocked : u32 { }; enum class Aspect { - AspectDefault, + Default, Aspect21by9, - AspectStretch, + StretchToWindow, }; /// Describes the layout of the window framebuffer @@ -54,4 +54,12 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height); */ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); +/** + * Convenience method to determine emulation aspect ratio + * @param aspect Represents the index of aspect ratio in Settings::values.aspect_ratio + * @param window_aspect_ratio Current window aspect ratio + * @return Emulation render window aspect ratio + */ +float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio); + } // namespace Layout From c3d0a0d6277c97d6e3c99914358dce15cc26871c Mon Sep 17 00:00:00 2001 From: Morph <39850852+Morph1984@users.noreply.github.com> Date: Fri, 14 Feb 2020 14:39:04 -0500 Subject: [PATCH 4/4] Add 4:3 aspect ratio and address feedback --- src/core/frontend/framebuffer_layout.cpp | 14 ++++++++------ src/core/frontend/framebuffer_layout.h | 9 +++++---- src/yuzu/configuration/configure_graphics.ui | 5 +++++ src/yuzu_cmd/default_ini.h | 2 +- src/yuzu_tester/default_ini.h | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 1b4f0255e..2dc795d56 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -28,8 +28,8 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { FramebufferLayout res{width, height}; const float window_aspect_ratio = static_cast(height) / width; - float emulation_aspect_ratio = EmulationAspectRatio( - static_cast(Settings::values.aspect_ratio), window_aspect_ratio); + const float emulation_aspect_ratio = EmulationAspectRatio( + static_cast(Settings::values.aspect_ratio), window_aspect_ratio); const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); @@ -58,13 +58,15 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { return DefaultFrameLayout(width, height); } -float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio) { +float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio) { switch (aspect) { - case Aspect::Default: + case AspectRatio::Default: return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - case Aspect::Aspect21by9: + case AspectRatio::R4_3: + return 3.0f / 4.0f; + case AspectRatio::R21_9: return 9.0f / 21.0f; - case Aspect::StretchToWindow: + case AspectRatio::StretchToWindow: return window_aspect_ratio; default: return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 7f6fbe468..1d39c1faf 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -18,9 +18,10 @@ enum ScreenDocked : u32 { HeightDocked = 1080, }; -enum class Aspect { +enum class AspectRatio { Default, - Aspect21by9, + R4_3, + R21_9, StretchToWindow, }; @@ -56,10 +57,10 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); /** * Convenience method to determine emulation aspect ratio - * @param aspect Represents the index of aspect ratio in Settings::values.aspect_ratio + * @param aspect Represents the index of aspect ratio stored in Settings::values.aspect_ratio * @param window_aspect_ratio Current window aspect ratio * @return Emulation render window aspect ratio */ -float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio); +float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio); } // namespace Layout diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index ca79909d0..db60426ab 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -154,6 +154,11 @@ Default (16:9) + + + Force 4:3 + + Force 21:9 diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index 6522c9652..8a2b658cd 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h @@ -123,7 +123,7 @@ use_shader_jit = resolution_factor = # Aspect ratio -# 0: Default (16:9), 1: Force 21:9, 2: Stretch to Window +# 0: Default (16:9), 1: Force 4:3, 2: Force 21:9, 3: Stretch to Window aspect_ratio = # Whether to enable V-Sync (caps the framerate at 60FPS) or not. diff --git a/src/yuzu_tester/default_ini.h b/src/yuzu_tester/default_ini.h index 676592db0..8d93f7b88 100644 --- a/src/yuzu_tester/default_ini.h +++ b/src/yuzu_tester/default_ini.h @@ -27,7 +27,7 @@ use_shader_jit = resolution_factor = # Aspect ratio -# 0: Default (16:9), 1: Force 21:9, 2: Stretch to Window +# 0: Default (16:9), 1: Force 4:3, 2: Force 21:9, 3: Stretch to Window aspect_ratio = # Whether to enable V-Sync (caps the framerate at 60FPS) or not.