From 9df7be031443696eb965da045c5e6367fcf38c60 Mon Sep 17 00:00:00 2001 From: Artem Kharytoniuk Date: Sat, 13 May 2017 22:10:28 +0300 Subject: [PATCH] - In case mailbox present mode is not available try to use immediate mode (we do not want to restrict fps by the monitor update frequency). If both modes are not available then fallback to fifo mode. - Fixed bug with incorrect vkDestroyInstance function pointer initialization. - Fixed bug that program called SwapBuffers in vulkan mode. --- src/engine/renderer/tr_backend.c | 3 ++- src/engine/renderer/vk.cpp | 43 +++++++++++++++++++------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/engine/renderer/tr_backend.c b/src/engine/renderer/tr_backend.c index 4d18b41..a90ef75 100644 --- a/src/engine/renderer/tr_backend.c +++ b/src/engine/renderer/tr_backend.c @@ -958,7 +958,8 @@ const void *RB_SwapBuffers( const void *data ) { GLimp_LogComment( "***************** RB_SwapBuffers *****************\n\n\n" ); - GLimp_EndFrame(); + if (gl_enabled()) + GLimp_EndFrame(); backEnd.projection2D = qfalse; diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp index d39e435..5ac19c5 100644 --- a/src/engine/renderer/vk.cpp +++ b/src/engine/renderer/vk.cpp @@ -106,21 +106,30 @@ static VkSwapchainKHR create_swapchain(VkPhysicalDevice physical_device, VkDevic std::vector present_modes(present_mode_count); VK_CHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &present_mode_count, present_modes.data())); - VkPresentModeKHR present_mode; - uint32_t image_count; + bool mailbox_supported = false; + bool immediate_supported = false; + for (auto pm : present_modes) { + if (pm == VK_PRESENT_MODE_MAILBOX_KHR) + mailbox_supported = true; + else if (pm == VK_PRESENT_MODE_IMMEDIATE_KHR) + immediate_supported = true; + } - auto it = std::find(present_modes.cbegin(), present_modes.cend(), VK_PRESENT_MODE_MAILBOX_KHR); - if (it != present_modes.cend()) { - present_mode = VK_PRESENT_MODE_MAILBOX_KHR; - image_count = std::max(3u, surface_caps.minImageCount); - if (surface_caps.maxImageCount > 0) { - image_count = std::min(image_count, surface_caps.maxImageCount); - } - } - else { - present_mode = VK_PRESENT_MODE_FIFO_KHR; - image_count = surface_caps.minImageCount; - } + VkPresentModeKHR present_mode; + uint32_t image_count; + if (mailbox_supported) { + present_mode = VK_PRESENT_MODE_MAILBOX_KHR; + image_count = std::max(3u, surface_caps.minImageCount); + if (surface_caps.maxImageCount > 0) { + image_count = std::min(image_count, surface_caps.maxImageCount); + } + } else if (immediate_supported) { + present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR; + image_count = surface_caps.minImageCount; + } else { + present_mode = VK_PRESENT_MODE_FIFO_KHR; + image_count = surface_caps.minImageCount; + } // create swap chain VkSwapchainCreateInfoKHR desc; @@ -533,6 +542,7 @@ static void init_vulkan_library() { // create_instance(); INIT_INSTANCE_FUNCTION(vkCreateDevice) + INIT_INSTANCE_FUNCTION(vkDestroyInstance) INIT_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties) INIT_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices) INIT_INSTANCE_FUNCTION(vkGetDeviceProcAddr) @@ -597,7 +607,6 @@ static void init_vulkan_library() { INIT_DEVICE_FUNCTION(vkDestroyFramebuffer) INIT_DEVICE_FUNCTION(vkDestroyImage) INIT_DEVICE_FUNCTION(vkDestroyImageView) - INIT_DEVICE_FUNCTION(vkDestroyInstance) INIT_DEVICE_FUNCTION(vkDestroyPipeline) INIT_DEVICE_FUNCTION(vkDestroyPipelineLayout) INIT_DEVICE_FUNCTION(vkDestroyRenderPass) @@ -635,6 +644,7 @@ static void deinit_vulkan_library() { vkEnumerateInstanceExtensionProperties = nullptr; vkCreateDevice = nullptr; + vkDestroyInstance = nullptr; vkEnumerateDeviceExtensionProperties = nullptr; vkEnumeratePhysicalDevices = nullptr; vkGetDeviceProcAddr = nullptr; @@ -695,7 +705,6 @@ static void deinit_vulkan_library() { vkDestroyFramebuffer = nullptr; vkDestroyImage = nullptr; vkDestroyImageView = nullptr; - vkDestroyInstance = nullptr; vkDestroyPipeline = nullptr; vkDestroyPipelineLayout = nullptr; vkDestroyRenderPass = nullptr; @@ -2325,6 +2334,7 @@ PFN_vkCreateInstance vkCreateInstance; PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; PFN_vkCreateDevice vkCreateDevice; +PFN_vkDestroyInstance vkDestroyInstance; PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; @@ -2385,7 +2395,6 @@ PFN_vkDestroyFence vkDestroyFence; PFN_vkDestroyFramebuffer vkDestroyFramebuffer; PFN_vkDestroyImage vkDestroyImage; PFN_vkDestroyImageView vkDestroyImageView; -PFN_vkDestroyInstance vkDestroyInstance; PFN_vkDestroyPipeline vkDestroyPipeline; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; PFN_vkDestroyRenderPass vkDestroyRenderPass;