根签名概述

根签名由应用配置,并将命令列表链接到着色器所需的资源。 图形命令列表同时具有图形和计算根签名。 计算命令列表只具有一个计算根签名。 这些根签名彼此独立。

根形参和根实参

“根签名”类似于 API 函数签名,它确定着色器应期望的数据类型,但不定义实际的内存或数据。 “根形参”是根签名中的一个条目。 在运行时设置和更改的根形参的实际值称为“根实参”。 更改根实参会更改着色器读取的数据。

根常量、描述符和表

根签名可以包含三种类型的形参;根常量(根实参中内联的常量),根描述符(根实参中内联的描述符)和描述符表(指向描述符堆中一系列描述符的指针)。

根常量是内联 32 位值,在着色器中显示为常量缓冲区。

内联根描述符应该包含访问频率最高的描述符,但仅限于 CBV、原始或结构化 UAV 或 SRV 缓冲区。 更复杂的类型(如 2D texture SRV)不能用作根描述符。 根描述符不包含大小限制,因此不能进行越界检查,这与描述符堆中包含大小的描述符不同。

根签名中的描述符表条目包含描述符、HLSL 着色器绑定名称和可见性标志。 有关着色器名称的详细信息,请参阅 Shader Model 5.1(着色器模型 5.1)。 在某些硬件上,仅使描述符对需要描述符的着色器阶段可见 (引用 D3D12_SHADER_VISIBILITY) 可能会提高性能。

根描述符表条目

根签名的布局非常灵活,对功能有限的硬件施加了一些限制。 无论硬件级别如何,应用程序都应尽量使根签名尽可能小,以获得最大的效率。 应用程序可以在根签名中权衡使用更多描述符表,而为根常量预留更少空间,反之亦然。

应用程序绑定的根签名的内容(描述符表、根常量和根描述符)在绘制(图形)/调度(计算)调用之间的任何部分发生更改时,都会自动由 D3D12 驱动程序进行版本控制。 因此,每个绘制/调度都会获得一组唯一的根签名状态。

理想情况下,有多组管共享相同根签名的管道状态对象 (PSO)。 在管道上设置根签名后,它所定义的所有绑定(描述符表、描述符、常量)都可以单独进行设置或更改,包括捆绑的继承。

应用可以在需要多少个描述符表与内联描述符表之间做出自己的权衡, (内联描述符占用更多空间,但删除间接) 与内联常量 (这些常量在根签名中没有间接) 。 应用程序应尽可能少地使用根签名,并依赖其控制的内存(如指向根签名的堆和描述符堆)来表示批量数据。

根签名