Vulkanished2021重要内容简介

新的Vulkan特性

  1. fragment shading rate, 就是D3D中的VRS,这个骁龙888芯片已经支持了
  2. Ray Tracing final spec
    1. 为了支持多种机型,拆成三个sub extensions
      1. VK_KHR_acceleration_structure
      2. VK_KHR_ray_tracing_pipeline
        1. 低端机型可以不用支持这个
      3. VK_KHR_ray_query
  3. Video Encode/Decode Extension
  4. 新的同步机制
    1. stage变多了,stage flag和access flag改为64位
    2. 使用一个数组替代原有的多个数组
      1. 将原有的VkSemaphoreVkPipelineStageFlags数组合并为一个VkSemaphoreSubmitInfoKHR数组
    3. 之前是用的一个pipeline stage,现在改为每个barrier使用一个(这个很合理)
    4. 在vkCmdSetEvent的时候指定pipeline barrier,而不是vkCmdWaitEvent
    5. 更简单的image layout transition
  5. 提供办法可以调试出现device lost的情况
    1. 目前NVidia有AfterMath,这是要做一个统一各平台的方案么
  6. 减少PSO创建的耗时
  7. 简化RenderPass/Subpass的使用

Vulkan Layer系统

这部分主要讲之前一直都令人费解的Vulkan Layer系统。

整个Vulkan应用的架构是这样的,Vulkan Application直接和Vulkan Loader对话,通过Vulkan Loader获得统一的API。

对这些API的调用可以由Vulkan Layers来进行hook,可用来实现诸如validation, trace等功能。
image

1 Vulkan Override Layer

这是一个隐式元layer,用来控制其他layer的行为

  1. 控制其他layer的执行顺序
  2. 排除特定的layer
  3. 根据特定应用选择是否覆写默认的layer设置

2 Vulkan Configurator

Vulkan Configurator是随Vulkan SDK附带的一个应用,它可以生成两个文件,用来控制Vulkan Loader的行为。

  1. VkLayer_override.json,记录哪些layer的设置是需要覆写的
  2. vk_layer_settings.txt,记录具体layer的设置
    layer的说明,包括其有哪些设置可以用,是放在vulkan layer manifest json文件中的

2.1 vk_layer_settings.txt

默认路径

  1. windows:路径存在注册表HKEY_LOCAL_MACHINEHKEY_CURRENT_USER的子项Software\Khronos\Vulkan\Settings
    1. 这个路径还可以被VK_LAYER_SETTINGS_PATH环境变量的值覆盖
  2. unix:路径为~/.local/share/vulkan/settings.d

2.2 VKLayer_override.json

记录哪些layer是需要强制排除的和哪些layer是需要强制打开的。

默认路径

  1. windows:路径存在注册表HKEY_LOCAL_MACHINEHKEY_CURRENT_USER的子项Software\Khronos\Vulkan\ImplicitLayers
  2. unix:路径为~/.local/share/vulkan/implicit_layer.d

这个文件是全局唯一的,但是可以控制只应用于特定的应用程序。

2.3 Vulkan Layer Manifest

Manifest描述了一个layer的元信息,利用这些信息可以组织Vulkan Configurator的UI,从而可以交互式地生成vk_layer_settings.txt设置文件

几个重要的值为

  1. file_format_version:只有高于1.2.0的版本,才能被Vulkan Configurator使用
  2. api_version:针对的是哪个版本的Vulkan
  3. implementation_version:Layer自己的版本
  4. layer:具体信息
  5. 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隐藏的同步

  1. LOAD_OP_DONT_CARE会有一个write操作
  2. 光栅化的先后顺序是自动保证的
    1. AMD有扩展可以去掉这个顺序保证,可以提升性能
  3. 在subpass内使用pipeline barrier必须是self dependency的
  4. 内部的subpass dependency(srcSubpass和dstSubpass都不为EXTERNAL)不会影响外部的命令
  5. implicit external subpass dependnecy只负责做layout transition,不会对同步有任何影响
posted @ 2021-11-23 15:11  马子哥  阅读(384)  评论(0编辑  收藏  举报