GPU からの情報のクエリ
Direct3D ランタイムでは、出力レンダー ターゲットまたは出力頂点バッファー以外に、グラフィックス処理装置 (GPU) からの情報を必要とする可能性があります。 GPU は CPU と並列に実行されるため、ユーザー モード ディスプレイ ドライバーは、GPU との通信の非同期性を効率的に公開する関数を提供する必要があります。
クエリ オブジェクトは、ランタイムとドライバーが非同期通知に使用するリソースです。 クエリ オブジェクトを作成するために、ランタイムはまずはドライバーの CalcPrivateQuerySize 関数を呼び出して、ドライバーがクエリ オブジェクトに必要とするメモリ領域のサイズを提供できるようにします。 その後、ランタイムはドライバーの CreateQuery(D3D10) 関数を呼び出して、クエリ オブジェクトを作成します。 CalcPrivateQuerySize および CreateQuery(D3D10) 呼び出しで、ランタイムは、pCreateQuery パラメーターが指す D3D10DDIARG_CREATEQUERY 構造体の Query メンバーの D3D10DDI_QUERY リストからのクエリ型の値を提供します。
各クエリ オブジェクト インスタンスは、ビルド中、発行済み、シグナル化の 3 つの状態のいずれかで存在します。 ランタイムは、ドライバーの QueryBegin 関数を呼び出して、クエリ オブジェクトをビルド中状態に移行させます。
注: D3D10DDI_QUERY_EVENT と D3D10DDI_QUERY_TIMESTAMP を除くすべてのクエリの型が、QueryBegin をサポートしています。 「ビルド中」の概念は、D3D10DDI_QUERY_EVENT と D3D10DDI_QUERY_TIMESTAMP には存在しません。
ランタイムは、ドライバーの QueryEnd 関数を呼び出して、クエリ オブジェクトを発行済み状態に移行させます。 シグナル化状態への移行は、しばらく後に非同期的に行われます。 ランタイムは、ドライバーの QueryGetData 関数を呼び出して、クエリがシグナル化状態に移行したかどうかを検知します。 クエリがシグナル化状態の場合、QueryGetData は、pData パラメーターが指すメモリ領域のクエリに適用されるデータを返すことができます。
型が同じであるクエリ オブジェクトはすべて、FIFO (つまり、先入れ先出し) です。 たとえば、D3D10DDI_QUERY_EVENT 型のすべてのクエリ オブジェクトは、発行された順序に基づいて FIFO 順に完了します。 ただし、型が異なるクエリ オブジェクトが、重複する順序で完了したりシグナルを送信したりする場合があります。 たとえば、D3D10DDI_QUERY_EVENT 型クエリは、ランタイムが D3D10DDI_QUERY_OCCLUSION クエリを発行した後に、D3D10DDI_QUERY_EVENT クエリを発行した場合でも、D3D10DDI_QUERY_OCCLUSION 型クエリの前に完了することがあります。
ランタイムがクエリ オブジェクトを必要としなくなった場合、ランタイムは以前にオブジェクトのために割り当てたメモリ領域を解放し、ドライバーの DestroyQuery(D3D10) 関数を呼び出して、ドライバーがこのメモリ領域にアクセスできなくなったことをドライバーに通知します。