在DirectX 12中,切换管道状态对象的性能如何?

时间:2016-06-30 08:28:22

标签: c++ graphics directx gpu directx-12

我正在研究DirectX 12,我想知道切换管道状态对象是多么高效。我正​​在阅读来自我正在阅读的来源的相互矛盾的报告,即有些人说它非常慢而其他人说它很快。

使用的“慢”参数是:当你使用SetPipelineState()时,GPU必须在引擎盖下做一堆事情,例如重新编译等。

使用的“快速”参数是:管道状态的所有计算都是在创建管道状态对象时完成的,因此GPU可以只交换一些指针,就是这样。

哪个是真的?性能如何SetPipelineState()以及使用它时应该记住什么?

2 个答案:

答案 0 :(得分:1)

真正的问题是:你用什么SetPipelineState()?没有它你就无法改变着色器。您可以更改资源绑定配置。否则,您无法更改拓扑。理论上,PipelineState具有编程GPU所需的所有东西,而且你不能在这里交换块,所以你会对你所拥有的东西感到困惑。

现在回答:这取决于GPU和驱动程序。是的,在后台完成了一些事情。但是,体面的图形驱动程序应该优化并缓存已经完成的工作。含义 - 如果您已经使用了给定的PipelineState,则使用不同的PipelineState并返回原始的PipelineState应该很快。

答案 1 :(得分:1)

对于快速回答,切换PSO可能永远不会出现性能问题,这就是他们首先设计的方式。

对于更长的答案,管道状态对象更改的成本主要取决于三个标准:

  • 硬件和驱动程序效率。
  • 即将打开或关闭的管道阶段,如细分单元。
  • 根签名,因为它很接近但仍然是抽象,驱动程序可能有一些工作来准备它的映射。
PSO被设计为尽可能快地切换,它是自我内容,并且,至少在nVidia和AMD上,唯一的着色器编译发生在创建时,从未使用过。在AMD上,甚至可以从ID3D12PipelineState::GetCachedBlob的结果中提取真正的微代码程序集。一个观察结果是他们不再像在DX11上那样使用获取着色器系统来处理不同的输入布局,因为它现在是PSO描述的一部分。

必须提到的是,DX12的强大功能还在于提供对无绑定资源的访问。使用该功能,可以使用巧妙的实例和ExecuteIndirect将材料冲刷量减少10倍左右,您可以让GPU在没有太多交互的情况下决定材料和几何体。

因为信息以某种方式公开(http://www.wihlidal.ca/Presentations/GDC_2016_Compute.pdf)。

  

在Xbox One上,ExecuteIndirect有一些令人难以置信的扩展,其中PSO可以通过间接参数进行切换,这意味着我们可以为整个场景发出单个ExecuteIndirect,无论状态如何   资源变化。

Xbox One上的PSO更改在CPU上几乎是免费的,因为它们可以直接从GPU中使用它们。很遗憾它不能在PC上使用,但它可以帮助您降低对PSO开关的关注。

相关问题