我能够得到所有Vulkan核心函数的指针,但是获取指向Vulkan扩展函数的指针却失败了。
首先,我得到一个指向vk_icdGetInstanceProcAddr()
的指针,并使用它指向全局Vulkan函数(例如vkCreateInstance()
)。 在创build实例时,我启用了VK_KHR_surface
和VK_KHR_win32_surface
扩展,并将其列为vulkaninfo.exe和vkEnumerateInstanceExtensionProperties()
。 在创build一个Vulkan实例之后,我通过vk_icdGetInstanceProcAddr()
和实例句柄得到指向所有实例函数的指针。 但是,例如,当试图获得一个指向vkCreateWin32SurfaceKHR()
的指针时,返回一个空指针。 和vkDestroySurfaceKHR()
。
我安装了Vulkan API 1.0.3支持的Nvidia驱动程序356.39。 难道我做错了什么?
代码:
// Gets vk_icdGetInstanceProcAddr() from the driver DLL vkGetInstanceProcAddr = getLibraryFunction("vk_icdGetInstanceProcAddr"); vkCreateInstance = vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); const std::array<const char*, 2u> extensionNames { "VK_KHR_surface", "VK_KHR_win32_surface" }; VkInstanceCreateInfo instanceInfo = VkInstanceCreateInfo(); instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; instanceInfo.enabledExtensionCount = static_cast<uint32_t>(extensionNames.size()); instanceInfo.ppEnabledExtensionNames = extensionNames.data(); VkInstance instanceHandle; vkCreateInstance(&instanceInfo, nullptr, &instanceHandle); // Returns a non-null pointer vkCreateDevice = vkGetInstanceProcAddr(instanceHandle, "vkCreateDevice"); // Returns a null pointer vkCreateWin32SurfaceKHR = vkGetInstanceProcAddr(instanceHandle, "vkCreateWin32SurfaceKHR");
显然,得到扩展函数的指针工作正常(例如对于vkCreateSwapchainKHR()
)。 如果我正确地检查了Khronos的Vulkan引用加载器的代码,那么驱动程序不会提供vkCreateWin32SurfaceKHR()
和vkDestroySurfaceKHR()
的实现,而是由加载器提供。