diff --git a/Data/Sys/GameSettings/G9S.ini b/Data/Sys/GameSettings/G9S.ini
index 15910279b0..deefdf7f56 100644
--- a/Data/Sys/GameSettings/G9S.ini
+++ b/Data/Sys/GameSettings/G9S.ini
@@ -19,6 +19,6 @@ EmulationIssues = Use directx11 backend with efb scale set at 1x to deal with bl
[Video_Settings]
SafeTextureCacheColorSamples = 0
-InternalResolution = 1
+EFBScale = 2
MSAA = 0
MaxAnisotropy = 0
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
index 619f72d807..205fffce6c 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java
@@ -56,7 +56,7 @@ public final class SettingsFile
public static final String KEY_AUDIO_STRETCH = "AudioStretch";
public static final String KEY_SHOW_FPS = "ShowFPS";
- public static final String KEY_INTERNAL_RES = "InternalResolution";
+ public static final String KEY_INTERNAL_RES = "EFBScale";
public static final String KEY_FSAA = "MSAA";
public static final String KEY_ANISOTROPY = "MaxAnisotropy";
public static final String KEY_POST_SHADER = "PostProcessingShader";
diff --git a/Source/Android/app/src/main/res/values/arrays.xml b/Source/Android/app/src/main/res/values/arrays.xml
index ec9b2cf30f..aa5d87486e 100644
--- a/Source/Android/app/src/main/res/values/arrays.xml
+++ b/Source/Android/app/src/main/res/values/arrays.xml
@@ -111,12 +111,12 @@
- 6x Native (3840x3168) for 4K
- - 1
- 2
- - 3
- 4
- - 5
- 6
+ - 7
+ - 8
+ - 9
diff --git a/Source/Core/Core/Analytics.cpp b/Source/Core/Core/Analytics.cpp
index b1acc2320d..372bf3ab8a 100644
--- a/Source/Core/Core/Analytics.cpp
+++ b/Source/Core/Core/Analytics.cpp
@@ -224,10 +224,10 @@ void DolphinAnalytics::MakePerGameBuilder()
builder.AddData("cfg-gfx-vsync", g_Config.bVSync);
builder.AddData("cfg-gfx-aspect-ratio", g_Config.iAspectRatio);
builder.AddData("cfg-gfx-efb-access", g_Config.bEFBAccessEnable);
+ builder.AddData("cfg-gfx-efb-scale", g_Config.iEFBScale);
builder.AddData("cfg-gfx-efb-copy-format-changes", g_Config.bEFBEmulateFormatChanges);
builder.AddData("cfg-gfx-efb-copy-ram", !g_Config.bSkipEFBCopyToRam);
builder.AddData("cfg-gfx-efb-copy-scaled", g_Config.bCopyEFBScaled);
- builder.AddData("cfg-gfx-internal-resolution", g_Config.iEFBScale);
builder.AddData("cfg-gfx-tc-samples", g_Config.iSafeTextureCache_ColorSamples);
builder.AddData("cfg-gfx-stereo-mode", g_Config.iStereoMode);
builder.AddData("cfg-gfx-per-pixel-lighting", g_Config.bEnablePixelLighting);
diff --git a/Source/Core/Core/Config/GraphicsSettings.cpp b/Source/Core/Core/Config/GraphicsSettings.cpp
index bb0f4e2941..11dc72f3fc 100644
--- a/Source/Core/Core/Config/GraphicsSettings.cpp
+++ b/Source/Core/Core/Config/GraphicsSettings.cpp
@@ -4,13 +4,48 @@
#include "Core/Config/GraphicsSettings.h"
+#include
#include
#include "Common/Config/Config.h"
+#include "Common/StringUtil.h"
#include "VideoCommon/VideoConfig.h"
namespace Config
{
+std::optional ConvertFromLegacyEFBScale(int efb_scale)
+{
+ // In game INIs, -1 was used as a special value meaning
+ // "use the value from the base layer but round it to an integer scale".
+ // We only support integer scales nowadays, so we can simply ignore -1
+ // in game INIs in order to automatically use a previous layer's value.
+ if (efb_scale < 0)
+ return {};
+
+ return efb_scale - (efb_scale > 0) - (efb_scale > 2) - (efb_scale > 4);
+}
+
+std::optional ConvertFromLegacyEFBScale(const std::string& efb_scale)
+{
+ int efb_scale_int;
+ if (!TryParse(efb_scale, &efb_scale_int))
+ return {};
+ return ConvertFromLegacyEFBScale(efb_scale_int);
+}
+
+int ConvertToLegacyEFBScale(int efb_scale)
+{
+ return efb_scale + (efb_scale >= 0) + (efb_scale > 1) + (efb_scale > 2);
+}
+
+std::optional ConvertToLegacyEFBScale(const std::string& efb_scale)
+{
+ int efb_scale_int;
+ if (!TryParse(efb_scale, &efb_scale_int))
+ return {};
+ return ConvertToLegacyEFBScale(efb_scale_int);
+}
+
// Configuration Information
// Graphics.Hardware
@@ -60,7 +95,7 @@ const ConfigInfo GFX_ENABLE_PIXEL_LIGHTING{{System::GFX, "Settings", "Enab
const ConfigInfo GFX_FAST_DEPTH_CALC{{System::GFX, "Settings", "FastDepthCalc"}, true};
const ConfigInfo GFX_MSAA{{System::GFX, "Settings", "MSAA"}, 1};
const ConfigInfo GFX_SSAA{{System::GFX, "Settings", "SSAA"}, false};
-const ConfigInfo GFX_EFB_SCALE{{System::GFX, "Settings", "InternalResolution"}, 1};
+const ConfigInfo GFX_EFB_SCALE{{System::GFX, "Settings", "EFBScale"}, 1};
const ConfigInfo GFX_TEXFMT_OVERLAY_ENABLE{{System::GFX, "Settings", "TexFmtOverlayEnable"},
false};
const ConfigInfo GFX_TEXFMT_OVERLAY_CENTER{{System::GFX, "Settings", "TexFmtOverlayCenter"},
diff --git a/Source/Core/Core/Config/GraphicsSettings.h b/Source/Core/Core/Config/GraphicsSettings.h
index 046675d058..b1ec5c1dac 100644
--- a/Source/Core/Core/Config/GraphicsSettings.h
+++ b/Source/Core/Core/Config/GraphicsSettings.h
@@ -4,12 +4,18 @@
#pragma once
+#include
#include
#include "Common/Config/Config.h"
namespace Config
{
+std::optional ConvertFromLegacyEFBScale(int efb_scale);
+std::optional ConvertFromLegacyEFBScale(const std::string& efb_scale);
+int ConvertToLegacyEFBScale(int efb_scale);
+std::optional ConvertToLegacyEFBScale(const std::string& efb_scale);
+
// Configuration Information
// Graphics.Hardware
diff --git a/Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp b/Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp
index 72e86a4a1f..89850b49dd 100644
--- a/Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp
+++ b/Source/Core/Core/ConfigLoaders/BaseConfigLoader.cpp
@@ -17,6 +17,7 @@
#include "Common/Logging/Log.h"
#include "Common/Config/Config.h"
+#include "Core/Config/GraphicsSettings.h"
#include "Core/ConfigLoaders/IsSettingSaveable.h"
namespace ConfigLoaders
@@ -53,7 +54,19 @@ public:
const IniFile::Section::SectionMap& section_map = section.GetValues();
for (const auto& value : section_map)
- config_section->Set(value.first, value.second);
+ {
+ const Config::ConfigLocation location{system.first, section_name, value.first};
+ if (location == Config::GFX_EFB_SCALE.location)
+ {
+ std::optional efb_scale = Config::ConvertFromLegacyEFBScale(value.second);
+ if (efb_scale)
+ config_section->Set(value.first, *efb_scale);
+ }
+ else
+ {
+ config_section->Set(value.first, value.second);
+ }
+ }
}
}
}
@@ -83,10 +96,20 @@ public:
for (const auto& value : section_values)
{
- if (!IsSettingSaveable({system.first, section->GetName(), value.first}))
+ const Config::ConfigLocation location{system.first, section->GetName(), value.first};
+ if (!IsSettingSaveable(location))
continue;
- ini_section->Set(value.first, value.second);
+ if (location == Config::GFX_EFB_SCALE.location)
+ {
+ std::optional efb_scale = Config::ConvertToLegacyEFBScale(value.second);
+ if (efb_scale)
+ ini_section->Set(value.first, *efb_scale);
+ }
+ else
+ {
+ ini_section->Set(value.first, value.second);
+ }
}
}
diff --git a/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp b/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp
index 8da44163c3..eb36f761f2 100644
--- a/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp
+++ b/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp
@@ -84,7 +84,7 @@ static const INIToLocationMap& GetINIToLocationMap()
{{"Video_Settings", "MSAA"}, {Config::GFX_MSAA.location}},
{{"Video_Settings", "SSAA"}, {Config::GFX_SSAA.location}},
{{"Video_Settings", "ForceTrueColor"}, {Config::GFX_ENHANCE_FORCE_TRUE_COLOR.location}},
- {{"Video_Settings", "InternalResolution"}, {Config::GFX_EFB_SCALE.location}},
+ {{"Video_Settings", "EFBScale"}, {Config::GFX_EFB_SCALE.location}},
{{"Video_Settings", "DisableFog"}, {Config::GFX_DISABLE_FOG.location}},
{{"Video_Settings", "BackendMultithreading"}, {Config::GFX_BACKEND_MULTITHREADING.location}},
{{"Video_Settings", "CommandBufferExecuteInterval"},
@@ -312,7 +312,17 @@ private:
auto* config_section =
config_layer->GetOrCreateSection(mapped_config.system, mapped_config.section);
- config_section->Set(mapped_config.key, value.second);
+
+ if (mapped_config == Config::GFX_EFB_SCALE.location)
+ {
+ std::optional efb_scale = Config::ConvertFromLegacyEFBScale(value.second);
+ if (efb_scale)
+ config_section->Set(mapped_config.key, *efb_scale);
+ }
+ else
+ {
+ config_section->Set(mapped_config.key, value.second);
+ }
}
}
@@ -335,16 +345,25 @@ void INIGameConfigLayerLoader::Save(Config::Layer* config_layer)
{
for (const auto& value : section->GetValues())
{
- if (!IsSettingSaveable({system.first, section->GetName(), value.first}))
+ const Config::ConfigLocation location{system.first, section->GetName(), value.first};
+ if (!IsSettingSaveable(location))
continue;
- const auto ini_location =
- GetINILocationFromConfig({system.first, section->GetName(), value.first});
+ const auto ini_location = GetINILocationFromConfig(location);
if (ini_location.first.empty() && ini_location.second.empty())
continue;
IniFile::Section* ini_section = ini.GetOrCreateSection(ini_location.first);
- ini_section->Set(ini_location.second, value.second);
+ if (location == Config::GFX_EFB_SCALE.location)
+ {
+ std::optional efb_scale = Config::ConvertToLegacyEFBScale(value.second);
+ if (efb_scale)
+ ini_section->Set(ini_location.second, *efb_scale);
+ }
+ else
+ {
+ ini_section->Set(ini_location.second, value.second);
+ }
}
}
}