type
status
date
slug
summary
tags
category
icon
password
理解 VulkanLoader
首先我们要明确一点,Vulkan 应用程序有一些模块是动态加载的,即使你链接了 vulkan 静态库,如果某些动态组件找不到,你大概率会遇见 VkCreateInstance 失败的问题。
Vulkan 里负责模块动态加载的模块叫做 Vulkan Loader,而我们常见的 Driver(如 macOS 的 MoltenVK)、Layer(如 Validation Layer)都是依赖 Vulkan Loader 去动态加载的。
这些动态模块一般都会被编译成动态链接库,并且伴随有一个 .json 描述文件,Vulkan Loader 会尝试在系统里去寻找已经安装的动态模块尝试加载,当然也有一些别的途径,例如注册表(Windows)、特定目录(macOS、Linux)等来进行查找。
在 VulkanSDK 已经安装的情况下,动态模块会被注册或安装到系统的特定目录,而 Vulkan Loader 会去系统中查找这些动态模块并加载,所以 VulkanSDK 安装的情况下,你的 Vulkan 程序肯定是能正常跑起来的,而 VulkanSDK 想要在未安装的情况下使用,我们需要添加一些额外配置让他能正确找到 VulkanSDK 里附带的动态模块。
打包发布 Vulkan 应用也要注意这一点,例如你想要在 macOS 发布 Vulkan 应用,就必然需要打包 MoltenVK 驱动,并且配置对应的描述文件使 Vulkan Loader 能正确加载它。
具体可以参考附录里 Vulkan Loader 的文档,有详细的加载优先级以及各平台的配置。
不安装 VulkanSDK 的情况下使用 VulkanSDK
Windows
Windows 下只有 Layers 是动态加载的,我们直接参考文档里去进行 Layers 的配置即可:
找到注册表的
HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers
字段(没有就新建),在里面添加你想使用的 Layers 的绝对路径,比如最常用的 Validation Layer 直接写上一条 /path/to/vulkan/sdk/Bin/VkLayer_khronos_validation.json
即可,其他 Layers 同理。这样静态链接了未安装的 VulkanSDK 里的 vulkan 库的 Vulkan 程序就能正确运行了。通常 Layers 我们只会在开发阶段使用,所以这样配置就已经可以了。
macOS
macOS 下 Drivers 和 Layers 都需要动态加载,同理,也是参考 Vulkan Loader 的加载顺序来进行配置:
我开发阶段通常使用
/home/me/.config/vulkan
这个路径来进行配置,找到你的 VulkanSDK,将 /path/to/vulkan/sdk/macOS/share/vulkan
路径下的 explicit_layer.d
和 icd.d
两个目录拷贝到 /home/me/.config/vulkan
下,然后将目标路径下所有的 .json 中的这类字段改成你的绝对路径即可:发布版本则只需要打包 Drivers 即可,按照类似的做法把动态库打包到 Bundle 中,然后配置 icd.d 目录即可,总之就是要让 Vulkan Loader 找到需要加载的模块。
vulkaninfo 无法正确运行的问题
vulkaninfo 是 VulkanSDK 附带的一个小程序,通常放在 bin 目录下,在诊断 vulkan 程序的基础运行环境以及是否缺失动态组件时非常有用。
最近遇见一个坑,就是升级 macOS VulkanSDK 到 1.3.296 之后在未安装的情况下执行它,会直接报:
它还不是因为 MoltenVK 驱动被 Vulkan Loader 加载失败挂掉的,因为如果是因为驱动问题,会报
ERROR_INCOMPATIBLE_DRIVER
错误码,而这个报错明显是 vulkan 本体库加载失败导致的。后来查阅了 vulkaninfo 的源代码,发现了新版本换成了使用 volk 去加载:
他这里其实有个很大的问题,因为 volk 是优先加载工作目录下的 libvulkan.dylib,没有找到的话会去系统里找,如果你没有安装 VulkanSDK,而是“绿色使用”,就会导致 vulkaninfo 压根都跑不起来,而老版本是不会的。
最后解决方法也很简单,把 libvulkan.dylib 拷一份到 vulkaninfo 同级目录即可,或者直接工作目录改到 libvulkan.dylib 所在目录。
之后 vulkaninfo 就能正常使用了,如果报 Drivers 和 Layers 丢失,我们还需要按照上面的方法去配置一下
/home/me/.config/vulkan
。附录
- 作者:Kindem
- 链接:https://www.flyandnotdown.com/post/16b8fb78-2f78-8011-98aa-ec100e15deaa
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。