次の方法で共有


ドライバーの内部エラー (Direct3D 9)

Direct3D 9 では、Direct3D は E_OUTOFMEMORY、D3DERR_OUTOFVIDEOMEMORY、D3DERR_UNSUPPORTEDCOLORARG などのエラー コードをドライバーが返すことを許可するため、アプリケーションはこれらに応答できます。ただし、これらの戻り型を生成した API 呼び出しはコマンド バッファーにロードされ、まとめて GPU に送信されることがあります (「ランタイムとドライバーの最適化の制御」を参照)。この場合、アクションを実行する必要がある場合にエラーはアプリケーションにリレーできません。そのためエラー コードはランタイムによって消費され、これが発生したデバイス オブジェクトに注意が付けられます。後で、アプリケーションが IDirect3DDevice9::Present を呼び出すと、IDirect3DDevice9::Present は D3DERR_DRIVERINTERNALERROR を返します。そのため、アプリケーションにとって、IDirect3DDevice9::Present から D3DERR_DRIVERINTERNALERROR を受け取ったときにデバイスを破壊して再作成することは最善のアプローチです。

さらにデバッグを試したい場合は、どの API 呼び出しがエラーを生成するかを知るための提案が 2 つあります。

  • 可能な戻り値のリストは完全ではないため、各 API 呼び出しを継ぎのように囲むことで、どの呼び出しが失敗しているかを見つけることができます。

    TRACE ( "Calling DrawPrimitive" );
    d3ddev->DrawPrim(...);
    TRACE ( "done¥n" );
    

    出力デバッグ ストリームは問題を引き起こす呼び出しを示します。

  • さらにデバッグ目的で、各 IDirect3DDevice9::DrawPrimitive の直前に IDirect3DDevice9::ValidateDevice を呼び出して、デバイス ドライバーにさらに問題 (サポートされていない操作、使用できないテクスチャー フォーマットの組み合わせなど) がないか確認してください。

        IDirect3DDevice9::ValidateDevice は、慎重かつ控えめに使用する必要があります。これは回答を返すためにドライバーが実行しなければならない検証作業の量が理由です。