Vulkan Swapchain: Overall improvements.

This commit is contained in:
Fernando Sahmkow 2022-04-18 23:21:02 +02:00
parent 8d774e7415
commit cdce7f781b
3 changed files with 17 additions and 6 deletions

View file

@ -147,7 +147,7 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
const auto recreate_swapchain = [&] { const auto recreate_swapchain = [&] {
if (!has_been_recreated) { if (!has_been_recreated) {
has_been_recreated = true; has_been_recreated = true;
scheduler.WaitWorker(); scheduler.Finish();
} }
const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout(); const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout();
swapchain.Create(layout.width, layout.height, is_srgb); swapchain.Create(layout.width, layout.height, is_srgb);

View file

@ -36,7 +36,8 @@ VkPresentModeKHR ChooseSwapPresentMode(vk::Span<VkPresentModeKHR> modes) {
// Mailbox (triple buffering) doesn't lock the application like fifo (vsync), // 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
const auto found_mailbox = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR); const auto found_mailbox = std::find(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR);
if (found_mailbox != modes.end() && !Settings::values.use_vsync.GetValue()) { if (Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Borderless &&
found_mailbox != modes.end() && !Settings::values.use_vsync.GetValue()) {
return VK_PRESENT_MODE_MAILBOX_KHR; return VK_PRESENT_MODE_MAILBOX_KHR;
} }
if (!Settings::values.use_speed_limit.GetValue()) { if (!Settings::values.use_speed_limit.GetValue()) {
@ -156,8 +157,16 @@ void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities, u3
present_mode = ChooseSwapPresentMode(present_modes); present_mode = ChooseSwapPresentMode(present_modes);
u32 requested_image_count{capabilities.minImageCount + 1}; u32 requested_image_count{capabilities.minImageCount + 1};
if (capabilities.maxImageCount > 0 && requested_image_count > capabilities.maxImageCount) { // Ensure Tripple buffering if possible.
requested_image_count = capabilities.maxImageCount; if (capabilities.maxImageCount > 0) {
if (requested_image_count > capabilities.maxImageCount) {
requested_image_count = capabilities.maxImageCount;
} else {
requested_image_count =
std::max(requested_image_count, std::min(3U, capabilities.maxImageCount));
}
} else {
requested_image_count = std::max(requested_image_count, 3U);
} }
VkSwapchainCreateInfoKHR swapchain_ci{ VkSwapchainCreateInfoKHR swapchain_ci{
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,

View file

@ -3,6 +3,7 @@
#include <cinttypes> #include <cinttypes>
#include <clocale> #include <clocale>
#include <cmath>
#include <memory> #include <memory>
#include <thread> #include <thread>
#ifdef __APPLE__ #ifdef __APPLE__
@ -3451,9 +3452,10 @@ void GMainWindow::UpdateStatusBar() {
} }
if (!Settings::values.use_speed_limit) { if (!Settings::values.use_speed_limit) {
game_fps_label->setText( game_fps_label->setText(
tr("Game: %1 FPS (Unlocked)").arg(results.average_game_fps, 0, 'f', 0)); tr("Game: %1 FPS (Unlocked)").arg(std::round(results.average_game_fps), 0, 'f', 0));
} else { } else {
game_fps_label->setText(tr("Game: %1 FPS").arg(results.average_game_fps, 0, 'f', 0)); game_fps_label->setText(
tr("Game: %1 FPS").arg(std::round(results.average_game_fps), 0, 'f', 0));
} }
emu_frametime_label->setText(tr("Frame: %1 ms").arg(results.frametime * 1000.0, 0, 'f', 2)); emu_frametime_label->setText(tr("Frame: %1 ms").arg(results.frametime * 1000.0, 0, 'f', 2));