非同期通知 (Direct3D 9)
パフォーマンスの劣化がない場合にアプリケーションが作成できるドライバーにはさまざまな興味深いクエリがあります。Direct3D 7 と Direct3D 8 では、同期クエリのメカニズムである GetInfo は統計などには効果的でしたが、パフォーマンスが重視されるクエリは追加されませんでした。本質的に非同期もの (フェンスなど) はほかにもあります。これは、同期クエリと非同期クエリの両方を作成する単純な API です。GetInfo は Direct3D 9 で廃止されます。
IDirect3DDevice9::CreateQuery を使用してクエリを作成します。この方法では、どんな種類のクエリを作成するかを定義し、IDirect3DQuery9 オブジェクトへのポインターを返す、D3DQUERYTYPE を使います。このタイプのクエリがクエリがサポートされていない場合は、この呼び出しは D3DERR_NOTAVAILABLE エラーを返します。クエリ オブジェクトを使用すると、アプリケーションは IDirect3DQuery9::Issue を使用してランタイムにクエリを送信し、IDirect3DQuery9::GetData を使用してクエリの状態をポーリングします。クエリの結果が使用できる場合、S_OK が返されます。使用できない場合は、S_FALSE が返されます。アプリケーションは、クエリ結果に適切なサイズのバッファーを渡す必要があります。
アプリケーションは、IDirect3DQuery9::GetData を指定した D3DGETDATA_FLUSH を使用してドライバーにクエリをフラッシュするようにランタイムに強制することもできます。ランタイムはフラッシュを発生させ、ドライバーにクエリを確認させます。この場合、デバイスが失われると、D3DERR_DEVICELOST が返されます。
デバイスが喪失すると、クエリはすべて喪失するため、アプリケーションはクエリを再作成する必要があります。デバイスがクエリをサポートせず、pQueryID が NULL の場合、クエリの作成は D3DERR_INVALIDCALL で異常終了します。
次の表は、クエリの種類ごとの重要な情報をまとめたものです。
QuertyType | 有効な発行フラグ | GetData バッファー | ランタイム | クエリの非明示的な開始 |
---|---|---|---|---|
D3DQUERYTYPE_VCACHE | D3DISSUE_END | D3DDEVINFO_VCACHE | リテール/デバッグ | CreateDevice |
D3DQUERYTYPE_ResourceManager | D3DISSUE_END | D3DDEVINFO_ResourceManager | デバッグのみ | Present |
D3DQUERYTYPE_VERTEXSTATS | D3DISSUE_END | D3DDEVINFO_D3DVERTEXSTATS | デバッグのみ | Present |
D3DQUERYTYPE_EVENT | D3DISSUE_END | BOOL | リテール/デバッグ | CreateDevice |
D3DQUERYTYPE_OCCLUSION | D3DISSUE_BEGIN,D3DISSUE_END | DWORD | リテール/デバッグ | なし |
IDirect3DQuery9::Issue のフラグ フィールド:
#define D3DISSUE_END (1 << 0)
// Tells the runtime to issue the end of a query, changing its state to
// "non-signaled"
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the
// beginning of a query.
IDirect3DQuery9::GetData のフラグ フィールド:
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush
// if the query is outstanding.