下层硬件上的计算着色器

Direct3D 11 提供了使用在大多数 Direct3D 10.x 硬件上运行 的计算着色器 的功能,但存在一些操作限制。 计算着色器技术也称为 DirectCompute 技术。 本主题讨论如何在 Direct3D 10 硬件上的 Direct3D 11 应用中使用 计算着色器

下层硬件上的计算着色器支持仅适用于与 Direct3D 10.x 兼容的设备。 计算着色器不能在 Direct3D 9.x 硬件上使用。

若要检查 Direct3D 10.x 硬件是否支持计算着色器,请调用 ID3D11Device::CheckFeatureSupport。 在 CheckFeatureSupport 调用中,将D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS值传递给 Feature 参数,将 指向 D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 结构的指针传递给 pFeatureSupportData 参数,并将 D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 结构的大小传递给 FeatureSupportDataSize 参数。 如果 Direct3D 10.x 硬件支持计算着色器,CheckFeatureSupportD3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS 的ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x成员中返回 TRUE

10Level9 参考部分列出了各种 ID3D11DeviceID3D11DeviceContext 方法在各种 10Level9 功能级别上的行为差异。

无序访问视图 (UAV)

下层硬件支持原始 (RWByteAddressBuffer) 和结构化 (RWStructuredBuffer) 无序访问视图,但存在以下限制:

下层硬件不支持类型化 UAV。 这包括 Texture1DTexture2DTexture3D UAV。

下层硬件上的像素着色器不支持无序访问。

着色器资源视图 (SRV)

下层硬件支持原始缓冲区和结构化缓冲区作为着色器资源视图进行只读访问,因为它们在 Direct3D 11 硬件上。 顶点着色器、几何着色器、像素着色器和计算着色器支持这些资源类型。

线程组

计算着色器可以在线程组内的多个线程上并行执行。

下层硬件支持线程组,但存在以下限制:

线程组维度

为下层硬件定义的线程组限制为 768 的 X 和 Y 维度。 这小于 Direct3D 11 硬件的最大值 1024。 最大 Z 维度 64 保持不变。

组 (X × Y × Z) 的线程总数限制为 768。 这低于 Direct3D 11 硬件的 1024 限制。

如果超出这些数字,着色器编译将失败。

Two-Dimensional线程索引

线程组中的特定线程使用 (x,y,z) 提供的 3D 向量编制索引。

对于在下层硬件上运行的计算着色器,线程组仅支持两个维度。 这意味着 3D 向量中的 Z 值必须始终为 1。

此限制特别适用于以下情况:

线程组共享内存 (TGSM)

下层硬件上的线程组共享内存限制为 16Kb。 这小于 Direct3D 11 硬件可用的 32Kb。

计算着色器线程只能写入其自己的 TGSM 区域。 此仅写区域的最大大小为 256 字节或更小,最大大小随着为组声明的线程数的增加而减小。

下表定义了组中线程数的 TGSM 区域的每线程最大大小:

组中的线程数 每个线程的最大 TGSM 大小
0-64 256
65-68 240
69-72 224
73-76 208
77-84 192
85-92 176
93-100 160
101-112 144
113-128 128
129-144 112
145-168 96
169-204 80
205-256 64
257-340 48
341-512 32
513-768 16

 

计算着色器线程可以从任何位置读取 TGSM。

D3DCompile with D3DCOMPILE_SKIP_OPTIMIZATION

将 cs_4_0 作为着色器目标以及 D3DCOMPILE_SKIP_OPTIMIZATION 编译选项传递时,D3DCompile 将返回E_NOTIMPL。 cs_5_0着色器目标适用于 D3DCOMPILE_SKIP_OPTIMIZATION

下层硬件上的 Direct3D 11