D3D12 的 SetGraphicsRootSignature 有什么意义?

What is the point of D3D12's SetGraphicsRootSignature?

我对 ID3D12GraphicsCommandList::SetGraphicsRootSignature method. From what I understand of this MSDN page 的存在感到有点困惑,似乎唯一有效的用法是始终在 SetPipelineState 之后调用它,并赋予它与原来相同的根签名创建管道状态对象时提供。如果是这样,它不隐含有什么好处?还有其他方法可以使用此方法吗?

这是CPU优化,在内部可以准备从根签名槽到实际绑定的部分映射。如果您在不同的管道状态对象之间共享一个根签名,那么这项工作可以为每个根签名完成一次,而不是每个管道状态对象一次。

您打电话给 SetGraphicsRootSignature 的频率可能会低于 SetGraphicPipelineState。这就是为什么。

DirectX 12 中的 "root signature" 提供了在 CPU 数据结构和 GPU 着色器语言执行之间共享数据的通用布局信息。 DirectX 12 让程序员决定他们想要使用多少根签名,何时使用它们,以及哪些管线状态对象需要哪个根签名。在 Direct3D 11 中,基本上有一个 "root signature" 始终处于活动状态,这相当大。

根签名可以经常更改而不会造成重大损失,但前提是您将拥有一些根签名和许多 PSO,而不是 1:1 对应关系。

For simplicity in DirectX Tool Kit for DirectX 12, we set the root signature every time we set the PSO in the IEffect::Apply method, even though we only use a few different root signatures.

@查克沃尔伯恩

"Root signatures can be changed fairly often without a major penalty"

https://developer.nvidia.com/dx12-dos-and-donts#roots

  • 尽量减少根签名更改的次数
    • 问题不在于 RS 的更改,而是在这样的更改之后通常会有初始化根签名条目的后续成本