ハル シェーダーは、コントロール ポイント フェーズ、フォーク フェーズ、結合フェーズの 3 つの異なるフェーズで構成されます。 各フェーズには、独自の入力レジスタと出力レジスタのセットがあります。
制御点フェーズ
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[vertex][element]) | 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(コンポーネント)*32(要素) です。 減算では、ハル シェーダー フェーズ 2 と 3 専用の 128 個のスカラー (1 つのコントロール ポイント) 相当の空間が予約されます。 パッチ定数に対して 128 個のスカラーを予約する選択は、4096 個のストレージ スカラーのうち、出力制御ポイントで使用されないだけの量にするのではなく、別の特定のハードウェア設計の制限に対応します。 制御ポイントフェーズでは 32 個の出力制御ポイントを宣言できますが、ストレージの合計が大きすぎるため、それぞれ 4 つのコンポーネントを含む 32 個の要素を完全に宣言することはできません。
フォーク フェーズ
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[vertex][element]) (プリコントロール ポイント フェーズ) | 32 以下の注意事項を参照してください | R | 4(コンポーネント)*32(要素)*32(vert) | はい | 何一つ | はい |
32 ビット出力制御ポイント (vocp[vertex][element]]) (ポストコントロール ポイント フェーズ) | 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 ビット出力パッチ定数データ要素 (o#) | 32 以下の注 1 を参照してください | W | 4 | はい | 何一つ | はい |
手記
ハル シェーダーフォークと結合フェーズ出力は、4 つの 4 ベクター レジスタの共有セットです。 各フォークまたは結合フェーズ・プログラムの出力が互いに重複することはできません。 TessFactors などのシステム解釈値は、この領域から取得されます。
結合フェーズ
hs_join_phase モデルでは、次のレジスタが表示されます。 入力レジスタには、制御ポイントの位相入力制御ポイント (vicp)、vocp 制御ポイントの位相出力制御ポイント (vocp)、パッチ定数 (vcp) の 3 つのセットがあります。 vpc は、すべてのハル シェーダー フォーク フェーズ プログラムの集計出力です。 ハル シェーダー結合フェーズ出力 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[vertex][element]) (プリコントロール ポイント フェーズ) | 32 下記の注1を参照 | R | 4(コンポーネント)*32(要素)*32(vert) | はい | 何一つ | はい |
32 ビット出力制御ポイント (vocp[vertex][element]) (ポストコントロール ポイント フェーズ) | 32 下記の注1を参照 | R | 4(コンポーネント)*32(要素)*32(vert) | はい | 何一つ | はい |
32 ビット入力 (vpc[element]) (パッチ定数データ) | 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: コントロール ポイント入力に加えて、ハル シェーダー結合フェーズでは、ハル シェーダーフォーク フェーズ プログラムによって計算されたパッチ定数データも入力と見なされます。 これは、vpc# のレジスタとしてハル シェーダーフォークフェーズに表示されます。 ハル シェーダー結合フェーズの入力 vpc# レジスタは、ハル シェーダー フォーク フェーズ出力 o# レジスタと同じレジスタ空間を共有します。 o# レジスタの宣言は、ハル シェーダー フォーク フェーズ プログラム o# 出力宣言と重複してはなりません。ハル シェーダー結合フェーズは、ハル シェーダーの集計パッチ定数データ出力に追加されます。
出力レジスタ
レジスタの種類 | 数える | R/W | 次元 | r でインデックス可能# | デフォルト | DCL が必要 |
---|---|---|---|---|---|---|
32 ビット出力パッチ定数データ要素 (o#) | 32 以下の注意事項を参照してください | W | 4 | はい | 何一つ | はい |
手記
ハル シェーダーフォークと結合フェーズ出力は、4 つの 4 ベクター レジスタの共有セットです。 各フォークまたは結合フェーズ・プログラムの出力が互いに重複することはできません。 TessFactors などのシステム解釈値は、この領域から取得されます。
関連トピック