D3D12的SetGraphicsRootSignature有什么意义?

时间:2016-07-22 21:48:19

标签: directx-12 direct3d12

我对ID3D12GraphicsCommandList::SetGraphicsRootSignature方法的存在感到有些困惑。根据我对this MSDN page的理解,它似乎唯一有效的用法是始终在SetPipelineState之后调用它,赋予它与创建管道状态对象时提供的相同的根签名。如果是这样的话,它有什么好处呢?还有其他方法可以使用这种方法吗?

3 个答案:

答案 0 :(得分:3)

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

您可能不会经常which vim致电/usr/bin/vim。这就是原因。

答案 1 :(得分:1)

" root签名"在DirectX 12中提供了用于在CPU数据结构和GPU着色器语言执行之间共享数据的公共布局信息。 DirectX 12使程序员决定他们想要使用多少根签名,何时使用它们,以及哪些管道状态对象需要哪个根签名。在Direct3D 11中,基本上只有一个" root签名"在所有时间都非常活跃。

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

  

为简单起见DirectX Tool Kit for DirectX 12,我们每次在IEffect::Apply方法中设置PSO时都会设置根签名,即使我们只使用了几个不同的根签名。

答案 2 :(得分:0)

@Chuck Walbourn

“根签名可以相当频繁地更改而不会造成重大损失”

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

  • 最小化根签名更改次数
    • 问题不是RS的更改,而是在更改之后初始化根签名条目通常会产生后续费用