IDirect3DQuery9
COM公式ドキュメント
IDirect3DQuery9 (d3d9.h) インターフェイスです。アプリケーションは IDirect3DQuery9 インターフェイスのメソッドを使用して、ドライバーに対する非同期クエリを実行します。
解説(Remarks)
LPDIRECT3DQUERY9 型および PDIRECT3DQUERY9 型は、IDirect3DQuery9 インターフェイスへのポインターとして定義されています。
typedef struct IDirect3DQuery9 *LPDIRECT3DQUERY9, *PDIRECT3DQUERY9;
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IDirect3DQuery9::GetDevice (d3d9.h) メソッドは、クエリ対象のデバイスを取得します。
| ppDevice | IDirect3DDevice9** | out | クエリ対象のデバイスへのポインターです。IDirect3DDevice9 を参照してください。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は D3DERR_INVALIDCALL になることがあります。
IDirect3DQuery9::GetType (d3d9.h) メソッドは、クエリの種類を取得します。
戻り値
型: D3DQUERYTYPE
クエリの種類を返します。D3DQUERYTYPE を参照してください。
IDirect3DQuery9::GetDataSize (d3d9.h) メソッドは、クエリデータのバイト数を取得します。
戻り値
型: DWORD
クエリデータのバイト数を返します。
IDirect3DQuery9::Issue (d3d9.h) メソッドは、クエリを発行します。
| dwIssueFlags | DWORD | in | クエリフラグは、クエリに対する状態変更の種類を指定します。D3DISSUE_BEGIN および D3DISSUE_END を参照してください。 |
戻り値
型: HRESULT
メソッドが成功した場合、戻り値は D3D_OK です。メソッドが失敗した場合、戻り値は D3DERR_INVALIDCALL になることがあります。
解説(Remarks)
クエリがシグナル状態になったということは、クエリが完了してデータが利用可能になり、IDirect3DQuery9::GetData が S_OK を返すことを意味します。
IDirect3DQuery9::GetData メソッド (d3d9.h) は、クエリ対象のリソースをポーリングして、クエリの状態またはクエリ結果を取得します。
| pData | void* | inout | クエリデータを格納するバッファーへのポインターです。このバッファーの確保はユーザーの責任です。pData に NULL を指定できるのは、dwSize が 0 の場合のみです。 |
| dwSize | DWORD | in | pData 内のデータのバイト数です。dwSize に 0 を設定すると、このメソッドを使用してリソースのクエリ状態をポーリングできます。「解説」を参照してください。 |
| dwGetDataFlags | DWORD | in | クエリの種類を指定するデータフラグです。有効な値は 0 または D3DGETDATA_FLUSH です。バッチ処理されたクエリをドライバーへフラッシュしない場合は 0 を、フラッシュする場合は D3DGETDATA_FLUSH を使用します。独自の待機処理を実装するアプリケーションでは、ドライバーがフラッシュを受け取るまでクエリ結果は確定しません。 |
戻り値
型: HRESULT
戻り値の型はクエリの状態を示します (Queries (Direct3D 9) を参照)。クエリデータが利用可能な場合は S_OK を、利用できない場合は S_FALSE を返します。これらはいずれも成功を示す戻り値です。D3DGETDATA_FLUSH を使用してメソッドが失敗した場合、戻り値は D3DERR_DEVICELOST になることがあります。
解説(Remarks)
クエリ状態のポーリング中にデバイスが失われる可能性があります。D3DGETDATA_FLUSH を指定した場合、デバイスが失われるとこのメソッドは D3DERR_DEVICELOST を返します。これにより、失われたデバイス (クエリに応答できないデバイス) が原因でスレッドが延々とポーリングし続けることを、アプリケーションが防止できます。
アプリケーションは、GetData ( ... , 0 ) のみを呼び出し、時間が経てば GetData がひとりでに S_OK を返すと期待するようなコードを決して記述してはいけません。これは、過去に GetData で FLUSH フラグを使用していた場合でも同様です。例:
// 無限ループになり得る:
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;
// これでもまだ無限ループになり得る:
pQuery->GetData( ... , D3DGETDATA_FLUSH );
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;
// 無限ループにはならない。最終的にコマンドバッファーが
// いっぱいになり、それによってフラッシュが発生するため。
while( pQuery->GetData( ..., 0 ) == S_FALSE ) {
pDevice->SetTexture(...);
pDevice->Draw(...);
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirect3DQuery9 "{D9771460-A695-4F26-BBD3-27B840B541CC}"
#usecom global IDirect3DQuery9 IID_IDirect3DQuery9 "{}"
#comfunc global IDirect3DQuery9_GetDevice 3 sptr
#comfunc global IDirect3DQuery9_GetType 4
#comfunc global IDirect3DQuery9_GetDataSize 5
#comfunc global IDirect3DQuery9_Issue 6 int
#comfunc global IDirect3DQuery9_GetData 7 sptr,int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。