1

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

1 回答 1

2

显然,获取扩展函数的指针可以正常工作(例如 for vkCreateSwapchainKHR())。如果我正确检查了Khronos 的 Vulkan 引用加载器vkCreateWin32SurfaceKHR()的代码,则和的实现vkDestroySurfaceKHR()不是由驱动程序提供的,而是由加载程序提供的。

于 2016-03-07T20:28:33.093 回答