Treiberinterne Fehler (Direct3D 9)

In Direct3D 9 ermöglicht Direct3D dem Treiber, Fehlercodes wie E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY und D3DERR_UNSUPPORTEDCOLORARG zurückzugeben, sodass eine Anwendung darauf reagieren kann. Manchmal werden die API-Aufrufe, die diese Rückgabetypen generiert haben, in einen Befehlspuffer geladen und im Batch an die GPU gesendet (siehe Steuern von Runtime- 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 Runtime verwendet wird und eine Notiz für das Geräteobjekt gemacht wird, dass dies geschehen ist. Wenn die Anwendung später IDirect3DDevice9::P resent aufruft, gibt IDirect3DDevice9::P resent D3DERR_DRIVERINTERNALERROR zurück. Aus diesem Grund besteht der beste Ansatz für eine Anwendung beim Empfangen eines D3DERR_DRIVERINTERNALERROR von IDirect3DDevice9::P resent darin, das Gerät zu zerstören und neu zu erstellen.

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

  • Da die Liste der möglichen Rückgabewerte nicht vollständig 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 Ausgabedebugstream sollte dann den Aufruf anzeigen, der das Problem verursacht.

  • Versuchen Sie zum Debuggen außerdem, IDirect3DDevice9::ValidateDevice unmittelbar vor jedem IDirect3DDevice9::D rawPrimitive aufzurufen, um zu ermitteln, ob ein zusätzliches Problem mit dem Gerätetreiber vorliegt (nicht unterstützter Vorgang, nicht verwendbare Kombination von Texturformaten usw.).

    Hinweis

    IDirect3DDevice9::ValidateDevice sollte aufgrund der Menge an Validierungsarbeit, die der Treiber ausführen muss, um eine Antwort zurückzugeben, sorgfältig und sparsam verwendet werden.

     

Programmiertipps