【问题标题】:Why vkGetInstanceProcAddr() fails for extension functions?为什么扩展函数的 vkGetInstanceProcAddr() 失败?
【发布时间】:2016-05-10 12:29:14
【问题描述】:

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

【问题讨论】:

  • "从驱动程序 DLL 获取 vk_icdGetInstanceProcAddr()" 有什么理由直接获取驱动程序 DLL 的指针,而不是仅仅使用已有的指针?
  • 因为我已经什么都没有了。我没有使用任何第 3 方代码或库。
  • 我认为他们的意思是该函数在vulkan.h中,您不需要为它查询dll。
  • @Devenec“我还没有写过代码”,很酷,那你为什么还要使用 Vulkan?只需编写您自己的图形 API...
  • 这不是更多的一个问题,为什么你坚持使用动态库(因此需要查询函数地址)而不是静态链接?

标签: windows vulkan


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多