クエリ
Direct3D 12 では、クエリは、クエリ ヒープと呼ばれるクエリの配列にグループ化されます。 クエリ ヒープには、そのヒープで使用できるクエリの有効な種類を定義する型があります。
Direct3D 11 と Direct3D 12 でのクエリの違い
次のクエリの種類は、Direct3D 12 では提供されなくなりました。これらの機能は、他のプロセスに組み込まれました。
- イベント クエリ - イベント機能は、フェンスによって処理されるようになりました。
- 不整合タイムスタンプ クエリ - GPU クロックは、Direct3D 12 では安定状態に設定できます (「タイミング」セクションを参照してください)。 GPU がタイムスタンプ間でまったくのアイドル状態の場合、GPU クロックの比較は意味がありません (不整合クエリと呼ばれます)。 安定した電力がある場合、異なるコマンド リストから発行された 2 つのタイムスタンプ クエリは確実に比較できます。 同じコマンド リスト内の 2 つのタイムスタンプは、常に確実に比較できます。
- ストリーム出力統計クエリ - Direct3D 12では、すべての出力ストリームに対する単一ストリーム出力 (SO) オーバーフロー クエリはありません。 アプリで複数の単一ストリーム クエリを発行し、その後、その結果を関連付ける必要があります。
- ストリーム出力統計前提クエリおよびオクルージョン前提クエリ - (メモリに書き込みを行う) クエリと (メモリから読み取りを行う) プレディケーションは結合されなくなり、これらのクエリの種類は不要となりました。
Direct3D 12 には、新しいバイナリ オクルージョン クエリの種類が追加されました。 これにより、オブジェクトが完全にオクルージョンされたかどうか (オクルージョンされたピクセル数ではなく) のみを対象とする割り当て戦略を使用して、これをデバイスに示すことができます。これにより、クエリをより効率的に実行できる可能性があります。
クエリ ヒープ
クエリは、さまざまな種類 (D3D12_QUERY_HEAP_TYPE) から 1 つであり、GPU に送信される前にクエリ ヒープにグループ化されます。
新しいクエリの種類D3D12_QUERY_TYPE_BINARY_OCCLUSION使用でき、D3D12_QUERY_TYPE_OCCLUSIONのように動作しますが、バイナリ 0/1 の結果が返される点が除きます。0 は、サンプルが深度テストとステンシル テストに合格しなかったことを示し、1 は少なくとも 1 つのサンプルが深度テストとステンシル テストに合格したことを示します。 これにより、オクルージョン クエリによって深度/ステンシル テストに関連する GPU パフォーマンスの最適化が妨げられるのを阻止できます。
クエリ ヒープの作成
クエリ ヒープの作成に関連する API は、列挙型 D3D12_QUERY_HEAP_TYPE、構造体 D3D12_QUERY_HEAP_DESC、および CreateQueryHeap メソッドです。
コア ランタイムは、クエリ ヒープの種類が D3D12_HEAP_TYPE 列挙体の有効なメンバーであり、カウントが 0 より大きいかどうかを検証します。
クエリ ヒープ内の個々のクエリ要素は個別に開始および停止できます。
クエリ ヒープを使用するための API は列挙型 D3D12_QUERY_TYPEで、メソッド は BeginQuery と EndQuery です。
D3D12_QUERY_TYPE_TIMESTAMPは、 EndQuery のみをサポートする唯一のクエリです。 その他のすべてのクエリの種類には BeginQuery と EndQuery が必要です。
デバッグ層により、以下が検証されます。
- タイムスタンプ クエリを開始することは無効です。終了できるのは、
- (所定の要素の) クエリを終了させずにクエリを 2 回開始することは違反です。 begin と end の両方を必要とするクエリの場合、対応する (特定の要素に対して) 開始する前にクエリを終了することは無効です。
- BeginQuery に渡すクエリの種類と EndQuery に渡すクエリの種類は一致させる必要があります。
コア ランタイムにより、以下が検証されます。
BeginQuery は、タイムスタンプ クエリでは呼び出すことができません。
BeginQuery と EndQuery の両方をサポートするクエリの種類の場合 (タイムスタンプ以外のすべて)、所定の要素のクエリが、コマンド リスト境界に及ばないようにする必要があります。
ElementIndex は範囲内にある必要があります。
クエリの種類は、 D3D12_QUERY_TYPE 列挙型の有効なメンバーです。
クエリの種類はクエリ ヒープと互換性がある必要があります。 次の表に、各クエリの種類に必要なクエリ ヒープの種類を示します。
クエリの型 クエリ ヒープの種類 D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS クエリの種類は、コマンド リストの種類でサポートされます。 次の表に、どのクエリがどのコマンド リストの種類でサポートされているかを示します。
クエリの型 サポートされているコマンド リストの種類 D3D12_QUERY_TYPE_OCCLUSION 直接 D3D12_QUERY_TYPE_BINARY_OCCLUSION 直接 D3D12_QUERY_TYPE_TIMESTAMP Direct、Compute、および必要に応じてコピー D3D12_QUERY_TYPE_PIPELINE_STATISTICS 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 直接 D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 直接
クエリからのデータの抽出
クエリからデータを抽出するには、ResolveQueryData メソッドを使用します。 ResolveQueryData は、すべてのメモリの種類 (システム メモリかデバイス ローカル メモリかに関係なく) で機能しますが、ターゲット リソースを D3D12_RESOURCE_STATE_COPY_DESTする必要があります。