【发布时间】:2016-05-10 12:29:14
【问题描述】:
我能够获取所有 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");
【问题讨论】:
-
"从驱动程序 DLL 获取 vk_icdGetInstanceProcAddr()" 有什么理由直接获取驱动程序 DLL 的指针,而不是仅仅使用已有的指针?
-
因为我已经什么都没有了。我没有使用任何第 3 方代码或库。
-
我认为他们的意思是该函数在vulkan.h中,您不需要为它查询dll。
-
@Devenec“我还没有写过代码”,很酷,那你为什么还要使用 Vulkan?只需编写您自己的图形 API...
-
这不是更多的一个问题,为什么你坚持使用动态库(因此需要查询函数地址)而不是静态链接?