我能够获取指向所有 Vulkan 核心函数的指针,但获取指向 Vulkan 扩展函数的指针失败。
首先我得到一个指向 的指针vk_icdGetInstanceProcAddr()
,然后我得到指向全局 Vulkan 函数的指针(例如vkCreateInstance()
)。我在创建实例时启用VK_KHR_surface
和VK_KHR_win32_surface
扩展,它们被 vulkaninfo.exe 和vkEnumerateInstanceExtensionProperties()
. 创建 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");