寄存器 - hs_5_0

外壳着色器由三个不同的阶段组成:控制点阶段、分叉阶段和联接阶段。 每个阶段都有自己的输入和输出寄存器集。

控制点阶段

hs_control_point_phase是具有以下寄存器模型的着色器程序。

输入寄存器

注册类型 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位 Temp (r#) 4096(r#+x#[n]) R/W 4 没有 是的
32 位可索引临时数组 (x#[n]) 4096(r#+x#[n]) R/W 4 是的 没有 是的
32 位输入 (v[顶点][元素]) 32(元素)*32(vert) R 4 是的 没有 是的
32 位 UINT 输入 vOutputControlPointID(23.7) 1 R 1 没有 是的
32 位 UINT 输入基元 ID (vPrim) 1 R 1 N/A 是的
输入资源中的元素 (t#) 128 R 128 是的 没有 是的
采样器 (s#) 16 R 1 是的 没有 是的
ConstantBuffer 参考 (cb#[index]) 15 R 4 是的 没有 是的
即时 ConstantBuffer 引用 (icb[index]) 1 R 4 是(内容) 没有 是的

 

输出寄存器

注册类型 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位输出顶点数据元素 (o#) 32 W 4 是的 没有 是的

 

每个外壳着色器控制点阶段输出寄存器最多为 4 向量,最多可以声明 32 个寄存器。 声明的输出控制点也从 1 到 32 个,可缩放所需的存储量。 让我们将所有外壳着色器控制点阶段输出中允许的最大标量聚合数称为 #cp_output_max。

#cp_output_max = 3968 标量。

此限制基于此处 4096*32 位存储的某些硬件的设计点。 控制点输出量为 3968=4096-128,即 32(控制点)*4(组件)*32(元素) - 4(components)*32(元素)。 减法保留 128 个标量(一个控制点)的空间,专用于外壳着色器阶段 2 和 3。 为修补常量保留 128 个标量的选择-而不是允许任何 4096 标量存储的标量都由输出控制点使用-以适应另一个特定硬件设计的限制。 控制点阶段可以声明 32 个输出控制点,但它们不能完全为 32 个元素,每个元素有 4 个组件,因为总存储量过高。

分叉阶段

以下寄存器在hs_fork_phase模型中可见。

下面的输入资源(t#)、采样器(s#)、常量缓冲区(cb#)和直接常量缓冲区(icb)均与所有其他外壳着色器阶段共享状态。 也就是说,从 API/DDI 的角度来看,外壳着色器对所有阶段都有一组输入资源状态。 这与从 API/DDI 的角度来看,外壳着色器是一个原子着色器:其中的阶段是实现详细信息。

输入寄存器

注册类型 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位 Temp (r#) 4096(r#+x#[n]) R/W 4 没有 是的
32 位可索引临时数组 (x#[n]) 4096(r#+x#[n]) R/W 4 是的 没有 是的
32 位输入控制点 (vicp[顶点][元素]) (预控制点阶段) 32 请参阅下面的说明 R 4(组件)*32(元素)*32(vert) 是的 没有 是的
32 位输出控制点(vocp[顶点][元素]]) (控制点后阶段) 32 请参阅下面的说明 R 4(组件)*32(元素)*32(vert) 是的 没有 是的
32 位 UINT 输入基元 ID (vPrim) 1 R 1 N/A 是的
32 位 UINT 输入 ForkInstanceID(23.8) (vForkInstanceID) 1 R 1 N/A 是的
输入资源中的元素 (t#) 128 R 128 是的 没有 是的
采样器 (s#) 16 R 1 是的 没有 是的
ConstantBuffer 参考 (cb#[index]) 15 R 4 是的 没有 是的
即时 ConstantBuffer 引用 (icb[index]) 1 R 4 是(内容) 没有 是的

 

注意

外壳着色器分支阶段的输入控制点寄存器(vicp)声明必须是外壳着色器控制点输入(预控制点阶段)的任何子集(沿 [元素] 轴)。 同样,用于输入输出控制点(vocp)的声明必须是外壳着色器输出控制点(控制点后阶段)沿 [元素] 轴的任何子集。

沿 [顶点] 轴,要读取每个 vicp 和 vocp 的控制点数必须同样是外壳着色器输入控制点计数和外壳着色器输出控制点计数的子集。 例如,如果将 vocp 寄存器的顶点轴声明为 n 顶点,则使控制点阶段的输出控制点 [0..n-1] 可用作分叉阶段的只读输入。

输出寄存器

注册 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位输出 Patch 常量数据元素 (o#) 32 请参阅下面的注释 1 W 4 是的 没有 是的

 

注意

外壳着色器分支和联接阶段输出是一组 4 个 4 向量寄存器的共享集。 每个分叉或联接阶段程序的输出不能相互重叠。 系统解释的值(如 TessFactors)从此空间中走出来。

联接阶段

以下寄存器在hs_join_phase模型中可见。 有三组输入寄存器:控制点阶段输入控制点(vicp)、vocp 控制点阶段输出控制点(vocp)和修补常量(vcp)。 是所有外壳着色器分叉阶段程序的聚合输出。 外壳着色器联接阶段输出 o# 寄存器与外壳着色器分叉阶段输出位于相同的寄存器空间中。

下面的输入资源(t#)、采样器(s#)、常量缓冲区(cb#)和直接常量缓冲区(icb)均与所有其他外壳着色器阶段共享状态。 也就是说,从 API/DDI 的角度来看,外壳着色器对所有阶段都有一组输入资源状态。 这与从 API/DDI 的角度来看,外壳着色器是一个原子着色器:其中的阶段是实现详细信息。

输入寄存器

注册类型 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位 Temp (r#) 4096(r#+x#[n]) R/W 4 没有 是的
32 位可索引临时数组 (x#[n]) 4096(r#+x#[n]) R/W 4 是的 没有 是的
32 位输入控制点 (vicp[顶点][元素]) (预控制点阶段) 32 请参阅下面的说明 1 R 4(组件)*32(元素)*32(vert) 是的 没有 是的
32 位输出控制点 (vocp[顶点][元素]) (控制点后阶段) 32 请参阅下面的说明 1 R 4(组件)*32(元素)*32(vert) 是的 没有 是的
32 位输入 (民进[元素]) (修补程序常量数据) 32 请参阅下面的说明 2 R 4 是的 没有 是的
32 位 UINT 输入基元 ID (vPrim) 1 R 1 N/A 是的
32 位 UINT 输入 JoinInstanceID (vJoinInstanceID) 1 R 1 N/A 是的
输入资源中的元素 (t#) 128 R 128 是的 没有 是的
采样器 (s#) 16 R 1 是的 没有 是的
ConstantBuffer 参考 (cb#[index]) 15 R 4 是的 没有 是的
即时 ConstantBuffer 引用 (icb[index]) 1 R 4 是(内容) 没有 是的

 

注释 1: 外壳着色器联接阶段的输入控制点寄存器(vicp)声明必须是外壳着色器控制点输入(预控制点阶段)的任何子集(沿 [元素] 轴)。 同样,用于输入输出控制点(vocp)的声明必须是外壳着色器输出控制点(控制点后阶段)沿 [元素] 轴的任何子集。

沿 [顶点] 轴,要读取每个 vicp 和 vocp 的控制点数必须同样是外壳着色器输入控制点计数和外壳着色器输出控制点计数的子集。 例如,如果将 vocp 寄存器的顶点轴声明为 n 顶点,则使控制点阶段的输出控制点 [0..n-1] 可用作联接阶段的只读输入。

注释 2: 除了控制点输入外,外壳着色器联接阶段还被视为外壳着色器分叉阶段程序计算的修补常量数据的输入。 这显示在船体着色器分叉阶段,因为vp# 寄存器。 外壳着色器联接阶段的输入vp# 寄存器与外壳着色器分叉阶段输出 o# 寄存器共享相同的寄存器空间。 o# 寄存器的声明不得与任何外壳着色器分叉阶段程序 o# 输出声明重叠;外壳着色器联接阶段将添加到外壳着色器的聚合修补常量数据输出中。

输出寄存器

注册类型 计数 R/W 尺寸 可按 r 编制索引# 违约 需要 DCL
32 位输出 Patch 常量数据元素 (o#) 32 请参阅下面的说明 W 4 是的 没有 是的

 

注意

外壳着色器分支和联接阶段输出是一组 4 个 4 向量寄存器的共享集。 每个分叉或联接阶段程序的输出不能相互重叠。 系统解释的值(如 TessFactors)从此空间中走出来。

着色器模型 5