为什么 vkGetInstanceProcAddr() 对于扩展函数失败?

Why vkGetInstanceProcAddr() fails for extension functions?

我能够获取指向所有 Vulkan 核心函数的指针,但获取指向 Vulkan 扩展函数的指针失败。

首先我得到一个指向 vk_icdGetInstanceProcAddr() 的指针,然后我得到指向全局 Vulkan 函数的指针(例如 vkCreateInstance())。我在实例创建时启用 VK_KHR_surfaceVK_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");

显然,获取指向扩展函数的指针工作正常(例如 vkCreateSwapchainKHR())。如果我检查 Khronos' Vulkan reference loader correctly, the implementations of vkCreateWin32SurfaceKHR() and vkDestroySurfaceKHR() 的代码不是驱动程序提供的,而是加载程序提供的。