プレディケーション

Predication は、CPU ではなく GPU がオブジェクトの描画、コピー、ディスパッチを行わないかどうかを判断できるようにする機能です。

概要

プレディケーションは、通常、オクルージョンで使用します。描画した境界ボックスが覆い隠される場合、そのオブジェクト自体を描画しても明らかに意味がありません。 この状況では、オブジェクトの描画を "述語化" でき、GPU による実際のレンダリングからの削除が可能になります。

最初は、これは標準の深度テストと早期深度パスを超えて冗長に見える可能性があります。 ただし、プレディケーションによって、描画コマンドの状態自体のオーバーヘッドとラスタライズが削除される可能性があります。 初期深度パスでは不要なピクセルが削除されますが、頂点シェーダー、ハル シェーダー、ドメイン シェーダー、ジオメトリ シェーダーを実行し、固定関数入力アセンブラー、テッセレータ、ラスタライザーを呼び出すことができます。 単純な境界ボックスや、実際のモデルよりも処理とラスター化が簡単な境界ボリュームを描画することで、不要なラスター化と処理を回避できます。

Direct3D 11 と異なり、Direct3D 12 では、(オクルージョンのみでなく) アプリ開発者が決定した推論に基づいて、アプリケーションがオブジェクトを前提とできるようにするために、プレディケーションはクエリから切り離されて拡張されています。

SetPredication

プリディケーションは、バッファー内の 64 ビットの値に基づいて設定できます ( D3D12_PREDICATION_OPを参照)。

GPU は、SetPredication コマンドの実行時にバッファー内の値をスナップします。 バッファー内のデータへの以後の変更は、プレディケーション状態に遡及的には影響しません。

入力パラメーターのバッファーが NULL の場合、プレディケーションは無効です。

プレディケーション ヒントは Direct3D 12 API には存在しません。およびプリディケーションは、コマンド リストの直接、コンピューティング、およびコピーで許可されます。 ソース バッファーは、任意のヒープの種類 (既定、アップロード、読み取り戻し、カスタム) にすることができます。

コア ランタイムにより、以下が検証されます。

  • AlignedBufferOffset が 8 バイトの倍数であること
  • リソースがバッファーであること
  • 操作が列挙型の有効なメンバーであること
  • SetPredication をバンドル内から呼び出すことができないこと
  • コマンド リストの種類がプレディケーションをサポートしていること
  • オフセットがバッファー サイズを超過していないこと

ソース バッファーが D3D12_RESOURCE_STATE_PREDICATION ( D3D12_RESOURCE_STATE_INDIRECT_ARGUMENTと同じで、単にエイリアス) 状態でない場合、デバッグ レイヤーはエラーを発行します。

前提にすることができる一連の操作を次に示します。

ExecuteBundle は、それ自体を前提としません。 代わりに、バンドルの側に含まれる、上記の一覧の個々の操作が前提とされます。

ID3D12GraphicsCommandList のメソッド ResolveQueryDataBeginQuery、および EndQuery は前提とされません。

カウンターとクエリ

パフォーマンス測定

プレディケーション クエリのチュートリアルに関する記事