ID3D12GraphicsCommandList4
COM公式ドキュメント
レンダリング用のグラフィックスコマンドのリストをカプセル化し、レイトレーシングとレンダーパスをサポートするようにインターフェイスを拡張します。
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
レンダーパスの期間中にバインドされる出力リソースのセットをバインドすることで、レンダーパスの開始を示します。これらのバインディングは、1 つ以上のレンダーターゲットビュー (RTV)、および (または) 深度ステンシルビュー (DSV) に対して行われます。
| NumRenderTargets | DWORD | in | UINT です。バインドするレンダーターゲットの数。 |
| pRenderTargets | D3D12_RENDER_PASS_RENDER_TARGET_DESC* | inoptional | 定数 D3D12_RENDER_PASS_RENDER_TARGET_DESC へのポインター。1 つ以上のレンダーターゲットビュー (RTV) へのバインディング (レンダーパスの期間中は固定) と、その開始時および終了時のアクセス特性を記述します。 |
| pDepthStencil | D3D12_RENDER_PASS_DEPTH_STENCIL_DESC* | inoptional | 定数 D3D12_RENDER_PASS_DEPTH_STENCIL_DESC へのポインター。深度ステンシルビュー (DSV) へのバインディング (レンダーパスの期間中は固定) と、その開始時および終了時のアクセス特性を記述します。 |
| Flags | D3D12_RENDER_PASS_FLAGS | in | D3D12_RENDER_PASS_FLAGS です。レンダーパスの性質および要件を指定します。たとえば、中断 (suspending) または再開 (resuming) のレンダーパスであるかどうか、アンオーダードアクセスビューへの書き込みを行うかどうかなどです。 |
レンダーパスの終了を示します。
指定したメタコマンドを初期化します。
| pMetaCommand | ID3D12MetaCommand* | in | 初期化するメタコマンドを表す ID3D12MetaCommand へのポインター。 |
| pInitializationParametersData | void* | inoptional | メタコマンドを初期化するためのパラメーター値を格納した定数構造体への省略可能なポインター。 |
| InitializationParametersDataSizeInBytes | UINT_PTR | in | pInitializationParametersData が指定されている場合は、それが指す構造体のサイズを格納する SIZE_T。指定されていない場合は 0。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
指定したメタコマンドの実行 (呼び出し) をグラフィックスコマンドリストに記録します。
| pMetaCommand | ID3D12MetaCommand* | in | 初期化するメタコマンドを表す ID3D12MetaCommand へのポインター。 |
| pExecutionParametersData | void* | inoptional | メタコマンドを実行するためのパラメーター値を格納した定数構造体への省略可能なポインター。 |
| ExecutionParametersDataSizeInBytes | UINT_PTR | in | pExecutionParametersData が指定されている場合は、それが指す構造体のサイズを格納する SIZE_T。指定されていない場合は 0。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
メタコマンドに渡すリソースを、メタコマンドの仕様で要求される状態に設定するのはアプリケーションの責任です。メタコマンドの定義仕様には、各パラメーターに期待されるリソース状態が定められています。 メタコマンドのアルゴリズムが入力リソースを利用できるようにするために、その前にアンオーダードアクセスビュー (UAV) バリアを挿入するのはアプリケーションの責任です。また、出力リソースを読み戻す場合には、そのための UAV バリアを挿入するのもアプリケーションの責任です。
アルゴリズムの実行中、ドライバーは、アルゴリズム実装内での出力リソースの使用を同期するために必要なだけ、出力リソースに対する UAV バリアを挿入することがあります。アプリケーションから見た場合、スクラッチメモリを含め、すべての出力および入出力リソースがメタコマンドによって書き込まれるものと想定してください。
GPU 上でレイトレーシング高速化構造のビルドを実行し、必要に応じてビルド直後にビルド後情報 (post-build info) を出力します。
| pDesc | D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC* | in | ビルドする高速化構造の記述。 |
| NumPostbuildInfoDescs | DWORD | in | pPostbuildInfoDescs 配列のサイズ。ビルド後情報が不要な場合は 0 を設定します。 |
| pPostbuildInfoDescs | D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC* | inoptional | ビルドされた高速化構造のプロパティを示すビルド後情報を生成するための、記述の省略可能な配列。 |
解説(Remarks)
このメソッドは、グラフィックスまたはコンピュートのコマンドリストから呼び出せますが、バンドルからは呼び出せません。
ビルド後情報は、すでにビルド済みの高速化構造に対して EmitRaytracingAccelerationStructurePostbuildInfo を呼び出すことで、個別に取得することもできます。ビルドと同時にビルド後情報を生成する利点は、ビルドの完了とビルド後情報の要求との間にバリアが不要になることであり、アプリケーションがビルド後情報を直ちに必要とするシナリオに対応できます。
高速化構造のセットに対してビルド後のプロパティを出力します。これにより、アプリケーションは ID3D12GraphicsCommandList4::CopyRaytracingAccelerationStructure による高速化構造の操作に必要な出力リソース要件を知ることができます。
| pDesc | D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC* | in | 生成するビルド後情報を記述する D3D12_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC オブジェクト。 |
| NumSourceAccelerationStructures | DWORD | in | pSourceAccelerationStructureData が指す、高速化構造の GPU 仮想アドレスへのポインターの数。この数は出力側にも影響し、出力は NumSourceAccelerationStructures 個の出力構造体が連続して並ぶ配列になります。その構造体の型は、pDesc の記述で指定された InfoType フィールドによって決まります。 |
| pSourceAccelerationStructureData | ULONGLONG* | in | サイズ NumSourceAccelerationStructures の GPU 仮想アドレス配列へのポインター。 アドレスは、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT として定義されている 256 バイト境界にアラインされている必要があります。 ポインターが指すメモリは D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE 状態でなければなりません。 |
解説(Remarks)
このメソッドは、グラフィックスまたはコンピュートのコマンドリストから呼び出せますが、バンドルからは呼び出せません。
指定した変換を適用しながら、コピー元の高速化構造をコピー先メモリへコピーします。
| DestAccelerationStructureData | ULONGLONG | in | コピー先のメモリ。指定した Mode に応じて必要な場合は、事前に EmitRaytracingAccelerationStructurePostbuildInfo を呼び出すことで、必要なサイズを知ることができます。 コピー先の開始アドレスは、指定した Mode に関係なく、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT として定義されている 256 バイト境界にアラインされている必要があります。 コピー先のメモリ範囲は、コピー元と重なってはなりません。重なった場合の結果は未定義です。 ポインターが指すメモリが満たすべきリソース状態は、Mode パラメーターによって異なります。詳細については、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE を参照してください。 |
| SourceAccelerationStructureData | ULONGLONG | in | 指定した Mode に基づいてコピーまたは変換される、高速化構造その他の型のデータのアドレス。このデータは変更されず、引き続き使用できます。この操作では、SourceAccelerationStructureData が指すデータのみがコピーされ、そのデータが参照している他のデータ (高速化構造など) はコピーされません。たとえば、トップレベル高速化構造の場合、それが参照するボトムレベル高速化構造は、この操作ではコピーされません。 コピー元のメモリは、指定した Mode に関係なく、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BYTE_ALIGNMENT として定義されている 256 バイト境界にアラインされている必要があります。 ポインターが指すメモリが満たすべきリソース状態は、Mode パラメーターによって異なります。詳細については、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE を参照してください。 |
| Mode | D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE | in | 実行するコピー操作の種類。詳細については、D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE を参照してください。 |
解説(Remarks)
レイトレーシング高速化構造は内部ポインターを含む場合があり、デバイス依存の不透明なレイアウトを持つため、それらをコピーしたり操作したりするには専用の API が必要です。これにより、ドライバーが要求された操作を適切に処理できます。
このメソッドは、グラフィックスまたはコンピュートのコマンドリストから呼び出せますが、バンドルからは呼び出せません。
コマンドリストにステートオブジェクトを設定します。
| pStateObject | ID3D12StateObject* | in | コマンドリストに設定するステートオブジェクト。現在のリリースでは、型は D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE のみ指定できます。 |
解説(Remarks)
このメソッドは、グラフィックスまたはコンピュートのコマンドリスト、およびバンドルから呼び出せます。
このメソッドは、グラフィックスシェーダーとコンピュートシェーダーに対してのみ定義されている ID3D12GraphicsCommandList::SetPipelineState の代替です。1 つのコマンドリスト上でアクティブなパイプラインステートは常に 1 つだけであるため、どちらの呼び出しも現在のパイプラインステートを設定します。両者の違いは、それぞれが特定の種類のパイプラインステートのみを設定するという点です。現在のリリースでは、SetPipelineState1 はレイトレーシングパイプラインステートの設定にのみ使用されます。
レイ生成シェーダーのスレッドを起動します。
| pDesc | D3D12_DISPATCH_RAYS_DESC* | in | レイディスパッチの記述。 |
解説(Remarks)
このメソッドは、グラフィックスまたはコンピュートのコマンドリスト、およびバンドルから呼び出せます。
コマンドリストにレイトレーシングパイプラインステートが設定されている必要があります。設定されていない場合、この呼び出しの動作は未定義です。
グリッドサイズを設定するために、width / height / depth の 3 つの次元を渡します。これらの次元には、width * height * depth <= 2^30 という制約があります。これを超えた場合の動作は未定義です。 いずれかのグリッド次元が 0 の場合、スレッドは起動されません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D12GraphicsCommandList4 "{8754318E-D3A9-4541-98CF-645B50DC4874}" #usecom global ID3D12GraphicsCommandList4 IID_ID3D12GraphicsCommandList4 "{}" #comfunc global ID3D12GraphicsCommandList4_BeginRenderPass 68 int,var,var,int #comfunc global ID3D12GraphicsCommandList4_EndRenderPass 69 #comfunc global ID3D12GraphicsCommandList4_InitializeMetaCommand 70 sptr,sptr,sptr #comfunc global ID3D12GraphicsCommandList4_ExecuteMetaCommand 71 sptr,sptr,sptr #comfunc global ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure 72 var,int,var #comfunc global ID3D12GraphicsCommandList4_EmitRaytracingAccelerationStructurePostbuildInfo 73 var,int,var #comfunc global ID3D12GraphicsCommandList4_CopyRaytracingAccelerationStructure 74 int64,int64,int #comfunc global ID3D12GraphicsCommandList4_SetPipelineState1 75 sptr #comfunc global ID3D12GraphicsCommandList4_DispatchRays 76 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D12GraphicsCommandList4 "{8754318E-D3A9-4541-98CF-645B50DC4874}" #usecom global ID3D12GraphicsCommandList4 IID_ID3D12GraphicsCommandList4 "{}" #comfunc global ID3D12GraphicsCommandList4_BeginRenderPass 68 int,sptr,sptr,int #comfunc global ID3D12GraphicsCommandList4_EndRenderPass 69 #comfunc global ID3D12GraphicsCommandList4_InitializeMetaCommand 70 sptr,sptr,sptr #comfunc global ID3D12GraphicsCommandList4_ExecuteMetaCommand 71 sptr,sptr,sptr #comfunc global ID3D12GraphicsCommandList4_BuildRaytracingAccelerationStructure 72 sptr,int,sptr #comfunc global ID3D12GraphicsCommandList4_EmitRaytracingAccelerationStructurePostbuildInfo 73 sptr,int,sptr #comfunc global ID3D12GraphicsCommandList4_CopyRaytracingAccelerationStructure 74 int64,int64,int #comfunc global ID3D12GraphicsCommandList4_SetPipelineState1 75 sptr #comfunc global ID3D12GraphicsCommandList4_DispatchRays 76 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。