5

我对该ID3D12GraphicsCommandList::SetGraphicsRootSignature方法的存在感到有些困惑。根据我对这个 MSDN 页面的了解,它的唯一有效用法似乎是始终在之后调用它SetPipelineState,并为其提供与创建管道状态对象时提供的相同的根签名。如果是这样,它不隐含有什么好处?还有其他方法可以使用此方法吗?

4

3 回答 3

6

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

那时你可能不会SetGraphicsRootSignature经常打电话SetGraphicPipelineState。这就是为什么。

于 2016-07-23T04:00:47.120 回答
3

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

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

为简化DirectX 12 的 DirectX 工具包,我们每次在IEffect::Apply方法中设置 PSO 时都设置根签名,即使我们只使用几个不同的根签名。

于 2016-07-26T01:43:22.627 回答
3

@查克沃尔伯恩

“根签名可以经常更改而不会造成重大损失”

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

  • 最小化根签名更改的数量
    • 问题不在于 RS 的更改,而是在此类更改之后初始化根签名条目通常会产生后续成本
于 2019-01-09T09:37:18.520 回答