dcl_interface_dynamicindexed (sm5 - asm)

(接口) 声明函数表指针。

dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...}
说明
Fp#
[in]函数表指针。

备注

在着色器可用之前,需要从 API 绑定每个接口。 绑定提供对其中一个函数表的引用,以便可以填充方法槽。 编译器不会为未引用的对象生成指针。

函数表指针具有一组完整的方法槽,以避免 C++ 指针到指针到 vtable 表示形式所需的额外间接关系。 这也要求此指针为 5 元组。 在 HLSL 虚拟内联模型中,始终知道调用使用了哪个全局变量/输入,因此我们可以为每个根对象设置表。

函数指针声明指示哪些函数表与它们一起使用是合法的。 这还允许派生方法相关信息。

接口声明的第一个 [] 是数组大小。 如果使用动态索引,声明将指示,如下所示。 接口指针数组也可以静态索引,接口指针数组不一定意味着动态索引。

对于第一个声明,接口指针的编号从 0 开始,然后考虑数组大小,因此四个条目数组 fp0[4][1] 之后的第一个指针将是 fp4[][]。

接口声明的第二个 [] 是调用站点数,它必须与声明中引用的每个表中的主体数匹配。

接口声明中可以列出多少个函数表 (ft#) 选项没有限制。

给定函数表 (ft#) 可以在一个或多个接口声明中多次出现。

限制

  • 着色器中的对象站点数(即其 [arraySize] 声明的所有 fp# 声明的总和)必须不超过 253。 此数字对应于 指针可以存在的数量。 运行时强制实施此 253 限制,以限制 DDI 的大小来传达此指针数据。

  • 着色器中的调用站点数(即潜在分支目标数的所有 fcall 语句的总和)必须不超过 4096。

    例如,对第一个 fp[][] 维度使用静态索引的 fcall 计为 1:

    fcall fp0[0][0] // +1

    使用动态索引的 fcall 计为数组中的元素数 (第一个 [] dcl_interface) :

    dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...

    fcall fp1[r0.z + 0][1] // +2

    此限制有助于某些实现轻松地将函数主体选择表拟合在常量缓冲区般的存储中。

此指令适用于以下着色器阶段:

顶点 外壳 Geometry 像素 计算
X X X X X X

最小着色器模型

以下着色器模型中支持此指令:

着色器模型 支持
着色器模型 5
着色器模型 4.1
着色器模型 4
着色器模型 3 (DirectX HLSL)
着色器模型 2 (DirectX HLSL)
着色器模型 1 (DirectX HLSL)

cs_4_0和cs_4_1支持适用于 UAV 和 SRV 的此说明。

着色器模型 5 程序集 (DirectX HLSL)