驱动程序内部错误 (Direct3D 9)

在 Direct3D 9 中,Direct3D 将允许驱动程序返回错误代码,例如E_OUTOFMEMORY、D3DERR_OUTOFVIDEOMEMORY和D3DERR_UNSUPPORTEDCOLORARG,以便应用程序能够响应它们。 但是,生成这些返回类型的 API 调用有时会加载到命令缓冲区中,并批处理以发送到 GPU (请参阅 控制运行时和驱动程序优化) 。 在这种情况下,当需要执行操作时,错误无法中继到应用程序,因此运行时会使用错误代码,并在设备对象上记下发生这种情况。 稍后,当应用程序调用 IDirect3DDevice9::P resent 时, IDirect3DDevice9::P resent 将返回D3DERR_DRIVERINTERNALERROR。 这就是为什么应用程序在从 IDirect3Device9::P resent 接收D3DERR_DRIVERINTERNALERROR时采用的最佳方法是销毁并重新创建设备。

如果要尝试进一步调试,下面是一些建议,用于尝试确定哪个 API 调用正在生成错误:

  • 由于可能返回值的列表不完整,因此可以通过围绕每个 API 调用来尝试查找失败的调用,如下所示:

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

    然后,输出调试流应显示导致问题的调用。

  • 此外,出于调试目的,请尝试在每个 IDirect3DDevice9::D rawPrimitive 之前立即调用 IDirect3DDevice9::ValidateDevice,以查看设备驱动程序是否存在其他问题, (不支持的操作、无法使用的纹理格式组合等) 。

    注意

    IDirect3DDevice9::ValidateDevice 应谨慎使用,因为驱动程序需要执行大量验证工作才能返回答案。

     

编程提示