Поделиться через


Внутренние ошибки драйвера (Direct3D 9)

В Direct3D 9 Direct3D позволяет драйверу возвращать коды ошибок, такие как E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY и D3DERR_UNSUPPORTEDCOLORARG, чтобы приложение могло реагировать на них. Однако иногда вызовы API, создающие эти типы возвращаемых данных, загружаются в буфер команд и пакетируются для отправки в GPU (см. раздел Управление оптимизацией среды выполнения и драйвера). В этом случае ошибки не могут быть переданы в приложение, когда необходимо выполнить действие, поэтому код ошибки используется средой выполнения и в объекте устройства создается заметка о том, что это произошло. Позже, когда приложение вызывает IDirect3DDevice9::P resent, IDirect3DDevice9::P resent вернет D3DERR_DRIVERINTERNALERROR. Именно поэтому лучшим подходом для приложения при получении D3DERR_DRIVERINTERNALERROR от IDirect3Device9::P resent является уничтожение и повторное создание устройства.

Если вы хотите продолжить отладку, ознакомьтесь с несколькими рекомендациями по выяснению того, какой вызов API вызывает ошибку:

  • Так как список возможных возвращаемых значений не завершен, можно попытаться найти, какой вызов завершается сбоем, окружив каждый вызов API следующим образом:

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

    Затем в выходном потоке отладки должен отображаться вызов, вызывающий проблему.

  • Кроме того, в целях отладки попробуйте вызвать IDirect3Device9::ValidateDevice непосредственно перед каждым IDirect3Device9::D rawPrimitive , чтобы узнать, есть ли дополнительные проблемы с драйвером устройства (неподдерживаемая операция, непригодная комбинация форматов текстур и т. д.).

    Примечание

    IDirect3DDevice9::ValidateDevice следует использовать осторожно и с осторожностью из-за объема проверочных работ, необходимых драйверу для возврата ответа.

     

Советы по программированию