diff --git a/android/app/src/main/res/values-it/arrays.xml b/android/app/src/main/res/values-it/arrays.xml
index 417d93627..43b7563f1 100644
--- a/android/app/src/main/res/values-it/arrays.xml
+++ b/android/app/src/main/res/values-it/arrays.xml
@@ -49,6 +49,7 @@
- 16:9
- 16:10
- 19:9
+ - 20:9
- 21:9
- 32:9
- 8:7
diff --git a/android/app/src/main/res/values-nl/arrays.xml b/android/app/src/main/res/values-nl/arrays.xml
index 9b7f2af00..be650c233 100644
--- a/android/app/src/main/res/values-nl/arrays.xml
+++ b/android/app/src/main/res/values-nl/arrays.xml
@@ -49,6 +49,7 @@
- 16:9
- 16:10
- 19:9
+ - 20:9
- 21:9
- 32:9
- 8:7
diff --git a/android/app/src/main/res/values-pt-rBR/arrays.xml b/android/app/src/main/res/values-pt-rBR/arrays.xml
index ef02a535e..59c146e9e 100644
--- a/android/app/src/main/res/values-pt-rBR/arrays.xml
+++ b/android/app/src/main/res/values-pt-rBR/arrays.xml
@@ -49,6 +49,7 @@
- 16:9
- 16:10
- 19:9
+ - 20:9
- 21:9
- 32:9
- 8:7
diff --git a/android/app/src/main/res/values/arrays.xml b/android/app/src/main/res/values/arrays.xml
index 4da2b1ae1..ebb828185 100644
--- a/android/app/src/main/res/values/arrays.xml
+++ b/android/app/src/main/res/values/arrays.xml
@@ -93,6 +93,7 @@
- 16:9
- 16:10
- 19:9
+ - 20:9
- 21:9
- 32:9
- 8:7
@@ -108,6 +109,7 @@
- 16:9
- 16:10
- 19:9
+ - 20:9
- 21:9
- 32:9
- 8:7
diff --git a/src/core/gte.cpp b/src/core/gte.cpp
index 16224789b..c12c418b7 100644
--- a/src/core/gte.cpp
+++ b/src/core/gte.cpp
@@ -631,6 +631,10 @@ static void RTPS(const s16 V[3], u8 shift, bool lm, bool last)
Sx = ((((s64(result) * s64(REGS.IR1)) * s64(12)) / s64(19)) + s64(REGS.OFX));
break;
+ case DisplayAspectRatio::R20_9:
+ Sx = ((((s64(result) * s64(REGS.IR1)) * s64(3)) / s64(5)) + s64(REGS.OFX));
+ break;
+
case DisplayAspectRatio::R21_9:
Sx = ((((s64(result) * s64(REGS.IR1)) * s64(9)) / s64(16)) + s64(REGS.OFX));
break;
@@ -728,6 +732,10 @@ static void RTPS(const s16 V[3], u8 shift, bool lm, bool last)
precise_x = (precise_x * 12.0f) / 19.0f;
break;
+ case DisplayAspectRatio::R20_9:
+ precise_x = (precise_x * 3.0f) / 5.0f;
+ break;
+
case DisplayAspectRatio::R21_9:
precise_x = (precise_x * 9.0f) / 16.0f;
break;
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index bcfd02b2e..1d08b8ed7 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -697,12 +697,12 @@ const char* Settings::GetDisplayCropModeDisplayName(DisplayCropMode crop_mode)
return s_display_crop_mode_display_names[static_cast(crop_mode)];
}
-static std::array s_display_aspect_ratio_names = {
- {TRANSLATABLE("DisplayAspectRatio", "Auto (Game Native)"), "4:3", "16:9", "16:10", "19:9", "21:9", "32:9", "8:7",
- "5:4", "3:2", "2:1 (VRAM 1:1)", "1:1", "PAR 1:1"}};
-static constexpr std::array s_display_aspect_ratio_values = {
- {-1.0f, 4.0f / 3.0f, 16.0f / 9.0f, 16.0f / 10.0f, 19.0f / 9.0f, 64.0f / 27.0f, 32.0f / 9.0f, 8.0f / 7.0f, 5.0f / 4.0f,
- 3.0f / 2.0f, 2.0f / 1.0f, 1.0f, -1.0f}};
+static std::array s_display_aspect_ratio_names = {
+ {TRANSLATABLE("DisplayAspectRatio", "Auto (Game Native)"), "4:3", "16:9", "16:10", "19:9", "20:9", "21:9", "32:9",
+ "8:7", "5:4", "3:2", "2:1 (VRAM 1:1)", "1:1", "PAR 1:1"}};
+static constexpr std::array s_display_aspect_ratio_values = {
+ {-1.0f, 4.0f / 3.0f, 16.0f / 9.0f, 16.0f / 10.0f, 19.0f / 9.0f, 20.0f / 9.0f, 64.0f / 27.0f, 32.0f / 9.0f,
+ 8.0f / 7.0f, 5.0f / 4.0f, 3.0f / 2.0f, 2.0f / 1.0f, 1.0f, -1.0f}};
std::optional Settings::ParseDisplayAspectRatio(const char* str)
{
diff --git a/src/core/types.h b/src/core/types.h
index 0a0112756..e17fbe8cd 100644
--- a/src/core/types.h
+++ b/src/core/types.h
@@ -98,6 +98,7 @@ enum class DisplayAspectRatio : u8
R16_9,
R16_10,
R19_9,
+ R20_9,
R21_9,
R32_9,
R8_7,
diff --git a/src/frontend-common/game_list.h b/src/frontend-common/game_list.h
index 2122c5c7f..9bc7aa929 100644
--- a/src/frontend-common/game_list.h
+++ b/src/frontend-common/game_list.h
@@ -108,7 +108,7 @@ private:
enum : u32
{
GAME_LIST_CACHE_SIGNATURE = 0x45434C47,
- GAME_LIST_CACHE_VERSION = 20
+ GAME_LIST_CACHE_VERSION = 21
};
using DatabaseMap = std::unordered_map;