我能够获得指向所有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");
答案 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()
的实现不是由驱动程序提供的,而是由加载程序提供的。