我正在尝试在MacOS上使用Vulkan,最终的目标是制作一个跨平台的程序。当我静态链接MoltenVK (复制了vulkan头文件)时,我的程序就可以工作了。
我当前的设置是静态链接vulkan.framework,并使用ICD加载libMoltenVK.dylib。这最初似乎是有效的:在日志中,我可以看到"INFO: Found ICD manifest file expected to my manifest file“。我期望的所有扩展名都会被找到并列出,包括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。
打开验证层后,程序会在试图调用0x0的vkGetPhysicalDeviceSurfaceCapabilitiesKHR上崩溃。对于它们中的任何一个,都没有打印验证失败的错误。
我尝试在Xcode的方案编辑器中启用Dynamic Linker API usage/ Dynamic Library loads,但我发现它们提供的信息没有帮助。
为什么vulkan/dyld不能正确地连接一些函数?我如何调试它呢?
发布于 2018-07-31 00:57:33
您实际上使用的是Vulkan Loader,而不是"ICD",来加载libMoltenVK.dylib。libMoltenVK.dylib本身被认为是可安装的客户端驱动程序(ICD)。
您是否正在使用vkGetInstanceProcAddr()获取vkGetPhysicalDeviceSurfaceCapabilitiesKHR()的函数地址?Vulkan Loader仅导出核心(和一些WSI)函数。您需要使用vkGetInstanceProcAddr()获取其他扩展函数的地址。
有关使用GIPA的示例,请参阅此code。搜索"vkGetPhysicalDeviceSurfaceCapabilitiesKHR“。vulkaninfo在MacOS上成功调用此扩展。
我怀疑MoltenVK库直接导出了这个扩展函数,这就是为什么在静态链接MoltenVK时它可以工作的原因。此外,在使用Vulkan加载器时,不应该将MoltenVK库链接到您的应用程序。Vulkan装载器会为你装载它。
https://stackoverflow.com/questions/51576674
复制相似问题