diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index b6810eef9a..ef7353d779 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -33,21 +33,30 @@ VkSurfaceFormatKHR ChooseSwapSurfaceFormat(vk::Span formats) return found != formats.end() ? *found : formats[0]; } -VkPresentModeKHR ChooseSwapPresentMode(vk::Span modes) { +VkPresentModeKHR ChooseSwapPresentMode(vk::Span modes, VkDriverIdKHR driver_id) { // Mailbox (triple buffering) doesn't lock the application like fifo (vsync), - // prefer it if vsync option is not selected + // prefer it if vsync option is not selected. + // FIFO present mode locks the framerate to the monitor's refresh rate, + // find an alternative to surpass this limitation if FPS is unlocked. + // AMD proprietary drivers can't render past the screen's refresh rate, + // immediate wil be enforced instead. const auto found_mailbox = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR); - if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Borderless && - found_mailbox != modes.end() && !Settings::values.use_vsync.GetValue()) { - return VK_PRESENT_MODE_MAILBOX_KHR; + const auto found_imm = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_IMMEDIATE_KHR); + const bool is_amd = driver_id == VK_DRIVER_ID_AMD_PROPRIETARY_KHR; + if (!Settings::values.use_speed_limit.GetValue() && found_imm != modes.end()) { + return VK_PRESENT_MODE_IMMEDIATE_KHR; } - if (!Settings::values.use_speed_limit.GetValue()) { - // FIFO present mode locks the framerate to the monitor's refresh rate, - // Find an alternative to surpass this limitation if FPS is unlocked. - const auto found_imm = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_IMMEDIATE_KHR); - if (found_imm != modes.end()) { + if (Settings::values.use_vsync.GetValue()) { + if (found_mailbox != modes.end()) { + return VK_PRESENT_MODE_MAILBOX_KHR; + } + } else { + if (is_amd && found_imm != modes.end()) { return VK_PRESENT_MODE_IMMEDIATE_KHR; } + if (found_mailbox != modes.end()) { + return VK_PRESENT_MODE_MAILBOX_KHR; + } } return VK_PRESENT_MODE_FIFO_KHR; }