ID3D12StateObjectProperties
COM公式ドキュメント
ID3D12StateObject のプロパティを取得および設定するためのメソッドを提供します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
シェーダーレコードで使用できる、シェーダーの一意な識別子を取得します。
| pExportName | LPWSTR | in | 識別子を取得する対象となる、ステートオブジェクト内のエントリポイント。 |
戻り値
シェーダー識別子へのポインター。
このポインターが参照するデータは、取得元のステートオブジェクトが有効である間、有効です。返されるデータのサイズは D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES です。この識別子を何度も取得する必要がある場合は、ステートオブジェクト内を検索するコストを避けるため、アプリケーションはこのデータをコピーしてキャッシュしてください。この識別子は、アプリが値を設定する必要がある GPU メモリ上のシェーダーテーブル内のシェーダーレコードで使用されます。
このデータ自体がシェーダーをグローバルに識別するため、ルートシグネチャなどの関連付けが同じであれば、別のステートオブジェクトに同じシェーダーが現れた場合でも同一の識別子になります。
シェーダーがステートオブジェクト内で完全に解決されていない場合、戻り値は nullptr になります。
HLSL のレイトレーシングシェーダーを呼び出すために必要なスタックメモリの量を取得します。
| pExportName | LPWSTR | in | スタックサイズを取得する対象となる、ステートオブジェクト内のシェーダーエントリポイント。ヒットグループの場合は、次の構文を使用してヒットグループ内の個々のシェーダーを指定する必要があります。 hitGroupName::shaderType ここで hitGroupName はヒットグループのエントリポイント名であり、shaderType は次のいずれかです。
値の例: "myTreeLeafHitGroup::anyhit"。 |
戻り値
シェーダーの呼び出しに必要なスタックメモリの量 (バイト単位)。シェーダーがステートオブジェクト内で完全に解決されていない場合、シェーダーが不明な場合、またはヒットグループのようにスタックサイズが関係しない種類のシェーダーである場合、戻り値は 0xffffffff になります。UINT64 の戻り値に対して 32 ビットの 0xffffffff という値を使用するのは、パイプライン全体のスタックサイズを計算するために他の値と合算した際に、不正な戻り値が埋もれてしまわないようにするためです。
解説(Remarks)
このメソッドを呼び出す必要があるのは、保守的な既定のスタックサイズに頼るのではなく、SetPipelineStackSize を呼び出してスタックサイズを構成したい場合のみです。このメソッドは、レイ生成シェーダー、ヒットグループ、ミスシェーダー、および呼び出し可能シェーダーに対してのみ有効です。レイ生成シェーダーはスタックの最下部に位置しますが、それでも 0 以外の値を返すことがあります。
ヒットグループの場合は、それを構成する個々のシェーダー (インターセクションシェーダー、エニーヒットシェーダー、クローゼストヒットシェーダー) ごとにスタックサイズを照会する必要があります。それぞれ必要なスタックサイズが異なる可能性が高いためです。これらの個々のシェーダーに対して直接スタックサイズを照会することはできません。コンパイルのされ方が、それらを含むヒットグループ全体の影響を受ける可能性があるためです。pExportName パラメーターには、ヒットグループ内の個々のシェーダーを識別するための構文が用意されています。
この API は、コレクションステートオブジェクトとレイトレーシングパイプラインステートオブジェクトのいずれに対しても呼び出すことができます。
現在のパイプラインスタックサイズを取得します。
戻り値
現在のパイプラインスタックサイズ (バイト単位)。コレクションなど、実行可能でないステートオブジェクトに対して呼び出した場合、戻り値は 0 になります。
解説(Remarks)
このメソッドと SetPipelineStackSize はリエントラントではありません。つまり、いずれか一方または両方を別々のスレッドから呼び出す場合、アプリ側で同期を行う必要があります。
現在のパイプラインスタックサイズを設定します。
| PipelineStackSizeInBytes | ULONGLONG | in | パイプライン実行時に各シェーダースレッドで使用するスタックサイズ (バイト単位)。GPU 上では数千個ものスレッドが同時に実行されることがあります。 値が 0xffffffff (32 ビット UINT の最大値) を超える場合、ランタイムは呼び出しを破棄し、デバッグレイヤーはエラーを出力します。これは、不正なパラメーターで GetShaderStackSize を呼び出したときに返される 0xffffffff という不正なスタックサイズを合算した結果である可能性が高いためです。この場合、以前に設定されたスタックサイズ、または既定値がそのまま維持されます。 |
解説(Remarks)
このメソッドと GetPipelineStackSize はリエントラントではありません。つまり、いずれか一方または両方を別々のスレッドから呼び出す場合、アプリ側で同期を行う必要があります。
ランタイムは、コレクションなど、レイトレーシングパイプライン以外のステートオブジェクトに対する呼び出しを破棄します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D12StateObjectProperties "{DE5FA827-9BF9-4F26-89FF-D7F56FDE3860}"
#usecom global ID3D12StateObjectProperties IID_ID3D12StateObjectProperties "{}"
#comfunc global ID3D12StateObjectProperties_GetShaderIdentifier 3 wstr
#comfunc global ID3D12StateObjectProperties_GetShaderStackSize 4 wstr
#comfunc global ID3D12StateObjectProperties_GetPipelineStackSize 5
#comfunc global ID3D12StateObjectProperties_SetPipelineStackSize 6 int64
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。