Отладочные средства в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki
Включение отладки приводит в процессе создания устройства к созданию отладочного слоя поверх собственно Direct3D. Он обеспечивает максимально полную проверку параметров, выдачу диагностических предупреждений и т. п., при этом заметно замедляя работу программы.
Чтобы иметь возможность использовать отладочный слой в Windows 7 с Platform Update и в Windows 8, необходимо установить Windows SDK для Windows 8, в котором содержится необходимая DLL. В Windows 10 необходимо установить через панель настройки дополнительные средства под общим названием «Graphics Tools».
Для создания отладочного слоя нужно при создании устройства Direct3D указать соответствующий флаг:
-
для функций D3D10CreateDevice, D3D10CreateDevice1, D3D10CreateDeviceAndSwapChain и D3D10CreateDeviceAndSwapChain1 — флаг
D3D10_CREATE_DEVICE_DEBUG
; -
для функций D3D11CreateDevice или D3D11CreateDeviceAndSwapChain — флаг
D3D11_CREATE_DEVICE_DEBUG
;
Если ОС располагает DirectX версии 11.1, при создании устройства Direct3D (средствами как Direct3D11, так и Direct3D10) можно указать флаг D3D10_CREATE_DEVICE_DEBUGGABLE
или D3D11_CREATE_DEVICE_DEBUGGABLE
, что заставит драйвер сохранять информацию, полезную для отладки шейдеров.
При создании фабрики DXGI функцией CreateDXGIFactory2 можно указать флаг DXGI_CREATE_FACTORY_DEBUG
, обеспечивающий создание отладочной версии фабрики. Более ранние версии этой функции не позволяют указывать такой флаг. Создание отладочной версии устройства Direct3D вызывает неявное создание отладочной версии фабрики.
Кроме того, имеется возможность включить отладку через панель управления DirectX или средствами Visual Studio, если такая возможность программой не заблокирована.
В выводимых отладочным слоем сообщениях часто указываются проблемные объекты. Чтобы было легче определить, к какому именно объекту относится сообщение, объектам можно присваивать имена. Для этого нужно вызвать через какой-либо интерфейс объекта метод с именем SetPrivateData
(например, IDXGIObject::SetPrivateData, доступный для объектов DXGI) и указать в нём GUID WKPDID_D3DDebugObjectName
(определён в файле D3Dcommon.h
) вместе с желаемым именем и его длиной.