MoltenVK驱动程序为某些Vulkan函数调用调用了错误的函数

时间:2018-07-29 02:07:34

标签: vulkan

我试图在MacOS上使用Vulkan,最终目标是制作一个跨平台程序。当我静态链接MoltenVK(将vulkan标头复制到其中)时,我的程序正常工作。

我当前的设置静态链接vulkan.framework,并使用ICD加载libMoltenVK.dylib。最初看来是可行的:在日志中,我可以看到“ INFO:找到了ICD清单文件[清单文件的预期路径]”。然后会找到并列出我期望的所有扩展名,包括VK_KHR_surface。创建VkInstance时将其启用。

我可以成功调用各种vulkan函数,包括vkCreateMacOSSurfaceMVK。但是,当我尝试调用vkGetPhysicalDeviceSurfaceCapabilitiesKHR时,我的程序崩溃了。

没有验证层,似乎vulkan加载了错误的函数:调用堆栈中的下一个符号是vkCreateQueryPool而不是预期的vkGetPhysicalDeviceSurfaceCapabilitiesKHR,并且MoltenVK打印[***MoltenVK ERROR***] VK_ERROR_INITIALIZATION_FAILED: vkCreateQueryPool: Unsupported query pool type: -1094795586。该程序在下一个vulkan调用(恰好是vkGetPhysicalDeviceSurfaceFormatsKHR,但实际上调用MVKDevice::destoryQueryPool)时崩溃。

在启用验证层的情况下,程序在vkGetPhysicalDeviceSurfaceCapabilitiesKHR上崩溃,后者试图调用0x0。没有任何关于验证失败的错误打印。

我尝试在Xcode的方案编辑器中打开Dynamic Linker API的用法/动态库加载,但是我发现它们提供的信息没有帮助。

为什么vulkan / dyld无法正确连接某些功能?我该如何调试?

1 个答案:

答案 0 :(得分:0)

您实际上是在使用Vulkan Loader(而不是“ ICD”)来加载libMoltenVK.dylib。 libMoltenVK.dylib本身被认为是可安装的客户端驱动程序(ICD)。

您是否使用vkGetInstanceProcAddr()来获取vkGetPhysicalDeviceSurfaceCapabilitiesKHR()的函数地址? Vulkan Loader仅导出核心(和某些WSI)功能。您需要使用vkGetInstanceProcAddr()获取其他扩展功能的地址。

有关使用GIPA的示例,请参见此code。搜索“ vkGetPhysicalDeviceSurfaceCapabilitiesKHR”。 vulkaninfo在MacOS上成功调用了该扩展名。

我怀疑MoltenVK库直接导出了此扩展功能,这就是为什么当您静态链接MoltenVK时它可以工作的原因。另外,在使用Vulkan加载程序时,不应将MoltenVK库链接到应用程序。 Vulkan加载程序会为您加载它。