クエリ

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で、メソッド は BeginQueryEndQuery です

D3D12_QUERY_TYPE_TIMESTAMPは、 EndQuery のみをサポートする唯一のクエリです。 その他のすべてのクエリの種類には BeginQueryEndQuery が必要です。

デバッグ層により、以下が検証されます。

  • タイムスタンプ クエリを開始することは無効です。終了できるのは、
  • (所定の要素の) クエリを終了させずにクエリを 2 回開始することは違反です。 begin と end の両方を必要とするクエリの場合、対応する (特定の要素に対して) 開始する前にクエリを終了することは無効です。
  • BeginQuery に渡すクエリの種類と EndQuery に渡すクエリの種類は一致させる必要があります。

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

  • BeginQuery は、タイムスタンプ クエリでは呼び出すことができません。

  • BeginQueryEndQuery の両方をサポートするクエリの種類の場合 (タイムスタンプ以外のすべて)、所定の要素のクエリが、コマンド リスト境界に及ばないようにする必要があります。

  • 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する必要があります。