From c7b32854d64c27d6a2c64d86cb0e3bc7f1b42cd9 Mon Sep 17 00:00:00 2001 From: nihuini Date: Wed, 8 Nov 2023 15:01:50 +0800 Subject: [PATCH] loader version --- src/simplevk.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/simplevk.cpp b/src/simplevk.cpp index 77f483b20ccb..af49b5d4ebf9 100644 --- a/src/simplevk.cpp +++ b/src/simplevk.cpp @@ -314,10 +314,25 @@ static int load_vulkan_linux(const char* driver_path) PFN_vkCreateInstance CreateInstance = 0; PFN_vkGetInstanceProcAddr GetInstanceProcAddr = 0; - PFN_vkGetInstanceProcAddr icdGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlsym(libvulkan, "vk_icdGetInstanceProcAddr"); + typedef VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*PFN_vk_icdGetInstanceProcAddr)(VkInstance instance, const char* pName); + PFN_vk_icdGetInstanceProcAddr icdGetInstanceProcAddr = (PFN_vk_icdGetInstanceProcAddr)dlsym(libvulkan, "vk_icdGetInstanceProcAddr"); if (icdGetInstanceProcAddr) { // load icd driver + typedef VKAPI_ATTR VkResult VKAPI_CALL (*PFN_vk_icdNegotiateLoaderICDInterfaceVersion)(uint32_t* pSupportedVersion); + PFN_vk_icdNegotiateLoaderICDInterfaceVersion icdNegotiateLoaderICDInterfaceVersion = (PFN_vk_icdNegotiateLoaderICDInterfaceVersion)dlsym(libvulkan, "vk_icdNegotiateLoaderICDInterfaceVersion"); + if (icdNegotiateLoaderICDInterfaceVersion) + { + uint32_t supported_version = 5; + VkResult ret = icdNegotiateLoaderICDInterfaceVersion(&supported_version); + if (ret != VK_SUCCESS) + { + NCNN_LOGE("icdNegotiateLoaderICDInterfaceVersion failed"); + dlclose(libvulkan); + return -1; + } + } + EnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)icdGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); if (!EnumerateInstanceExtensionProperties) { @@ -334,7 +349,7 @@ static int load_vulkan_linux(const char* driver_path) return -1; } - GetInstanceProcAddr = icdGetInstanceProcAddr; + GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)icdGetInstanceProcAddr; } else {