为什么vkGetInstanceProcAddr()无法用于扩展功能?

时间:2016-03-06 21:02:24

标签: windows vulkan

我能够获得指向所有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");

1 个答案:

答案 0 :(得分:1)

显然,获取扩展函数的指针工作正常(例如var query = {'code': 'the code sent', 'client_id': 'your client id', 'client_secret': 'your client secret', 'redirect_uri': 'your redirect', 'grant_type': 'code' }; )。如果我正确检查了Khronos' Vulkan reference loader的代码,则vkCreateWin32SurfaceKHR()vkDestroySurfaceKHR()的实现不是由驱动程序提供的,而是由加载程序提供的。