diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui
index 172fa3e983..7fa1c8b610 100644
--- a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui
+++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui
@@ -94,7 +94,7 @@
-
- Standard (4:3)
+ Standard (4:3/3:2 Progressive)
-
diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.cpp b/pcsx2/GS/Renderers/Common/GSRenderer.cpp
index 25ea20512b..22f0a915a7 100644
--- a/pcsx2/GS/Renderers/Common/GSRenderer.cpp
+++ b/pcsx2/GS/Renderers/Common/GSRenderer.cpp
@@ -422,13 +422,13 @@ GSVector2i GSRenderer::GetInternalResolution()
return m_real_size;
}
-static float GetCurrentAspectRatioFloat()
+static float GetCurrentAspectRatioFloat(bool is_progressive)
{
- static constexpr std::array(AspectRatioType::MaxCount)> ars = { {4.0f / 3.0f, 4.0f / 3.0f, 16.0f / 9.0f} };
- return ars[static_cast(GSConfig.AspectRatio)];
+ static constexpr std::array(AspectRatioType::MaxCount) + 1> ars = { {4.0f / 3.0f, 4.0f / 3.0f, 16.0f / 9.0f, 3.0f / 2.0f} };
+ return ars[static_cast(GSConfig.AspectRatio) + (3u * is_progressive)];
}
-static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 texture_width, s32 texture_height, HostDisplay::Alignment alignment, bool flip_y)
+static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 texture_width, s32 texture_height, HostDisplay::Alignment alignment, bool flip_y, bool is_progressive)
{
const float f_width = static_cast(window_width);
const float f_height = static_cast(window_height);
@@ -436,7 +436,12 @@ static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 text
float targetAr = clientAr;
if (EmuConfig.CurrentAspectRatio == AspectRatioType::R4_3)
- targetAr = 4.0f / 3.0f;
+ {
+ if (is_progressive)
+ targetAr = 3.0f / 2.0f;
+ else
+ targetAr = 4.0f / 3.0f;
+ }
else if (EmuConfig.CurrentAspectRatio == AspectRatioType::R16_9)
targetAr = 16.0f / 9.0f;
@@ -572,7 +577,7 @@ void GSRenderer::VSync(u32 field, bool registers_written)
{
HostDisplay* const display = g_gs_device->GetDisplay();
const GSVector4 draw_rect(CalculateDrawRect(display->GetWindowWidth(), display->GetWindowHeight(),
- current->GetWidth(), current->GetHeight(), display->GetDisplayAlignment(), display->UsesLowerLeftOrigin()));
+ current->GetWidth(), current->GetHeight(), display->GetDisplayAlignment(), display->UsesLowerLeftOrigin(), GetVideoMode() == GSVideoMode::SDTV_480P));
static constexpr ShaderConvert s_shader[5] = {ShaderConvert::COPY, ShaderConvert::SCANLINE,
ShaderConvert::DIAGONAL_FILTER, ShaderConvert::TRIANGULAR_FILTER,
@@ -709,7 +714,7 @@ bool GSRenderer::MakeSnapshot(const std::string& path)
bool GSRenderer::BeginCapture(std::string& filename)
{
- return m_capture.BeginCapture(GetTvRefreshRate(), GetInternalResolution(), GetCurrentAspectRatioFloat(), filename);
+ return m_capture.BeginCapture(GetTvRefreshRate(), GetInternalResolution(), GetCurrentAspectRatioFloat(GetVideoMode() == GSVideoMode::SDTV_480P), filename);
}
void GSRenderer::EndCapture()
@@ -799,7 +804,7 @@ bool GSRenderer::SaveSnapshotToMemory(u32 width, u32 height, std::vector* p
return false;
GSVector4 draw_rect(CalculateDrawRect(width, height, current->GetWidth(), current->GetHeight(),
- HostDisplay::Alignment::LeftOrTop, false));
+ HostDisplay::Alignment::LeftOrTop, false, GetVideoMode() == GSVideoMode::SDTV_480P));
u32 draw_width = static_cast(draw_rect.z - draw_rect.x);
u32 draw_height = static_cast(draw_rect.w - draw_rect.y);
if (draw_width > width)
diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp
index f9c9185a2a..c8ace8b9cb 100644
--- a/pcsx2/Pcsx2Config.cpp
+++ b/pcsx2/Pcsx2Config.cpp
@@ -263,13 +263,13 @@ void Pcsx2Config::CpuOptions::LoadSave(SettingsWrapper& wrap)
const char* Pcsx2Config::GSOptions::AspectRatioNames[] = {
"Stretch",
- "4:3",
+ "4:3/3:2 (Progressive)",
"16:9",
nullptr};
const char* Pcsx2Config::GSOptions::FMVAspectRatioSwitchNames[] = {
"Off",
- "4:3",
+ "4:3/3:2 (Progressive)",
"16:9",
nullptr};
diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp
index f7042ba37a..9a14c779e0 100644
--- a/pcsx2/gui/AppConfig.cpp
+++ b/pcsx2/gui/AppConfig.cpp
@@ -874,7 +874,7 @@ void AppConfig::GSWindowOptions::LoadSave(IniInterface& ini)
static const wxChar* AspectRatioNames[] =
{
L"Stretch",
- L"4:3",
+ L"4:3/3:2 (Progressive)",
L"16:9",
// WARNING: array must be NULL terminated to compute it size
NULL};
@@ -886,7 +886,7 @@ void AppConfig::GSWindowOptions::LoadSave(IniInterface& ini)
static const wxChar* FMVAspectRatioSwitchNames[] =
{
L"Off",
- L"4:3",
+ L"4:3/3:2 (Progressive)",
L"16:9",
// WARNING: array must be NULL terminated to compute it size
NULL};
diff --git a/pcsx2/gui/Panels/GSWindowPanel.cpp b/pcsx2/gui/Panels/GSWindowPanel.cpp
index e3f71cc09a..4b2943cfd9 100644
--- a/pcsx2/gui/Panels/GSWindowPanel.cpp
+++ b/pcsx2/gui/Panels/GSWindowPanel.cpp
@@ -32,13 +32,13 @@ Panels::GSWindowSettingsPanel::GSWindowSettingsPanel(wxWindow* parent)
const wxString aspect_ratio_labels[] =
{
_("Fit to Window/Screen"),
- _("Standard (4:3)"),
+ _("Standard (4:3/3:2 Progressive)"),
_("Widescreen (16:9)")};
const wxString fmv_aspect_ratio_switch_labels[] =
{
_("Off (Default)"),
- _("Standard (4:3)"),
+ _("Standard (4:3/3:2 Progressive)"),
_("Widescreen (16:9)")};
// Warning must match the order of the VsyncMode Enum
@@ -74,7 +74,7 @@ Panels::GSWindowSettingsPanel::GSWindowSettingsPanel(wxWindow* parent)
m_check_DclickFullscreen = new pxCheckBox(this, _("Double-click toggles fullscreen mode"));
m_combo_FMVAspectRatioSwitch->SetToolTip(pxEt(L"Off: Disables temporary aspect ratio switch. (It will use the above setting from Aspect Ratio instead of FMV Aspect Ratio Override.)\n\n"
- L"4:3: Temporarily switch to a 4:3 aspect ratio while an FMV plays to correctly display an 4:3 FMV.\n\n"
+ L"4:3: Temporarily switch to a 4:3 aspect ratio while an FMV plays to correctly display an 4:3 FMV. Will use 3:2 is the resolution is 480P\n\n"
L"16:9: Temporarily switch to a 16:9 aspect ratio while an FMV plays to correctly display a widescreen 16:9 FMV."));
m_text_Zoom->SetToolTip(pxEt(L"Zoom = 100: Fit the entire image to the window without any cropping.\n"