Interne Treiberfehler (Direct3D 9)

In Direct3D 9 ermöglicht Direct3D dem Treiber, Fehlercodes wie E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY und D3DERR_UNSUPPORTEDCOLORARG zurückzugeben, damit eine Anwendung darauf reagieren kann. Manchmal werden jedoch die API-Aufrufe, die diese Rückgabetypen generiert haben, in einen Befehlspuffer geladen und an die GPU gesendet (siehe Steuern der Laufzeit und Treiberoptimierungen). In diesem Fall können die Fehler nicht an die Anwendung weitergeleitet werden, wenn eine Aktion ausgeführt werden muss, sodass der Fehlercode von der Laufzeit verwendet wird und eine Notiz auf dem Geräteobjekt vorgenommen wird, das aufgetreten ist. Später, wenn die Anwendung IDirect3DDevice9::P resentaufruft, gibt IDirect3DDevice9::P resent D3DERR_DRIVERINTERNALERROR zurück. Aus diesem Grund ist der beste Ansatz für eine Anwendung, die beim Empfang einer D3DERR_DRIVERINTERNALERROR von IDirect3DDevice9::P resent, das Gerät zu zerstören und neu zu erstellen.

Wenn Sie weiter debuggen möchten, finden Sie hier einige Vorschläge, um herauszufinden, welcher API-Aufruf den Fehler generiert:

  • Da die Liste der möglichen Rückgabewerte nicht abgeschlossen ist, können Sie versuchen, zu ermitteln, welcher Aufruf fehlschlägt, indem Sie jeden API-Aufruf wie folgt umgibt:

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

    Der Ausgabedebugdatenstrom sollte dann den Aufruf anzeigen, der das Problem verursacht.

  • Versuchen Sie außerdem, IDirect3DDevice9::ValidateDevice unmittelbar vor jedem IDirect3DDevice9::D rawPrimitive aufzurufen, um festzustellen, ob ein zusätzliches Problem mit dem Gerätetreiber vorliegt (nicht unterstützte Operation, nicht verwendbare Kombination aus Texturformaten usw.).

    Hinweis

    IDirect3DDevice9::ValidateDevice sollte sorgfältig und sparsam verwendet werden, da die Überprüfungsarbeit des Treibers ausgeführt werden muss, um eine Antwort zurückzugeben.

     

Programmiertipps