@ -1497,6 +1497,14 @@ static struct overlay_draw *before_present(struct swapchain_data *swapchain_data
return draw ;
}
static bool IsPresentModeSupported ( VkPresentModeKHR targetPresentMode , const std : : vector < VkPresentModeKHR > & supportedPresentModes ) {
for ( const auto & mode : supportedPresentModes )
if ( mode = = targetPresentMode )
return true ;
return false ; // Not found
}
static VkResult overlay_CreateSwapchainKHR (
VkDevice device ,
const VkSwapchainCreateInfoKHR * pCreateInfo ,
@ -1508,12 +1516,31 @@ static VkResult overlay_CreateSwapchainKHR(
createInfo . imageUsage | = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT ;
struct device_data * device_data = FIND ( struct device_data , device ) ;
array < VkPresentModeKHR , 4 > modes = { VK_PRESENT_MODE_FIFO_RELAXED_KHR ,
VK_PRESENT_MODE_IMMEDIATE_KHR ,
VK_PRESENT_MODE_MAILBOX_KHR ,
VK_PRESENT_MODE_FIFO_KHR } ;
VkPresentModeKHR presentMode = HUDElements . presentModes [ device_data - > instance - > params . vsync ] ;
if ( device_data - > instance - > params . vsync < 4 )
createInfo . presentMode = modes [ device_data - > instance - > params . vsync ] ;
createInfo . presentMode = presentMode ;
struct instance_data * instance_data =
FIND ( struct instance_data , device_data - > physical_device ) ;
PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fpGetPhysicalDeviceSurfacePresentModesKHR =
( PFN_vkGetPhysicalDeviceSurfacePresentModesKHR ) instance_data - > vtable . GetInstanceProcAddr ( instance_data - > instance , " vkGetPhysicalDeviceSurfacePresentModesKHR " ) ;
if ( fpGetPhysicalDeviceSurfacePresentModesKHR ! = NULL ) {
uint32_t presentModeCount ;
std : : vector < VkPresentModeKHR > presentModes ( 6 ) ;
VkResult result = fpGetPhysicalDeviceSurfacePresentModesKHR ( device_data - > physical_device , pCreateInfo - > surface , & presentModeCount , presentModes . data ( ) ) ;
if ( result = = VK_SUCCESS ) {
if ( IsPresentModeSupported ( HUDElements . presentModes [ device_data - > instance - > params . vsync ] , presentModes ) )
SPDLOG_DEBUG ( " Present mode: {} " , HUDElements . get_present_mode ( ) ) ;
else {
SPDLOG_DEBUG ( " Present mode is not supported: {} " , HUDElements . get_present_mode ( ) ) ;
device_data - > instance - > params . vsync = 3 ;
}
}
}
VkResult result = device_data - > vtable . CreateSwapchainKHR ( device , & createInfo , pAllocator , pSwapchain ) ;
if ( result ! = VK_SUCCESS ) return result ;
@ -1769,6 +1796,7 @@ static VkResult overlay_CreateDevice(
pCreateInfo - > enabledExtensionCount ) ;
uint32_t extension_count ;
instance_data - > vtable . EnumerateDeviceExtensionProperties ( physicalDevice , nullptr , & extension_count , nullptr ) ;
std : : vector < VkExtensionProperties > available_extensions ( extension_count ) ;