プレディケーションPredication

プレディケーションとは、CPU ではなく GPU がオブジェクトを描画、コピー、またはディスパッチしないことを決定できるようにする機能です。Predication is a feature that enables the GPU rather than the CPU to determine to not draw, copy or dispatch an object.

概要Overview

プレディケーションは、通常、オクルージョンで使用します。描画した境界ボックスが覆い隠される場合、そのオブジェクト自体を描画しても明らかに意味がありません。The typical use of predication is with occlusion; if a bounding box is drawn and is occluded, there is obviously no point in drawing the object itself. このような状況では、オブジェクトの描画は "前提にする" ことができ、GPU による実際のレンダリングから削除できます。In this situation the drawing of the object can be "predicated" , enabling its removal from actual rendering by the GPU.

Direct3D 11 と異なり、Direct3D 12 では、(オクルージョンのみでなく) アプリ開発者が決定した推論に基づいて、アプリケーションがオブジェクトを前提とできるようにするために、プレディケーションはクエリから切り離されて拡張されています。Unlike Direct3D 11, predication is decoupled from queries, and is expanded in Direct3D 12 to enable an application to predicate objects based on any reasoning the app developer may decide on (not just occlusion).

SetPredicationSetPredication

プレディケーションは、バッファー内の 64 ビットの値に基づき設定できます (D3D12_PREDICATION_OP に関する記事を参照してください)。Predication can be set based on the value of 64-bits within a buffer (refer to D3D12_PREDICATION_OP).

GPU は、SetPredication コマンドの実行時にバッファー内の値をスナップします。When the GPU executes a SetPredication command it snaps the value in the buffer. バッファー内のデータへの以後の変更は、プレディケーション状態に遡及的には影響しません。Future changes to the data in the buffer do not retroactively affect the predication state.

入力パラメーターのバッファーが NULL の場合、プレディケーションは無効です。If the input parameter Buffer is NULL, then predication is disabled.

プレディケーションのヒントは D3D12 API では提供されません。プレディケーションは直接コマンド リストと計算コマンド リストで許可されます。Predication hints are not present in the D3D12 API, and predication is allowed on direct and compute command lists. ソース バッファーとして任意のヒープの種類 (既定、アップロード、リードバック) を使用できます。The source buffer can be in any heap type (default, upload, readback).

コア ランタイムにより、以下が検証されます。The core runtime will validate the following:

  • AlignedBufferOffset が 8 バイトの倍数であることAlignedBufferOffset is a multiple of 8 bytes
  • リソースがバッファーであることThe resource is a buffer
  • 操作が列挙型の有効なメンバーであることThe operation is a valid member of the enumeration
  • SetPredication をバンドル内から呼び出すことができないことSetPredication cannot be called from within a bundle
  • コマンド リストの種類がプレディケーションをサポートしていることThe command list type supports predication
  • オフセットがバッファー サイズを超過していないことThe offset does not exceed the buffer size

ソース バッファーが D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER 状態ではない場合、デバッグ層によってエラーが発行されます。The debug layer will issue an error if the source buffer is not in the D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER state.

前提にすることができる一連の操作を次に示します。The set of operations which can be predicated are:

ExecuteBundle は、それ自体を前提としません。ExecuteBundle is not predicated itself. 代わりに、バンドルの側に含まれる、上記の一覧の個々の操作が前提とされます。Instead, individual operations from the list above which are contained in side of the bundle are predicated.

ID3D12GraphicsCommandList のメソッド ResolveQueryDataBeginQuery、および EndQuery は前提とされません。The ID3D12GraphicsCommandList methods ResolveQueryData, BeginQuery and EndQuery are not predicated.

カウンターとクエリCounters and Queries

パフォーマンス測定Performance Measurement

プレディケーション クエリのチュートリアルPredication queries walk-through