次の方法で共有


クエリ

Direct3D 12 では、クエリはクエリ ヒープと呼ばれるクエリの配列にグループ化されます。 クエリ ヒープには、そのヒープで使用できる有効なクエリの種類を定義する型があります。

Direct3D 11 から Direct3D 12 へのクエリの違い

次のクエリの種類は Direct3D 12 に存在しなくなり、その機能は他のプロセスに組み込まれています。

  • イベント クエリ - イベントは機能的にフェンスによって処理されるようになりました。
  • 不整合タイムスタンプ クエリ - GPU クロックは Direct3D 12 で安定した状態に設定できます (「タイミング」セクションを参照)。 GPU クロックの比較は、タイムスタンプ (不整合なクエリと呼ばれます) の間で GPU がまったくアイドル状態になっている場合には意味がありません。 安定したパワーでは、異なるコマンド リストから発行された 2 つのタイムスタンプ クエリが確実に同等です。 同じコマンド リスト内の 2 つのタイムスタンプは、常に確実に同等です。
  • ストリーム出力統計クエリ - Direct3D 12 では、すべての出力ストリームに対する単一ストリーム出力 (SO) オーバーフロー クエリはありません。 アプリでは、複数の単一ストリーム クエリを発行し、結果を関連付ける必要があります。
  • ストリーム出力統計述語クエリとオクルージョン述語クエリ - クエリ (メモリへの書き込み) と Predication (メモリからの読み取り) は結合されなくなったため、これらのクエリの種類は必要ありません。

新しいバイナリ オクルージョン クエリの種類が 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する必要があります。