IDirect3DQuery9::GetData
クエリ対象のリソースをポーリングし、クエリの状態またはクエリの結果を取得します。クエリの詳細については、「クエリ (Direct3D 9)」を参照してください。
HRESULT
GetData(
void* pData,
DWORD dwSize,
DWORD dwGetDataFlags
);
パラメータ
- pData
クエリ データを含むバッファーへのポインターです。これは、ユーザーが割り当てる必要があります。pData を NULL にできるのは、dwSize が 0 の場合だけです。 - dwSize
pData 内のデータのバイト数。dwSize をゼロに設定すると、このメソッドを使用してリソースに対するポーリングを実行し、クエリの状態を取得できます。「解説」を参照してください。 - dwGetDataFlags
クエリの種類を指定するデータ フラグ。有効な値は、0 または D3DGETDATA_FLUSH です。ドライバーに対するバッチ クエリのフラッシュを防止するには 0 を指定し、それらをあえてフラッシュするには D3DGETDATA_FLUSH を指定します。独自の待機方法を使用するアプリケーションの場合、クエリの結果はドライバーがフラッシュを受け取るまで返されません。
戻り値
戻り型を見ると、クエリの状態がわかります (クエリ (Direct3D 9) を参照)。クエリ データが使用可能な場合は S_OK を、使用できない場合は S_FALSE を返します。これらは、メソッドが成功した場合の戻り値になります。D3DGETDATA_FLUSH の指定時にこのメソッドが失敗すると、戻り値が D3DERR_DEVICELOST になる場合があります。
解説
クエリの状態のポーリング時にデバイスが喪失する場合があります。D3DGETDATA_FLUSH を指定すると、このメソッドはデバイスの喪失に対応して D3DERR_DEVICELOST を返します。そのため、アプリケーションでは、デバイスの喪失が原因でスレッドがポーリングを無限に実行する (クエリに応答できない) のを防止できます。
GetData 自体が時間の経過に伴って S_OK を最終的に返すものと期待し、GetData ( ... , 0 ) を呼び出すだけのコードをアプリケーションで記述してはいけません。これは、過去にアプリケーションで FLUSH フラグを指定して GetData を実行した場合にも当てはまります。次に例を示します。
// Enables an infinite loop:
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;
// Still enables an infinite loop:
pQuery->GetData( ... , D3DGETDATA_FLUSH );
while( pQuery->GetData( ... , 0 ) == S_FALSE ) ;
// Does not enable an infinite loop because eventually the command
// buffer will fill up and that will cause a flush to occur.
while( pQuery->GetData( ..., 0 ) == S_FALSE ) {
pDevice->SetTexture(...);
pDevice->Draw(...);
}
要件
ヘッダー: D3D9.h 宣言