プレディケーション

プリディケーションは、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 は前提とされません。

カウンターとクエリ

パフォーマンス測定

プレディケーション クエリのチュートリアル