次の方法で共有


ダウンレベル ハードウェアのコンピューティング シェーダー

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 パラメーターに渡します。 CheckFeatureSupport は、Direct3D 10.x ハードウェアがコンピューティング シェーダーをサポートしている場合、D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONSのComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x メンバーで TRUE を返します。

「10Level9 リファレンス」セクションでは、さまざまな ID3D11Device メソッドと ID3D11DeviceContext メソッドがさまざまな 10Level9 機能レベルでどのように動作するかの違いを示します。

順序なしアクセス ビュー (UAV)

Raw (RWByteAddressBuffer) と Structured (RWStructuredBuffer) Unordered Access Views はダウンレベル ハードウェアでサポートされており、次の制限があります。

  • ID3D11DeviceContext::CSSetUnorderedAccessViews を介して一度にパイプラインにバインドできる UAV は 1 つだけです。
  • Raw UAV のベース オフセットは、(Direct3D 11 ハードウェアに必要な 16 バイトのアラインメントではなく) 256 バイト境界に配置する必要があります。

型指定された UAV は、ダウンレベル ハードウェアではサポートされていません。 これには、 Texture1DTexture2Dおよび Texture3D UAV が含まれます。

ダウンレベル ハードウェアのピクセル シェーダーでは、順序なしのアクセスはサポートされていません。

シェーダー リソース ビュー (SRV)

シェーダー リソース ビューとしての未加工バッファーと構造化バッファーは、Direct3D 11 ハードウェア上にあるため、読み取り専用アクセス用のダウンレベル ハードウェアでサポートされています。 これらのリソースの種類は、頂点シェーダー、ジオメトリ シェーダー、ピクセル シェーダー、コンピューティング シェーダーでサポートされています。

スレッド グループ

コンピューティング シェーダーは、スレッド グループ内の多数のスレッドで並列に実行できます。

スレッド グループはダウンレベル ハードウェアでサポートされており、次の制限があります。

スレッド グループディメンション

ダウンレベル ハードウェアに対して定義されているスレッド グループは、X および Y ディメンションの 768 に制限されます。 これは、Direct3D 11 ハードウェアの最大値である 1024 未満です。 最大 Z 次元 64 は変更されません。

グループ内のスレッドの合計数 (X × Y × Z) は 768 に制限されます。 これは、Direct3D 11 ハードウェアの制限である 1024 未満です。

これらの数値を超えると、シェーダーのコンパイルは失敗します。

スレッド インデックスのTwo-Dimensional

スレッド グループ内の特定のスレッドは、(x,y,z) によって指定された 3D ベクターを使用してインデックスが作成されます。

ダウンレベル ハードウェアで動作するコンピューティング シェーダーの場合、スレッド グループは 2 つのディメンションのみをサポートします。 つまり、3D ベクトルの Z 値は常に 1 である必要があります。

この制限は、特に次に適用されます。

スレッド グループ共有メモリ (TGSM)

スレッド グループ共有メモリは、ダウンレベル ハードウェアでは 16 Kb に制限されます。 これは、Direct3D 11 ハードウェアで使用できる 32 Kb 未満です。

コンピューティング シェーダー スレッドは、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

D3DCompile は、D3DCOMPILE_SKIP_OPTIMIZATION コンパイル オプションと共にシェーダー ターゲットとしてcs_4_0を渡すと、E_NOTIMPLを返します。 cs_5_0 シェーダー ターゲットは 、D3DCOMPILE_SKIP_OPTIMIZATIONで動作します。

ダウンレベル ハードウェアの Direct3D 11