为什么 vkGetInstanceProcAddr() 对于扩展函数失败?
Why vkGetInstanceProcAddr() fails for extension functions?
我能够获取指向所有 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");
显然,获取指向扩展函数的指针工作正常(例如 vkCreateSwapchainKHR()
)。如果我检查 Khronos' Vulkan reference loader correctly, the implementations of vkCreateWin32SurfaceKHR()
and vkDestroySurfaceKHR()
的代码不是驱动程序提供的,而是加载程序提供的。
我能够获取指向所有 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");
显然,获取指向扩展函数的指针工作正常(例如 vkCreateSwapchainKHR()
)。如果我检查 Khronos' Vulkan reference loader correctly, the implementations of vkCreateWin32SurfaceKHR()
and vkDestroySurfaceKHR()
的代码不是驱动程序提供的,而是加载程序提供的。