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 respondê-los. No entanto, às vezes, as chamadas de API que geraram esses tipos de retorno são carregadas em um buffer de comandos e são enviadas em lote para serem enviadas à GPU (consulte Controlling Runtime and Driver Optimizations). Nesse caso, os erros não podem ser retransmitidos para o aplicativo quando a ação precisa ser tomada, então o código de erro é consumido pelo tempo de execução e uma anotação é feita no objeto do dispositivo que isso aconteceu. Mais tarde, quando o aplicativo invocar IDirect3DDevice9::P resent, IDirect3DDevice9::P resent retornará D3DERR_DRIVERINTERNALERROR. É por isso que a melhor abordagem para um aplicativo ao receber um 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 de API está gerando o erro:
Como a lista de possíveis valores de retorno não está completa, você pode tentar descobrir qual chamada está falhando cercando cada chamada de API da seguinte forma:
TRACE ( "Calling DrawPrimitive" ); d3ddev->DrawPrim(...); TRACE ( "done\n" );
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 de dispositivo (operação não suportada, 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.
Tópicos relacionados