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"