From 7e59e52a997d0d98bea3e140b4ca2d19b38666d4 Mon Sep 17 00:00:00 2001 From: Lenny Komow Date: Thu, 22 Feb 2018 11:28:16 -0700 Subject: loader: Only return ext pointers if ext is enabled The loader previously returned valid pointers to functions from VK_KHR_swapchain and VK_KHR_display_swapchain even if the extensions weren't enabled. This change fixed that. --- loader/loader.h | 2 ++ loader/wsi.c | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) (limited to 'loader') diff --git a/loader/loader.h b/loader/loader.h index 8abc034a..aa9a8554 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -312,6 +312,8 @@ struct loader_instance { bool wsi_ios_surface_enabled; #endif bool wsi_display_enabled; + bool wsi_swapchain_enabled; + bool wsi_display_swapchain_enabled; }; // VkPhysicalDevice requires special treatment by loader. Firstly, terminator diff --git a/loader/wsi.c b/loader/wsi.c index e822fe7a..27150dee 100644 --- a/loader/wsi.c +++ b/loader/wsi.c @@ -63,6 +63,8 @@ void wsi_create_instance(struct loader_instance *ptr_instance, const VkInstanceC #endif // VK_USE_PLATFORM_IOS_MVK ptr_instance->wsi_display_enabled = false; + ptr_instance->wsi_swapchain_enabled = false; + ptr_instance->wsi_display_swapchain_enabled = false; for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) { @@ -121,6 +123,14 @@ void wsi_create_instance(struct loader_instance *ptr_instance, const VkInstanceC ptr_instance->wsi_display_enabled = true; continue; } + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) { + ptr_instance->wsi_swapchain_enabled = true; + continue; + } + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) { + ptr_instance->wsi_display_swapchain_enabled = true; + continue; + } } } @@ -1642,27 +1652,27 @@ bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, const char // function will return the trampoline function for such device-extension // functions, regardless of whether the extension has been enabled. if (!strcmp("vkCreateSwapchainKHR", name)) { - *addr = (void *)vkCreateSwapchainKHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkCreateSwapchainKHR : NULL; return true; } if (!strcmp("vkDestroySwapchainKHR", name)) { - *addr = (void *)vkDestroySwapchainKHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkDestroySwapchainKHR : NULL; return true; } if (!strcmp("vkGetSwapchainImagesKHR", name)) { - *addr = (void *)vkGetSwapchainImagesKHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkGetSwapchainImagesKHR : NULL; return true; } if (!strcmp("vkAcquireNextImageKHR", name)) { - *addr = (void *)vkAcquireNextImageKHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkAcquireNextImageKHR : NULL; return true; } if (!strcmp("vkQueuePresentKHR", name)) { - *addr = (void *)vkQueuePresentKHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkQueuePresentKHR : NULL; return true; } if (!strcmp("vkAcquireNextImage2KHR", name)) { - *addr = (void *)vkAcquireNextImage2KHR; + *addr = ptr_instance->wsi_swapchain_enabled ? (void *)vkAcquireNextImage2KHR : NULL; return true; } @@ -1783,7 +1793,7 @@ bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance, const char // Functions for KHR_display_swapchain extension: if (!strcmp("vkCreateSharedSwapchainsKHR", name)) { - *addr = (void *)vkCreateSharedSwapchainsKHR; + *addr = ptr_instance->wsi_display_swapchain_enabled ? (void *)vkCreateSharedSwapchainsKHR : NULL; return true; } -- cgit v1.2.3