ID3D12GraphicsCommandList1
COM公式ドキュメント
レンダリング用のグラフィックスコマンドのリストをカプセル化します。インターフェイスを拡張し、プログラマブルなサンプル位置、レイトラッチ技法を実装するためのアトミックコピー、およびオプションの深度境界テストをサポートします。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
UINT 型のプライマリデータ要素を、オプションの依存リソースとともに、あるリソースから別のリソースへアトミックにコピーします。
| pDstBuffer | ID3D12Resource* | in | SAL: UINT のプライマリデータ要素のコピー先となるリソースです。 |
| DstOffset | ULONGLONG | in | プライマリデータ要素のコピー先位置を指定する、コピー先リソースバッファー内のオフセット (バイト単位)。このオフセットとリソースバッファーのベースアドレスを合わせたメモリアドレスは、UINT 値として自然にアラインされている必要があります。 |
| pSrcBuffer | ID3D12Resource* | in | SAL: UINT のプライマリデータ要素のコピー元となるリソースです。このデータは通常、シェーダーコードがレイテンシーに敏感な情報の最新版を特定するために使用できるアドレス、インデックス、その他のハンドルです。 |
| SrcOffset | ULONGLONG | in | プライマリデータ要素のコピー元位置を指定する、コピー元リソースバッファー内のオフセット (バイト単位)。このオフセットとリソースバッファーのベースアドレスを合わせたメモリアドレスは、UINT 値として自然にアラインされている必要があります。 |
| Dependencies | DWORD | in | 依存リソースの数です。 |
| ppDependentResources | ID3D12Resource** | in | SAL: データペイロードの依存要素を含むリソースの配列です。 |
| pDependentSubresourceRanges | D3D12_SUBRESOURCE_RANGE_UINT64* | in | SAL: データペイロードの依存要素を指定するサブリソース範囲の配列です。これらの要素は、プライマリデータ要素自体がアトミックにコピーされる前に完全に更新されます。これにより、操作全体が論理的にアトミックであることが保証されます。つまり、プライマリデータ要素が不完全なデータペイロードを参照することはありません。 |
解説(Remarks)
このメソッドは通常、通常のレンダリングパイプラインのレイテンシーがユーザー体験を損なう可能性のあるリソースを更新するために使用します。たとえばアプリケーションは、最新のユーザー入力 (ヘッドマウントディスプレイのセンサーなど) からビュー行列を計算し、この関数を使用して、すでに GPU にディスパッチ済みのコマンドリスト内でその行列を更新・反映させることで、入力からレンダリングまでの体感レイテンシーを削減できます。
UINT64 型のプライマリデータ要素を、オプションの依存リソースとともに、あるリソースから別のリソースへアトミックにコピーします。
| pDstBuffer | ID3D12Resource* | in | SAL: UINT64 のプライマリデータ要素のコピー先となるリソースです。 |
| DstOffset | ULONGLONG | in | プライマリデータ要素のコピー先位置を指定する、コピー先リソースバッファー内のオフセット (バイト単位)。このオフセットとリソースバッファーのベースアドレスを合わせたメモリアドレスは、UINT64 値として自然にアラインされている必要があります。 |
| pSrcBuffer | ID3D12Resource* | in | SAL: UINT64 のプライマリデータ要素のコピー元となるリソースです。このデータは通常、シェーダーコードがレイテンシーに敏感な情報の最新版を特定するために使用できるアドレス、インデックス、その他のハンドルです。 |
| SrcOffset | ULONGLONG | in | プライマリデータ要素のコピー元位置を指定する、コピー元リソースバッファー内のオフセット (バイト単位)。このオフセットとリソースバッファーのベースアドレスを合わせたメモリアドレスは、UINT64 値として自然にアラインされている必要があります。 |
| Dependencies | DWORD | in | 依存リソースの数です。 |
| ppDependentResources | ID3D12Resource** | in | SAL: データペイロードの依存要素を含むリソースの配列です。 |
| pDependentSubresourceRanges | D3D12_SUBRESOURCE_RANGE_UINT64* | in | SAL: データペイロードの依存要素を指定するサブリソース範囲の配列です。これらの要素は、プライマリデータ要素自体がアトミックにコピーされる前に完全に更新されます。これにより、操作全体が論理的にアトミックであることが保証されます。つまり、プライマリデータ要素が不完全なデータペイロードを参照することはありません。 |
解説(Remarks)
このメソッドは通常、通常のレンダリングパイプラインのレイテンシーがユーザー体験を損なう可能性のあるリソースを更新するために使用します。たとえばアプリケーションは、最新のユーザー入力 (ヘッドマウントディスプレイのセンサーなど) からビュー行列を計算し、この関数を使用して、すでに GPU にディスパッチ済みのコマンドリスト内でその行列を更新・反映させることで、入力からレンダリングまでの体感レイテンシーを削減できます。
このメソッドを使用すると、深度境界 (depth bounds) を動的に変更できます。
| Min | FLOAT | in | SAL: 深度境界の最小値を指定します。既定値は 0 です。NaN 値は警告なく 0 に変換されます。 |
| Max | FLOAT | in | SAL: 深度境界の最大値を指定します。既定値は 1 です。NaN 値は警告なく 0 に変換されます。 |
解説(Remarks)
深度境界テストでは、現在格納されている深度値が Min と Max で指定された範囲 (両端を含む) の外にある場合に、ピクセルやサンプルを破棄できます。ピクセルまたはサンプルの現在格納されている深度値がこの範囲内にある場合は深度境界テストに合格し、レンダリングされます。そうでない場合は深度境界テストに失敗し、ピクセルまたはサンプルは破棄されます。なお、深度境界テストが参照するのは現在格納されている深度値であり、実行中のピクセルシェーダーが生成する深度値ではありません。
深度境界テストを使用するには、アプリケーションは新しい CreatePipelineState メソッドを使用して PSO 上で深度境界テストを有効にする必要があります。その後、このコマンドリストのメソッドを使用して深度境界を動的に変更できます。
OMSetDepthBounds はオプション機能です。この機能がユーザーモードドライバーでサポートされているかどうかを判定するには、CheckFeatureSupport メソッドを使用します。この機能のサポート状況は D3D12_FEATURE_D3D12_OPTIONS2 構造体を通じて報告されます。
このメソッドは、後続の描画、コピー、リゾルブなどの操作で使用されるサンプル位置を構成します。
| NumSamplesPerPixel | DWORD | in | SAL: ピクセルあたりに取得するサンプル数を指定します。この値は 1、2、4、8、16 のいずれかである必要があり、それ以外の場合 SetSamplePosition の呼び出しは破棄されます。サンプル数は描画時に PSO で構成されているサンプル数と一致する必要があり、一致しない場合の動作は未定義です。 |
| NumPixels | DWORD | in | SAL: サンプルパターンを指定する対象のピクセル数を指定します。この値は 1 または 4 のいずれかである必要があり、それ以外の場合 SetSamplePosition の呼び出しは破棄されます。値 1 は各ピクセルに単一のサンプルパターンを使用するよう構成します。値 4 は 2x2 のピクセルグリッド内の各ピクセルに個別のサンプルパターンを構成し、このグリッドはレンダーターゲットまたはビューポート空間全体にわたって偶数座標に整列して繰り返されます。 なお、合計サンプル数は 16 を超えることはできず、超えた場合は呼び出しが破棄されます。NumPixels に 4 を設定する場合、NumSamplesPerPixel に指定できるサンプル数は 4 以下です。 |
| pSamplePositions | D3D12_SAMPLE_POSITION* | in | SAL: D3D12_SAMPLE_POSITION 要素の配列を指定します。配列のサイズは NumPixels * NumSamplesPerPixel です。NumPixels に 4 を設定した場合、最初のサンプル位置グループは 2x2 ピクセルグリッドの左上のピクセルに対応し、次のグループは右上のピクセル、次は左下のピクセル、最後のグループは右下のピクセルに対応します。 レンダリング時にセントロイド補間を使用する場合、各ピクセルの位置の順序がセントロイドサンプリングの優先順位を決定します。つまり、指定した順序で最初にカバレッジされたサンプルがセントロイドのサンプル位置として選択されます。 |
解説(Remarks)
サンプル位置の動作上の意味は、発生しうる各種の描画、コピー、リゾルブなどの操作によって決まります。
CommandList: CommandList 内で SetSamplePositions が一度も呼び出されていない場合、サンプルはパイプラインステートオブジェクト (PSO) に基づく既定の位置になります。既定の位置は、PSO の SAMPLE_DESC 部分が存在すればそれによって決まり、PSO の RASTERIZER_DESC 部分の ForcedSampleCount が 0 より大きい値に設定されている場合は標準サンプル位置によって決まります。
SetSamplePosition を呼び出した後の描画呼び出しでは、PSO の SAMPLE_DESC 部分または RASTERIZER_DESC 部分の ForcedSampleCount のいずれかによって、一致するサンプル数を指定した PSO を使用する必要があります。
SetSamplePositions はグラフィックス CommandList でのみ呼び出せます。バンドル内では呼び出せません。バンドルはサンプル位置の状態を呼び出し元の CommandList から継承し、それを変更しません。
SetSamplePositions(0, 0, NULL) を呼び出すと、サンプル位置は既定値に戻ります。
Clear RenderTarget: レンダーターゲットをクリアする際、サンプル位置は無視されます。
Clear DepthStencil: 深度ステンシルサーフェスの深度部分またはその任意の領域をクリアする場合、サンプル位置は、クリアしたサーフェスまたは領域に対する今後のレンダリングで使用するものと一致するように設定する必要があります。異なるサンプル位置で生成された未クリア領域の内容は未定義になります。
深度ステンシルサーフェスのステンシル部分またはその任意の領域をクリアする場合、サンプル位置は無視されます。
Draw to RenderTarget: レンダーターゲットに描画する場合、以前の描画呼び出しと重なる領域に描画する場合であっても、描画呼び出しごとにサンプル位置を変更できます。現在のサンプル位置が各描画呼び出しの動作上の意味を決定し、サンプルはレンダーターゲットに格納された内容から取得されます。これはその内容が異なるサンプル位置で生成されていた場合でも同様です。
Draw using DepthStencil: 深度ステンシルサーフェスまたはその任意の領域に対して描画 (読み取りまたは書き込み) する場合、サンプル位置は、対象領域を以前クリアした際に使用したものと一致するように設定する必要があります。異なるサンプル位置を使用するには、まず対象領域をクリアする必要があります。クリア領域外のピクセルは影響を受けません。
ハードウェアは深度ステンシルサーフェスの深度部分を平面方程式として格納し、アプリケーションが読み取りを発行した際にそれを評価して深度値を生成する場合があります。プログラマブルなサンプル位置を深度ステンシルサーフェスの深度部分に対してサポートする必要があるのは、ラスタライザーと出力マージャーのみです。サンプル位置を設定してレンダリングされた深度部分に対するそれ以外の読み取りや書き込みは、それらを無視して標準の位置でサンプリングする場合があります。
Resolve RenderTarget: レンダーターゲットまたはその任意の領域をリゾルブする場合、サンプル位置は無視されます。これらの API は格納済みのカラー値に対してのみ動作します。
Resolve DepthStencil: 深度ステンシルサーフェスの深度部分またはその任意の領域をリゾルブする場合、サンプル位置は、リゾルブ対象のサーフェスまたは領域に対する過去のレンダリングで使用したものと一致するように設定する必要があります。異なるサンプル位置を使用するには、まず対象領域をクリアする必要があります。
深度ステンシルサーフェスのステンシル部分またはその任意の領域をリゾルブする場合、サンプル位置は無視されます。ステンシルのリゾルブは格納済みのステンシル値に対してのみ動作します。
Copy RenderTarget: レンダーターゲットからコピーする場合、全体コピーか部分コピーかにかかわらずサンプル位置は無視されます。
Copy DepthStencil (Full Subresource): 深度ステンシルサーフェスからサブリソース全体をコピーする場合、サンプル位置は、コピー元サーフェスを生成する際に使用したサンプル位置と一致するように設定する必要があります。異なるサンプル位置を使用するには、まず対象領域をクリアする必要があります。
一部のハードウェアでは、コピー元サーフェスのプロパティ (深度値の平面方程式の格納など) がコピー先に転送されます。そのため、コピー先サーフェスに後から描画する場合は、コピー元の内容を生成する際に使用したサンプル位置をコピー先サーフェスでも使用する必要があります。API は一貫性のため、一部のハードウェアにしか当てはまらない場合であっても、すべてのハードウェアでこれを要求します。
Copy DepthStencil (Partial Subresource): 深度ステンシルサーフェスからサブリソースの一部をコピーする場合も、サブリソース全体のコピーと同様に、サンプル位置は、コピー元サーフェスを生成する際に使用したサンプル位置と一致するように設定する必要があります。ただし、影響を受けるコピー先サブリソースの内容がコピーによって部分的にしかカバーされない場合、それらのサブリソース内のカバーされない部分の内容は、そのすべてがコピー元と同じサンプル位置で生成されていない限り未定義になります。異なるサンプル位置を使用するには、まず対象領域をクリアする必要があります。
深度ステンシルサーフェスのステンシル部分からサブリソースの一部をコピーする場合、サンプル位置は無視されます。コピーでカバーされないコピー先バッファーの他の領域の内容を生成する際にどのサンプル位置が使用されたかは問題になりません。それらの内容は有効なまま保たれます。
Shader SamplePos: HLSL の SamplePos 組み込み関数はプログラマブルなサンプル位置を認識しません。プログラマブルな位置でレンダリングされたサーフェスに対してこれを呼び出したシェーダーに返される結果は未定義です。必要な場合、アプリケーションは座標を手動でシェーダーに渡す必要があります。同様に、サンプルインデックスによる属性の評価もプログラマブルなサンプル位置では未定義です。
DEPTH_READ または DEPTH_WRITE 状態からの遷移: DEPTH_READ または DEPTH_WRITE 状態のサブリソースが、COPY_SOURCE や RESOLVE_SOURCE を含む他の任意の状態に遷移する場合、一部のハードウェアではサーフェスの展開 (デコンプレス) が必要になることがあります。そのため、コマンドリスト上のサンプル位置は、コピー元サーフェスの内容を生成する際に使用したものと一致するように設定する必要があります。さらに、同じ深度データがそのサーフェスに残っている間の以降のあらゆる遷移においても、サンプル位置はコマンドリストに設定されたものと一致し続ける必要があります。異なるサンプル位置を使用するには、まず対象領域をクリアする必要があります。
一部だけを使用する場合に展開される領域を最小化したい、あるいは単に圧縮を維持したい場合、アプリケーションは矩形を指定して DECOMPRESS モードで ResolveSubresourceRegion() を呼び出せます。これにより、関連する領域だけが別のリソースに展開され、一部のハードウェアではコピー元はそのまま維持されます (ただし他のハードウェアではコピー元の領域も展開されます)。明示的に展開された別リソースは、その後、目的の状態 (SHADER_RESOURCE など) に遷移させることができます。
RENDER_TARGET 状態からの遷移: RENDER_TARGET 状態のサブリソースが COPY_SOURCE または RESOLVE_SOURCE 以外の状態に遷移する場合、一部の実装ではサーフェスの展開が必要になることがあります。この展開はサンプル位置に依存しません。
一部だけを使用する場合に展開される領域を最小化したい、あるいは単に圧縮を維持したい場合、アプリケーションは矩形を指定して DECOMPRESS モードで ResolveSubresourceRegion() を呼び出せます。これにより、関連する領域だけが別のリソースに展開され、一部のハードウェアではコピー元はそのまま維持されます (ただし他のハードウェアではコピー元の領域も展開されます)。明示的に展開された別リソースは、その後、目的の状態 (SHADER_RESOURCE など) に遷移させることができます。
マルチサンプリングされた、または圧縮されたリソースの領域を、マルチサンプリングされていない、または圧縮されていないリソースにコピーします。
| pDstResource | ID3D12Resource* | in | SAL: コピー先リソースです。D3D11_USAGE_DEFAULT フラグを指定して作成されている必要があり、圧縮リソースからリゾルブする場合 (D3D12_RESOLVE_MODE_DECOMPRESS) を除き、シングルサンプルである必要があります。圧縮リソースからリゾルブする場合は、圧縮されたコピー元と同じサンプル数である必要があります。 |
| DstSubresource | DWORD | in | SAL: コピー先サブリソースを識別する 0 から始まるインデックスです。親リソースが複雑な構成の場合は、D3D12CalcSubresource を使用してサブリソースインデックスを計算してください。 |
| DstX | DWORD | in | SAL: コピー先領域の左端の X 座標です。コピー先領域の幅は、コピー元矩形の幅と同じです。 |
| DstY | DWORD | in | SAL: コピー先領域の上端の Y 座標です。コピー先領域の高さは、コピー元矩形の高さと同じです。 |
| pSrcResource | ID3D12Resource* | in | SAL: コピー元リソースです。マルチサンプリングされているか、圧縮されている必要があります。 |
| SrcSubresource | DWORD | in | SAL: コピー元サブリソースを識別する 0 から始まるインデックスです。 |
| pSrcRect | RECT* | inoptional | SAL: リゾルブするコピー元リソースの矩形領域を指定します。pSrcRect に NULL を渡すと、サブリソース全体がリゾルブされます。 |
| Format | DXGI_FORMAT | in | SAL: コピー元とコピー先のリソース形式をどのように統合するかを指定する DXGI_FORMAT です。 |
| ResolveMode | D3D12_RESOLVE_MODE | in | SAL: コピー元サンプルをリゾルブするために使用する操作を指定します。 D3D12_RESOLVE_MODE_DECOMPRESS 操作を使用する場合、コピー元とコピー先のサンプル数が同じであれば、サンプル数は 1 より大きくてもかまいません。また、コピー元矩形がコピー先の X 座標および Y 座標と一致する場合に限り、コピー元とコピー先に同じリソースを指定でき、その場合はその場で展開が行われます。 D3D12_RESOLVE_MODE_MIN、D3D12_RESOLVE_MODE_MAX、D3D12_RESOLVE_MODE_AVERAGE の操作を使用する場合、コピー先のサンプル数は 1 である必要があります。 |
解説(Remarks)
ResolveSubresourceRegion は ResolveSubresource と同様に動作しますが、リソースの一部のみをリゾルブしたり、コピー元サンプルを複数の方法でリゾルブしたりできます。部分的なリゾルブはマルチアダプターのシナリオで有用です。たとえばレンダリング領域を複数のアダプターに分割している場合、各アダプターは自身に割り当てられた区画に対応するサブリソースの部分のみをリゾルブすれば済みます。
後続の描画で有効になるビューインスタンスを制御するマスクを設定します。
| Mask | DWORD | in | どのビューを有効または無効にするかを指定するマスクです。最下位ビットから数えて i 番目のビットが設定されている場合、ビューインスタンス i が有効になります。 |
解説(Remarks)
ビューインスタンスマスクは、作成時に D3D12_VIEW_INSTANCING_FLAG_ENABLE_VIEW_INSTANCE_MASKING フラグを指定してビューインスタンスマスキングを宣言した PSO にのみ影響します。ビューインスタンシングをサポートしていないアダプターでは、ビューインスタンスマスキングを宣言する PSO の作成は失敗します。
ビューインスタンスマスクの既定値は 0 で、すべてのビューが無効になります。これにより、ビューインスタンスマスキングを宣言するアプリケーションは有効にするビューを明示的に選択せざるを得なくなります。そうしなければ何もレンダリングされません。仮にビューインスタンスマスクが既定ですべてのビューを有効にしていた場合、アプリケーションは未使用のビューを無効にし忘れ、無駄な処理によってパフォーマンスを損なうおそれがあります。
バンドルは呼び出し元からビューインスタンスマスクを継承せず、既定値の 0 になります。これは、実装が描画を記録する方法にマスク設定が影響する場合、バンドルの記録時にその設定が判明している必要があるためです。ただし、バンドルが設定したビューインスタンスマスクは、バンドル完了後も呼び出し元に持続します。この継承のセマンティクスは PSO のものと似ています。
マスクによって無効化されたビューインスタンスについては、SV_ViewID に依存するシェーダーコードパスはどのシェーダーステージでも実行されず、クリッピング、ビューポート処理、ラスタライズも行われません。レンダリング中にマスクを検査する実装では、ビューインスタンスマスキングをまったく宣言しない PSO と比べてわずかなパフォーマンス上のペナルティが生じることがありますが、通常はマスクで無効化されたビューに関連する処理を省略することによるパフォーマンス上の節約でそのペナルティを上回れます。省略される処理の頻度と量によっては、パフォーマンスの向上は大きなものになり得ます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D12GraphicsCommandList1 "{553103FB-1FE7-4557-BB38-946D7D0E7CA7}" #usecom global ID3D12GraphicsCommandList1 IID_ID3D12GraphicsCommandList1 "{}" #comfunc global ID3D12GraphicsCommandList1_AtomicCopyBufferUINT 60 sptr,int64,sptr,int64,int,sptr,var #comfunc global ID3D12GraphicsCommandList1_AtomicCopyBufferUINT64 61 sptr,int64,sptr,int64,int,sptr,var #comfunc global ID3D12GraphicsCommandList1_OMSetDepthBounds 62 float,float #comfunc global ID3D12GraphicsCommandList1_SetSamplePositions 63 int,int,var #comfunc global ID3D12GraphicsCommandList1_ResolveSubresourceRegion 64 sptr,int,int,int,sptr,int,var,int,int #comfunc global ID3D12GraphicsCommandList1_SetViewInstanceMask 65 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D12GraphicsCommandList1 "{553103FB-1FE7-4557-BB38-946D7D0E7CA7}" #usecom global ID3D12GraphicsCommandList1 IID_ID3D12GraphicsCommandList1 "{}" #comfunc global ID3D12GraphicsCommandList1_AtomicCopyBufferUINT 60 sptr,int64,sptr,int64,int,sptr,sptr #comfunc global ID3D12GraphicsCommandList1_AtomicCopyBufferUINT64 61 sptr,int64,sptr,int64,int,sptr,sptr #comfunc global ID3D12GraphicsCommandList1_OMSetDepthBounds 62 float,float #comfunc global ID3D12GraphicsCommandList1_SetSamplePositions 63 int,int,sptr #comfunc global ID3D12GraphicsCommandList1_ResolveSubresourceRegion 64 sptr,int,int,int,sptr,int,sptr,int,int #comfunc global ID3D12GraphicsCommandList1_SetViewInstanceMask 65 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。