Vulkanished2021重要内容简介
新的Vulkan特性
- fragment shading rate, 就是D3D中的VRS,这个骁龙888芯片已经支持了
- Ray Tracing final spec
- 为了支持多种机型,拆成三个sub extensions
- VK_KHR_acceleration_structure
- VK_KHR_ray_tracing_pipeline
- 低端机型可以不用支持这个
- VK_KHR_ray_query
- 为了支持多种机型,拆成三个sub extensions
- Video Encode/Decode Extension
- 新的同步机制
- stage变多了,stage flag和access flag改为64位
- 使用一个数组替代原有的多个数组
- 将原有的
VkSemaphore
和VkPipelineStageFlags
数组合并为一个VkSemaphoreSubmitInfoKHR
数组
- 将原有的
- 之前是用的一个pipeline stage,现在改为每个barrier使用一个(这个很合理)
- 在vkCmdSetEvent的时候指定pipeline barrier,而不是vkCmdWaitEvent
- 更简单的image layout transition
- 提供办法可以调试出现device lost的情况
- 目前NVidia有AfterMath,这是要做一个统一各平台的方案么
- 减少PSO创建的耗时
- 简化RenderPass/Subpass的使用
Vulkan Layer系统
这部分主要讲之前一直都令人费解的Vulkan Layer系统。
整个Vulkan应用的架构是这样的,Vulkan Application直接和Vulkan Loader对话,通过Vulkan Loader获得统一的API。
对这些API的调用可以由Vulkan Layers来进行hook,可用来实现诸如validation, trace等功能。
1 Vulkan Override Layer
这是一个隐式元layer,用来控制其他layer的行为
- 控制其他layer的执行顺序
- 排除特定的layer
- 根据特定应用选择是否覆写默认的layer设置
2 Vulkan Configurator
Vulkan Configurator是随Vulkan SDK附带的一个应用,它可以生成两个文件,用来控制Vulkan Loader的行为。
- VkLayer_override.json,记录哪些layer的设置是需要覆写的
- vk_layer_settings.txt,记录具体layer的设置
layer的说明,包括其有哪些设置可以用,是放在vulkan layer manifest json文件中的
2.1 vk_layer_settings.txt
默认路径
- windows:路径存在注册表
HKEY_LOCAL_MACHINE
或HKEY_CURRENT_USER
的子项Software\Khronos\Vulkan\Settings
中- 这个路径还可以被
VK_LAYER_SETTINGS_PATH
环境变量的值覆盖
- 这个路径还可以被
- unix:路径为
~/.local/share/vulkan/settings.d
2.2 VKLayer_override.json
记录哪些layer是需要强制排除的和哪些layer是需要强制打开的。
默认路径
- windows:路径存在注册表
HKEY_LOCAL_MACHINE
或HKEY_CURRENT_USER
的子项Software\Khronos\Vulkan\ImplicitLayers
中 - unix:路径为
~/.local/share/vulkan/implicit_layer.d
这个文件是全局唯一的,但是可以控制只应用于特定的应用程序。
2.3 Vulkan Layer Manifest
Manifest描述了一个layer的元信息,利用这些信息可以组织Vulkan Configurator的UI,从而可以交互式地生成vk_layer_settings.txt设置文件
几个重要的值为
- file_format_version:只有高于1.2.0的版本,才能被Vulkan Configurator使用
- api_version:针对的是哪个版本的Vulkan
- implementation_version:Layer自己的版本
- layer:具体信息
- layer.features.settings:存储设置元信息
其他的值可参考原文档
3 Helper C++ Vulkan Layer setting library
可以帮助Layer获得其需要的设置信息
Vulkan Synchronization
这个真是老生常谈的话题,足以见得同步在Vulkan中的使用之复杂。
1 同步类型
1.1 Execution Dependencies
两个GPU操作之间执行上的依赖关系
1.2 Memory Dependencies
除了执行上的依赖关系,还有内存依赖关系,体现在一个操作对内存的操作需要flush或invalidate之后另一个操作才能得到有效的数据
2 常见的同步错误
类型 | 全称 | 描述 |
---|---|---|
RAW | read after write | 同一个queue中的写和读没有同步 |
WAR | write after read | 同一个queue中的读和写没有同步 |
WAW | write after write | 同一个queue中的写和写没有同步 |
WRW | write racing write | 不同queue或不同subpass中的写和写没有同步 |
RRW | read racing write | 不同queue或不同subpass中的读和写没有同步 |
3 小同步:Pipeline Barrier
3.1 Execution Dependency Chains
如果前后两个barrier A和B,A的DstStage和B的SrcStage相同或A的DstStage比B的SrcStage晚(这里有些疑问),则两个构成一个Dependency Chain Pair。
同样的情况还发生于Barrier的DstStage和Semaphore的WaitStage相同的情形。
4 大同步:Semaphore and Fence
会同步之前所有提交的GPU命令的执行和访存
5 RenderPass隐藏的同步
- LOAD_OP_DONT_CARE会有一个write操作
- 光栅化的先后顺序是自动保证的
- AMD有扩展可以去掉这个顺序保证,可以提升性能
- 在subpass内使用pipeline barrier必须是self dependency的
- 内部的subpass dependency(srcSubpass和dstSubpass都不为EXTERNAL)不会影响外部的命令
- implicit external subpass dependnecy只负责做layout transition,不会对同步有任何影响