ルート署名で記述子を直接使用する
記述子ヒープを通過する必要を回避するために、記述子をルート署名に直接配置できます。 これらの記述子は、ルート署名に多くの領域を占有するため ( 「ルート署名の制限」を参照)、慎重に使用することをお勧めします。
たとえば、ルート レイアウトに、描画ごとに変更される定数バッファー ビュー (CBV) を配置します。 そのため、記述子ヒープ領域は、描画ごとにアプリケーションによって割り当てられる必要はありません (記述子ヒープ内の新しい場所に記述子テーブルを指すのを保存します)。 ルート署名に何かを入れることで、アプリケーションは単にバージョン管理の責任をドライバーに渡すだけです。しかし、それはドライバーが既に持っているインフラストラクチャです。
非常に少数のリソースを使用するレンダリングでは、必要なすべての記述子をルート署名に直接配置できる場合、記述子テーブル/ヒープの使用は必要ない場合があります。
これらは、ルート署名でサポートされている記述子の唯一の種類です。
- 定数バッファー ビュー (CBV)。
- 形式変換が必要ないバッファー リソース (型指定されていないバッファー) のシェーダー リソース ビュー (SRV) /順序なしのアクセス ビュー (UAV)。 ルート記述子でバインドできる型指定されていないバッファーの例には
StructuredBuffer<type>
、、RWStructuredBuffer<type>
、ByteAddressBuffer
RWByteAddressBuffer
などがあります。 や などのBuffer<uint>
Buffer<float2>
型指定されたバッファーはできません。 - ローカルまたはグローバルルートシグネチャでのレイトレーシングアクセラレーション構造のSRV。
ルート内の UAV にカウンターを関連付けることはできません。 ルート署名内の記述子はそれぞれ個別の記述子として表示されます。動的にインデックスを作成することはできません。
struct SceneData
{
uint foo;
float bar[2];
int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);
上記の例では、 mySceneData
は、ルート署名の cbuffer mySceneData[2]
記述子にマップされるかのように、配列として宣言できません。 これは、記述子間のインデックス作成がルート署名ではサポートされていないためです。 必要に応じて、個別の個別の定数バッファーを定義し、それぞれをルート署名の個別のエントリとして定義できます。 上記の mySceneData
内に配列 bar[2]
があることに注意してください。 定数バッファー内の動的インデックス作成は有効です。ルート署名内の記述子は、記述子ヒープを介してアクセスされた場合と同じ記述子と同様に動作します。 これは、ルートシグネチャ内の定数を直接インライン化するのとは対照的です。これは、インライン定数内の動的インデックス作成が許可されないという制約を除き、定数バッファーのようにも見えるので bar[2]
、そこでは許可されません。
これらの API ( ID3D12GraphicsCommandList インターフェイスから) は、ルート署名に記述子を直接設定するためのものです。
- SetComputeRootConstantBufferView
- SetGraphicsRootConstantBufferView
- SetComputeRootShaderResourceView
- SetGraphicsRootShaderResourceView
- SetComputeRootUnorderedAccessView
- SetGraphicsRootUnorderedAccessView
Note
Direct3D 12にはルート記述子配列の概念はありません。 記述子配列は、記述子ヒープでのみサポートされます。