ドライバーの内部エラー (Direct3D 9)
Direct3D 9 では、Direct3D では、ドライバーがE_OUTOFMEMORY、D3DERR_OUTOFVIDEOMEMORY、D3DERR_UNSUPPORTEDCOLORARGなどのエラー コードを返して、アプリケーションが応答できるようにします。 ただし、これらの戻り値の型を生成した API 呼び出しがコマンド バッファーに読み込まれ、GPU に送信されるようにバッチ処理される場合があります (「ランタイムとドライバーの最適化の制御を参照してください)。 この場合、アクションを実行する必要があるときにエラーをアプリケーションに中継できないため、ランタイムによってエラー コードが使用され、これが発生したことをデバイス オブジェクトにメモします。 後でアプリケーションが IDirect3DDevice9::P resent呼び出すと、IDirect3DDevice9::P resent D3DERR_DRIVERINTERNALERRORが返されます。 このため、IDirect3DDevice9::P resent からD3DERR_DRIVERINTERNALERRORを受け取るときにアプリケーションが実行する最善の方法は、デバイスを破棄して再作成することです。
さらにデバッグを試みる場合は、エラーを生成している API 呼び出しを調べるためのいくつかの提案を次に示します。
可能な戻り値の一覧が完全ではないため、次のように各 API 呼び出しを囲むことで、失敗している呼び出しを見つけることができます。
TRACE ( "Calling DrawPrimitive" ); d3ddev->DrawPrim(...); TRACE ( "done\n" );
出力デバッグ ストリームには、問題の原因となっている呼び出しが表示されます。
さらに、デバッグの目的で、各 IDirect3DDevice9::D rawPrimitive の直前 IDirect3DDevice9::ValidateDevice を呼び出して、デバイス ドライバーに追加の問題があるかどうかを確認してみてください (サポートされていない操作、テクスチャ形式の使用できない組み合わせなど)。
手記
IDirect3DDevice9::ValidateDevice は、ドライバーが応答を返すために実行する必要がある検証作業の量のため、慎重かつ控えめに使用する必要があります。
関連トピック