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


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

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

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

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

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

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

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

    Заметка

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

     

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