非同期通知
非同期通知
パフォーマンスに影響しなければアプリケーションがドライバに対して行える興味深い問い合わせが多数ある。Microsoft® DirectX® 7.0 および DirectX 8.x には、GetInfo という同期的問い合わせメカニズムがあった。このメカニズムは統計情報などの問い合わせに有効だったが、パフォーマンスに大きな影響を及ぼす問い合わせは含まれなかった。これに対し、フェンスなどは本質的に非同期的である。これは単純なアプリケーション プログラミング インターフェイス (API) で、同期と非同期の両方の問い合わせを行うことができる。DirectX 9.0 では GetInfo は使えない。
問い合わせを作成するには、IDirect3DDevice9::CreateQuery を使う。このメソッドは、実行する問い合わせの種類を定義する D3DQUERYTYPE を受け取り、IDirect3DQuery9 オブジェクトへのポインタを返す。問い合わせのタイプがサポートされていない場合、呼び出しはエラー D3DERR_NOTAVAILABLE を返す。このオブジェクトを使うと、アプリケーションは IDirect3DQuery9::Issue でランタイムに対して問い合わせを実行でき、IDirect3DQuery9::GetData で問い合わせのステータスをポーリングできる。問い合わせの結果が利用可能な場合は S_OK が返される。それ以外の場合は S_FALSE が返される。アプリケーションは、問い合わせの結果に適したサイズのバッファを渡す必要がある。
アプリケーションは、D3DGETDATA_FLUSH を IDirect3DQuery9::GetData と共に使って、ランタイムからドライバに強制的に問い合わせをフラッシュできる。これにより、フラッシュが実行され、ドライバに強制的に問い合わせが伝えられる。このとき、デバイスが失われた場合は、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 | リテール/デバッグ | N/A |
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
// beginng of a query.
IDirect3DQuery9::GetData のフラグ フィールド
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush
// if the query is outstanding.