Errori interni del driver (Direct3D 9)

In Direct3D 9, Direct3D consentirà al driver di restituire codici di errore, ad esempio E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY e D3DERR_UNSUPPORTEDCOLORARG in modo che un'applicazione possa rispondere. Tuttavia, a volte le chiamate API che hanno generato questi tipi restituiti vengono caricate in un buffer dei comandi e vengono inviate in batch fino a essere inviate alla GPU (vedere Controlling Runtime and Driver Optimizations). In questo caso, gli errori non possono essere inoltrati all'applicazione quando è necessario eseguire un'azione, quindi il codice di errore viene utilizzato dal runtime e viene effettuata una nota sull'oggetto dispositivo che si è verificato. Successivamente, quando l'applicazione richiama IDirect3DDevice9::P resent, IDirect3DDevice9::P resent restituirà D3DERR_DRIVERINTERNALERROR. Ecco perché l'approccio migliore per un'applicazione da adottare quando riceve un D3DERR_DRIVERINTERNALERROR da IDirect3DDevice9::P resent consiste nell'eliminare e ricreare il dispositivo.

Se si vuole provare a eseguire il debug ulteriormente, ecco alcuni suggerimenti per provare a capire quale chiamata API genera l'errore:

  • Poiché l'elenco dei possibili valori restituiti non è completo, è possibile provare a trovare quale chiamata ha esito negativo circondando ogni chiamata API simile alla seguente:

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

    Il flusso di debug di output dovrebbe quindi visualizzare la chiamata che causa il problema.

  • Inoltre, a scopo di debug, provare a chiamare IDirect3DDevice9::ValidateDevice immediatamente prima di ogni IDirect3DDevice9::D rawPrimitive per verificare se si verifica un problema aggiuntivo con il driver di dispositivo (operazione non supportata, combinazione inutilizzabile di formati di trama e così via).

    Nota

    IDirect3DDevice9::ValidateDevice deve essere usato con attenzione e con moderazione a causa della quantità di lavoro di convalida che il driver deve eseguire per restituire una risposta.

     

Suggerimenti per la programmazione