Vulkan的Renderpasses功能
Vulkan™是一款高性能,低开销的图形API,旨在让先进的应用程序推动现代GPU满负荷运行,充分挖掘它们的性能。传统的API已经提供一个抽象层,让命令看上去立即执行。Vulkan™使用了一个模型,向外界暴露了GPU真正运行情况。实际上,GPU执行放置在内存当中的命令,有时候可能是乱序执行,这些命令缓冲有可能是跨多个软件线程并行产生出来。此外,通过状态对象,大量互相关联的状态会同时提供给图形驱动程序。这就为驱动程序提供了一个机会,在渲染时间之前,来充分优化GPU状态,以便将GPU性能最大化,同时又避免了即时优化可能造成的画面卡顿等问题。最终的结果是更低,更一致的帧时间和较低的CPU开销,这意味着可以为应用程序提供更多的CPU周期。
Vulkan 源自于AMD开拓性的Mantle API。AMD捐赠了Mantle规范,协议和其他技术,作为Khronos组织下一代API(当时还没有正式名称)基础。在其它行业厂商一年多的帮助下,我们最终让Mantle演变成现在的Vulkan。这是一个漫长过程,其中一些最显著的变化来自于移动领域的成员厂商,它们在GPU当中使用了瓷块架构,其目的是为了减少从GPU到内存的数据量,以降低功耗。这些移动厂商提出一个功能就是renderpass,它允许一个应用程序向驱动程序传递一个帧画面当中的高级架构信息,移动GPU驱动程序可以利用这个信息来决定将数据带入和带出GPU的时机,来决定何时刷新内存,或者何时丢弃缓冲内容,甚至是针对图像读取等内部操作来重新划分内存。Mantle没有这个功能,Direct3D® 12也没有这个功能。
采用瓷块或者不采用瓷块渲染方式
一个瓷块GPU批量处理几何数据,确定这些几何在缓冲区中的位置,然后在瓷块中渲染出这些几何。这种方式让帧缓冲存取非常一致,在许多情况下,可以允许GPU在片上就完成一个瓷块帧缓冲渲染。AMD不研发生产瓷块式GPU。我们的GPU是所谓的正向或直接渲染器。这意味着,当命令进来要求画一些几何形状,GPU将根据具体位置进行渲染,然后才去执行下一个命令。AMD GPU采用流水线渲染管线,命令可以重叠,甚至做到乱序执行,但GPU内建了特殊硬件,在任何数据写入到内存之前,让数据和结果重新回到正确的顺序。我们的驱动程序通常不需要担心这个问题。所以,renderpass对象对于我们来说有什么作用?我们为什么要在乎renderpass?
在Vulkan当中,一个renderpass对象包含一帧画面的结构。在最简单的形式当中,一个renderpass封装了一组帧缓冲附件以及管线状态基本信息。但是一个renderpass可以包含一个或者多个subpasses,以及这些subpasses如何相互关联的信息。这就让事情变得有趣起来。
每个subpass可以引用帧缓冲区附件的一个子集用于写入和读取。这些可读的帧缓冲附件被称为输入附件,其中有效地包含同一像素中的较早subpass的结果。不同于传统的渲染到纹理技术,每个pass可以读取器在前一次pass产生的任何像素,输入附件保证每个片段着色只访问在相同像素通过着色调用产生的数据。此外,每个subpass包含它开始时如何处理每个附件的信息,以及它结束时如何处理附件的信息。这些subpasses之间的依赖关系由应用程序明确列明,这使得瓷块渲染器知道何时它需要刷新其瓷块缓存,或者清除这些缓存,或者从内存中恢复这些缓存等等。
加速正向渲染
事实证明,AMD GPU等正向渲染器,也可以利用这种信息优势。下面是我们可以做出的几个优化例子。
我们可以告诉一个subpass依赖于一个较早subpass的结果,我们也可以告诉一个subpass无需依赖一个较早subpass的结果。因此,我们有时会并行渲染这些subpass,甚至不同步地进行乱序渲染。如果一个subpass取决于先前subpass的结果,在一个传统的图形API当中,驱动程序需要注入一个流水线气泡进入GPU管线,以便将渲染后端输出缓存与纹理单元输入缓存同步。然而,通过重新安排工作,我们可以指示渲染后端刷新自己的高速缓存,转向处理不相关的工作,然后在启动消费subpass之前让纹理缓存无效。这样就无需向GPU管线注入流水线气泡,并节省GPU时间。
因为每个subpass包括有关如何处理其附件的信息,我们可以告诉驱动程序,一个应用程序需要清除附件,或者说,它并不关心这个附件的内容。这允许驱动程序遥遥领先真实渲染,来安排清除工作,或智能决定使用什么方法来清除附件(例如,使用一个计算着色,固定功能硬件或DMA引擎)。如果应用程序说,它并不需要附件有明确的数据,我们就可以使附件处于部分压缩状态,这就让它尚未包含明确数据,但是就硬件而言,它已经为渲染进行了优化。
在一些情况下,用于最佳渲染和用于纹理单元读取的数据,它们在内存当中的数据布局是不同的。通过分析一个应用程序提供的数据依赖关系,我们的驱动程序可以决定数据执行布局变化,解压缩,格式转换等工作的最佳时机。驱动程序也可以将这些操作拆分为阶段,与应用程序提供的渲染工作交织,这样做就再次消除了流水线气泡,提高了渲染效率。
最后,Vulkan包括瞬态附件的概念。这些是renderpass刚开始时候的一个处于未初始化或处于清除状态的帧缓存附件,它被一个或多个subpasses写入,由一个或多个subpasses消耗,并在renderpass结束时注定要被丢弃。在这种情况下,该附件中的数据仅生活在renderpass当中,永远不会被写入到主内存当中。虽然我们仍然会为这种附件分配内存,但是其数据可能永远不会离开GPU,它们只能生活在GPU的缓存中。这样可以节省带宽,降低延迟并提高功耗效率。
一流的功能
Renderpasses不应该被看作是移动GPU专享功能,这是Vulkan API的一流功能,它为GPU上优化和效率提升提供了机会,即使是针对正向渲染,立即渲染的架构,如AMD的GCN架构。我们早期的驱动程序包括了一个renderpass编译器,其中已经执行了一些上面提到的优化。我们有一箩筐的实验可以进行,我们将在未来几个月内带来越来越多的功能。只让一些Pass结合成一个单一的subpass,可能不会产生太大的起色。然而,让尽可能少的renderpass对象塞入尽可能多需要处理的帧数据,可能会让软件和硬件性能有一个巨大的提升。
更多
访问GPUOpen网站的Vulkan部分
访问GPUOpen网站阅读其它和Vulkan有关的博客文章
Graham Sellers是AMD软件架构师,负责显卡驱动程序的工作。提供链接到第三方网站为方便起见,除非明确说明,AMD概不负责此类链接网站的内容,并没有暗示背书。
相关新闻
- 国韵流芳,净彩华裳,小天鹅拥抱新国潮,国粹脸谱形象大出圈!2021-10-24
- “大白兔”奶糖成网红 年轻人的情怀到底是什么2019-06-08
- 吃1次肉等于服5粒避孕药?老掉牙的谣言为何还在传2019-06-08
- 国五降价潮几家欢喜几家愁 专家呼吁留出“切换过渡期”2019-06-08
- 跨境保险人民币赔付效率将“加速度”2019-06-08