Внутренние ошибки драйвера (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 следует использовать осторожно и с осторожностью из-за объема проверочных работ, необходимых драйверу для возврата ответа.
Связанные темы