我试图在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无法正确连接某些功能?我该如何调试?
答案 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加载程序会为您加载它。