Using Vulkan -- Layers
Layers 是用于增强 Vulkan 系统的可选组件,以共享库形式打包,由 loader 动态加载。它们可以在 Vulkan 函数从应用程序下发到硬件的过程中,对其进行拦截、检查和修改。
例如,Vulkan 驱动本身只做极少的错误检查,而Vulkan Validation Layer可以帮助开发者定位不正确的用法,并验证应用是否正确使用 API。
Layer 以共享库形式存在,由 loader 动态加载并插入在 loader 与应用程序之间。Layer 可以被显式启用,也可以被隐式启用。关于隐式与显式 Layer 的更多信息,见 Loader and Layer Interface。
Configuring Layers
Layer 配置包含两个操作:
- 选择 Layer 并指定顺序
- 使用设置项配置每个 Layer
可以使用三种方式配置 Layer,以适配不同开发者工作流:
- 使用环境变量:loader 环境变量和 per-layer 设置环境变量
- 使用专用 Vulkan 系统文件:
vk_loader_settings.json和vk_layer_settings.txt - 在 Vulkan 应用中通过 API 编程配置:
vkCreateInstance和VK_EXT_layer_settings
Vulkan Configurator可以简化这三种方式的使用。通过图形界面可以创建 Layer 配置,工具会自动创建和定位vk_loader_settings.json与vk_layer_settings.txt。它还可以生成环境变量脚本和可直接包含到 Vulkan 应用代码中的 C++ 头文件库。
Layer Configuration文档提供了关于 Layer 配置的详细信息。
Layers settings backward compatbility policy
Layer 不识别的设置项会被忽略,无论使用哪种配置方式。Layer 开发者有责任保证与旧版本 Layer 的向后兼容性。
这样做是为了确保 Layer 设置项在各版本之间保持相对稳定,并且不会将向后兼容的责任转嫁给 Vulkan 应用开发者,否则会迅速变得难以管理。
Device Layers Deprecation
过去同时存在 instance layers 和 device layers,但device layers在 Vulkan 早期就已被废弃,应当避免使用。
Creating a Layer
任何人都可以创建 Layer,只要遵循loader to layer interface—— 这是 loader 与 Layer 之间约定的通信方式。
为保证一致性并能与 Vulkan Configurator 及其他 SDK 工具平滑集成,Layer 实现应当使用Vulkan::LayerSettings。
Android
从 Android P(Android 9 / API level 28)开始,如果设备处于可调试状态(getprop ro.debuggable),隐式 Layer 可以被放置在/data/local/debug/vulkan。
从 Android P(Android 9 / API level 28)开始,如果应用是 Debug 版本构建,可以通过 ADB 推送隐式 Layer。
除上述方式外,没有其他方法可以使用隐式 Layer。
