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

Direct3D и [[DXGI]] предоставляют средства, упрощающие отладку приложений. Они доступны, если в программе используется так называемый слой отладки Direct3D.

Отладочный слой Direct3D

Отладочный слой Direct3D осуществляет дополнительные проверки параметров, следит за возможными утечками памяти, связанными с объектами DirectX, и т. п. Его использование задаётся соответствующим флагом при создании устройства Direct3D или при создании [фабрики DXGI](/SIISII/DirectX/wiki/Фабрика DXGI).

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

Отладка в Direct3D 12

Для обеспечения отладки необходимо установить в системе дополнительные средства под общим названием «Graphics Tools».

Direct3D 12 использует отладочный слой подобно предыдущим версиям API — для дополнительной проверки параметров и состояний объектов. Кроме того, в нём предусмотрена возможность выполнения проверок данных и состояний кода, выполняемого на графическом процессоре (так называемая GPU-based validation, сокращённо GPV).

Чтобы включить GPV, нужно перед созданием устройства воспользоваться методом ID3D12Debug3::SetEnableGPUBasedValidation, который должен быть вызван до создания устройства.

Чтобы включить отладочный слой, перед созданием устройства Direct3D нужно вызвать метод ID3D12Debug::EnableDebugLayer.

Заметим, что в отладочных интерфейсах возникла некоторая путаница: ID3D12Debug1 и ID3D12Debug2, хотя функционально расширяют ID3D12Debug, но порождены не от него, а прямо от IUnknown, чем нарушились принципы расширения интерфейсов. В ID3D12Debug3 этот недостаток устранён: он является прямым потомком ID3D12Debug. Рекомендуется всегда использовать именно его.

Отладочные интерфейсы

Отладочные интерфейсы появились в Windows 8. В отличие от других интерфейсов DXGI и Direct3D, они не наследуют интерфейс IDXGIObject, а восходят прямо к интерфейсу IUnknown.

Методы, предоставляемые отладочными интерфейсами DXGI

Отладочные интерфейсы DXGI объявлены в заголовочном файле dxgidebug.h; получить их можно с помощью функции DXGIGetDebugInterface.

IDXGIDebug

Этот интерфейс доступен, начиная с Windows 8.

IDXGIDebug1

Этот интерфейс доступен, начиная с Windows 8.1.

IDXGIInfoQueue

Этот интерфейс доступен, начиная с Windows 8.

Методы, предоставляемые отладочными интерфейсами для Direct3D 12

Для получения указателей на отладочные интерфейсы Direct3D 12 используется функция D3D12GetDebugInterface, объявленная в файле d3d12.h. Сами отладочные интерфейсы объявлены в файле d3d12sdklayers.h.

ID3D12Debug

ID3D12Debug1

Этот интерфейс не наследует интерфейс ID3D12Debug, а является прямым потомком IUnknown, хотя по своей сути он является расширением ID3D12Debug. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft (об этом говорят также интерфейсы ID3D12Debug2 и ID3D12Debug3).

ID3D12Debug2

Этот интерфейс не наследует интерфейс ID3D12Debug или ID3D12Debug1, а является прямым потомком IUnknown. Он не является самодостаточным и должен использоваться совместно с интерфейсом ID3D12Debug1. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.

ID3D12Debug3

В отличие от двух предыдущих, этот интерфейс является наследником ID3D12Debug. Он вобрал в себя функционал, добавленный в ID3D12Debug1 и ID3D12Debug2. По всей вероятности, его появление стало следствием обнаружения ошибки в правилах развития интерфейсов, допущенной в ID3D12Debug1 и ID3D12Debug2.

ID3D12DebugCommandList

ID3D12DebugCommandList1

Этот интерфейс не наследует интерфейс ID3D12DebugCommandList, а является прямым потомком IUnknown. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.

ID3D12DebugCommandQueue

ID3D12DebugDevice

ID3D12DebugDevice1

Этот интерфейс не наследует интерфейс ID3D12DebugDevice, а является прямым потомком IUnknown. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.

ID3D12InfoQueue

ID3D12SharingContract