ルート署名の概要

ルート署名はアプリで構成され、シェーダーが必要とするリソースにコマンド リストをリンクします。 グラフィックス コマンド リストには、グラフィックスと計算ルート署名の両方があります。 計算コマンド リストには、計算ルート署名が 1 つだけあります。 これらのルート署名は互いに独立しています。

ルート パラメーターと引数

ルート署名は、API 関数署名と同様にシェーダーに必要なデータの種類を特定しますが、実際のメモリやデータは定義しません。 ルート パラメーターは、ルート署名のエントリの 1 つです。 実行時に設定または変更されるルート パラメーターの実際の値は、ルート引数と呼ばれます。 ルート引数を変更すると、シェーダーが読み取るデータが変更されます。

ルート定数、記述子、およびテーブル

ルート署名には、ルート定数 (ルート引数のインライン定数)、ルート記述子 (ルート引数のインライン記述子)、記述子テーブル (記述子ヒープ内の記述子の範囲を指すポインター) の 3 種類のパラメーターを含めることができます。

ルート定数は、シェーダーで定数バッファーとして認識されるインライン 32 ビット値です。

インラインのルート記述子には、最も頻繁にアクセスされる記述子を含める必要がありますが、対象は CBV および未加工か構造化された UAV/SRV バッファーに限られます。 2D テクスチャ SRV のようなより複雑な種類はルート記述子として使用できません。 ルート記述子にはサイズ制限が含まれないため、サイズが含まれる記述子ヒープ内の記述子とは異なり、範囲外チェックがない場合があります。

ルート署名内の記述子テーブル エントリには、記述子、HLSL シェーダー バインド名、および参照範囲フラグが含まれます。 シェーダー名の詳細については、「シェーダー モデル 5.1」を参照してください。 一部のハードウェアでは、記述子を必要とするシェーダー ステージにのみ記述子を表示することでパフォーマンスが向上する場合があります ( D3D12_SHADER_VISIBILITYを参照)。

ルート記述子テーブル エントリ

ルート署名のレイアウトは柔軟性に優れていますが、機能の低いハードウェアではある程度の制約があります。 ハードウェアのレベルにかかわらず、アプリケーションでは常にルート署名をできるだけ小さくして効率の最大化を図る必要があります。 アプリケーションでは、ルート署名内の記述子テーブルを増やす代わりにルート定数の場所を縮小して (またはその逆を行って) バランスを取ることができます。

アプリケーションでバインドされたルート署名の内容 (記述子テーブル、ルート定数、ルート記述子) は、描画 (グラフィックス)/ディスパッチ (計算) 呼び出し間で内容の一部が変更されるたびに、D3D12 ドライバーによって自動的にバージョン管理されます。 このため、描画/ディスパッチのたびに一意のルート署名状態一式が取得されます。

複数のパイプライン状態オブジェクト (PSO) グループで同じルート署名を共有している状態が理想的です。 パイプラインでルート署名を設定したら、それによって定義されるすべてのバインド (記述子テーブル、記述子、定数) を、バンドルへの継承も含めて個別に設定または変更できます。

アプリは、必要な記述子テーブルの数と、ルート署名で必要なインライン定数 (間接参照を持たない) とインライン記述子 (より多くの領域を取るが間接参照を削除する) の間で独自のトレードオフを行うことができます。 アプリケーションでは、ルート署名の使用をできるだけ控えて、ヒープや記述子ヒープなどのアプリケーションが制御するメモリを利用してバルク データを表すようにする必要があります。

ルート署名