Erros internos do driver (Direct3D 9)

No Direct3D 9, o Direct3D permitirá que o driver retorne códigos de erro como E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY e D3DERR_UNSUPPORTEDCOLORARG para que um aplicativo possa responder a eles. No entanto, às vezes, as chamadas à API que geraram esses tipos de retorno são carregadas em um buffer de comando e são colocadas em lote para serem enviadas para a GPU (consulte Controlando o runtime e as otimizações de driver). Nesse caso, os erros não podem ser retransmitidos para o aplicativo quando a ação precisa ser executada, portanto, o código de erro é consumido pelo runtime e uma anotação é feita no objeto do dispositivo que isso aconteceu. Posteriormente, quando o aplicativo invocar IDirect3DDevice9::P resent, IDirect3DDevice9::P resent retornará D3DERR_DRIVERINTERNALERROR. É por isso que a melhor abordagem para um aplicativo tomar ao receber uma D3DERR_DRIVERINTERNALERROR de IDirect3DDevice9::P resent é destruir e recriar o dispositivo.

Se você quiser tentar depurar mais, aqui estão algumas sugestões para tentar descobrir qual chamada à API está gerando o erro:

  • Como a lista de possíveis valores retornados não está concluída, você pode tentar localizar qual chamada está falhando ao cercar cada chamada à API desta forma:

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

    Em seguida, o fluxo de depuração de saída deve mostrar a chamada que está causando o problema.

  • Além disso, para fins de depuração, tente chamar IDirect3DDevice9::ValidateDevice imediatamente antes de cada IDirect3DDevice9::D rawPrimitive para ver se há um problema adicional com o driver do dispositivo (operação sem suporte, combinação inutilizável de formatos de textura etc).

    Observação

    IDirect3DDevice9::ValidateDevice deve ser usado com cuidado e moderação devido à quantidade de trabalho de validação que o driver precisa executar para retornar uma resposta.

     

Dicas de programação