diff --git a/Source/Core/VideoCommon/Present.cpp b/Source/Core/VideoCommon/Present.cpp index 4f208f5119..3dfeebfe00 100644 --- a/Source/Core/VideoCommon/Present.cpp +++ b/Source/Core/VideoCommon/Present.cpp @@ -400,35 +400,24 @@ void* Presenter::GetNewSurfaceHandle() u32 Presenter::AutoIntegralScale() const { - const float efb_aspect_ratio = static_cast(EFB_WIDTH) / EFB_HEIGHT; - const float target_aspect_ratio = - static_cast(m_target_rectangle.GetWidth()) / m_target_rectangle.GetHeight(); - - u32 target_width; - u32 target_height; - - // Instead of using the entire window (back buffer) resolution, - // find the portion of it that will actually contain the EFB output, - // and ignore the portion that will likely have black bars. - if (target_aspect_ratio >= efb_aspect_ratio) - { - target_height = m_target_rectangle.GetHeight(); - target_width = static_cast( - std::round((static_cast(m_target_rectangle.GetWidth()) / target_aspect_ratio) * - efb_aspect_ratio)); - } + // Take the source resolution (XFB) and stretch it on the target aspect ratio. + // If the target resolution is larger (on either x or y), we scale the source + // by a integer multiplier until it won't have to be scaled up anymore. + u32 source_width = m_last_xfb_width; + u32 source_height = m_last_xfb_height; + const u32 target_width = m_target_rectangle.GetWidth(); + const u32 target_height = m_target_rectangle.GetHeight(); + const float source_aspect_ratio = (float)source_width / source_height; + const float target_aspect_ratio = (float)target_width / target_height; + if (source_aspect_ratio >= target_aspect_ratio) + source_width = std::round(source_height * target_aspect_ratio); else - { - target_width = m_target_rectangle.GetWidth(); - target_height = static_cast( - std::round((static_cast(m_target_rectangle.GetHeight()) * target_aspect_ratio) / - efb_aspect_ratio)); - } - - // Calculate a scale based on the adjusted window size - u32 width = EFB_WIDTH * target_width / m_last_xfb_width; - u32 height = EFB_HEIGHT * target_height / m_last_xfb_height; - return std::max((width - 1) / EFB_WIDTH + 1, (height - 1) / EFB_HEIGHT + 1); + source_height = std::round(source_width / target_aspect_ratio); + const u32 width_scale = + source_width > 0 ? ((target_width + (source_width - 1)) / source_width) : 1; + const u32 height_scale = + source_height > 0 ? ((target_height + (source_height - 1)) / source_height) : 1; + return std::max(width_scale, height_scale); } void Presenter::SetSuggestedWindowSize(int width, int height)