Отладочные средства в Direct3D10 и Direct3D11 - SIISII/DirectX Wiki

Original URL: https://github.com/SIISII/DirectX/wiki/Отладочные-средства-в-Direct3D10-и-Direct3D11

Включение отладки приводит в процессе создания устройства к созданию отладочного слоя поверх собственно Direct3D. Он обеспечивает максимально полную проверку параметров, выдачу диагностических предупреждений и т. п., при этом заметно замедляя работу программы.

Чтобы иметь возможность использовать отладочный слой в Windows 7 с Platform Update и в Windows 8, необходимо установить Windows SDK для Windows 8, в котором содержится необходимая DLL. В Windows 10 необходимо установить через панель настройки дополнительные средства под общим названием «Graphics Tools».

Для создания отладочного слоя нужно при создании устройства [Direct3D](/SIISII/DirectX/wiki/Устройство Direct3D10 и Direct3D11) указать соответствующий флаг:

Если ОС располагает DirectX версии 11.1, при создании устройства Direct3D (средствами как Direct3D11, так и Direct3D10) можно указать флаг D3D10_CREATE_DEVICE_DEBUGGABLE или D3D11_CREATE_DEVICE_DEBUGGABLE, что заставит драйвер сохранять информацию, полезную для отладки шейдеров.

При создании [фабрики DXGI](/SIISII/DirectX/wiki/Фабрика DXGI) функцией CreateDXGIFactory2 можно указать флаг DXGI_CREATE_FACTORY_DEBUG, обеспечивающий создание отладочной версии фабрики. Более ранние версии этой функции не позволяют указывать такой флаг. Создание отладочной версии устройства Direct3D вызывает неявное создание отладочной версии фабрики.

Кроме того, имеется возможность включить отладку через панель управления DirectX или средствами Visual Studio, если такая возможность программой не заблокирована.

В выводимых отладочным слоем сообщениях часто указываются проблемные объекты. Чтобы было легче определить, к какому именно объекту относится сообщение, объектам можно присваивать имена. Для этого нужно вызвать через какой-либо интерфейс объекта метод с именем SetPrivateData (например, IDXGIObject::SetPrivateData, доступный для объектов [[DXGI]]) и указать в нём GUID WKPDID_D3DDebugObjectName (определён в файле D3Dcommon.h) вместе с желаемым именем и его длиной.