Отладочные средства - SIISII/DirectX GitHub Wiki
Direct3D и DXGI предоставляют средства, упрощающие отладку приложений. Они доступны, если в программе используется так называемый слой отладки Direct3D.
Отладочный слой Direct3D осуществляет дополнительные проверки параметров, следит за возможными утечками памяти, связанными с объектами DirectX, и т. п. Его использование задаётся соответствующим флагом при создании устройства Direct3D или при создании фабрики DXGI.
Для идентификации объектов DirectX могут использоваться имена, задаваемые пользователем (по умолчанию для всех объектов устанавливается имя «»). Чтобы присвоить некоторому объекту имя, следует вызвать через какой-либо интерфейс объекта метод IDXGIObject::SetPrivateData и указать в нём GUID WKPDID_D3DDebugObjectName
(определён в файле D3Dcommon.h
) вместе с желаемым именем.
Для обеспечения отладки необходимо установить в системе дополнительные средства под общим названием «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 объявлены в заголовочном файле dxgidebug.h
; получить их можно с помощью функции DXGIGetDebugInterface.
Этот интерфейс доступен, начиная с Windows 8.
Этот интерфейс доступен, начиная с Windows 8.1.
Этот интерфейс доступен, начиная с Windows 8.
- AddApplicationMessage
- AddMessage
- AddRetrievalFilterEntries
- AddStorageFilterEntries
- ClearRetrievalFilter
- ClearStorageFilter
- ClearStoredMessages
- GetBreakOnCategory
- GetBreakOnID
- GetBreakOnSeverity
- GetMessage
- GetMessageCountLimit
- GetMuteDebugOutput
- GetNumMessagesAllowedByStorageFilter
- GetNumMessagesDeniedByStorageFilter
- GetNumMessagesDiscardedByMessageCountLimit
- GetNumStoredMessages
- GetNumStoredMessagesAllowedByRetrievalFilters
- GetRetrievalFilter
- GetRetrievalFilterStackSize
- GetStorageFilter
- GetStorageFilterStackSize
- PopRetrievalFilter
- PopStorageFilter
- PushCopyOfRetrievalFilter
- PushCopyOfStorageFilter
- PushDenyAllRetrievalFilter
- PushDenyAllStorageFilter
- PushEmptyRetrievalFilter
- PushEmptyStorageFilter
- PushRetrievalFilter
- PushStorageFilter
- SetBreakOnCategory
- SetBreakOnID
- SetBreakOnSeverity
- SetMessageCountLimit
- SetMuteDebugOutput
Для получения указателей на отладочные интерфейсы Direct3D 12 используется функция D3D12GetDebugInterface, объявленная в файле d3d12.h
. Сами отладочные интерфейсы объявлены в файле d3d12sdklayers.h
.
Этот интерфейс не наследует интерфейс ID3D12Debug
, а является прямым потомком IUnknown
, хотя по своей сути он является расширением ID3D12Debug
. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft (об этом говорят также интерфейсы ID3D12Debug2
и ID3D12Debug3
).
Этот интерфейс не наследует интерфейс ID3D12Debug
или ID3D12Debug1
, а является прямым потомком IUnknown
. Он не является самодостаточным и должен использоваться совместно с интерфейсом ID3D12Debug1
. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.
В отличие от двух предыдущих, этот интерфейс является наследником ID3D12Debug
. Он вобрал в себя функционал, добавленный в ID3D12Debug1
и ID3D12Debug2
. По всей вероятности, его появление стало следствием обнаружения ошибки в правилах развития интерфейсов, допущенной в ID3D12Debug1
и ID3D12Debug2
.
Этот интерфейс не наследует интерфейс ID3D12DebugCommandList
, а является прямым потомком IUnknown
. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.
Этот интерфейс не наследует интерфейс ID3D12DebugDevice
, а является прямым потомком IUnknown
. Вероятно, такой отход от общих принципов расширения интерфейсов является следствием ошибки в управлении проектами внутри Microsoft.
- AddApplicationMessage
- AddMessage
- AddRetrievalFilterEntries
- AddStorageFilterEntries
- ClearRetrievalFilter
- ClearStorageFilter
- ClearStoredMessages
- GetBreakOnCategory
- GetBreakOnID
- GetBreakOnSeverity
- GetMessage
- GetMessageCountLimit
- GetMuteDebugOutput
- GetNumMessagesAllowedByStorageFilter
- GetNumMessagesDeniedByStorageFilter
- GetNumMessagesDiscardedByMessageCountLimit
- GetNumStoredMessages
- GetNumStoredMessagesAllowedByRetrievalFilter
- GetRetrievalFilter
- GetRetrievalFilterStackSize
- GetStorageFilter
- GetStorageFilterStackSize
- PopRetrievalFilter
- PopStorageFilter
- PushCopyOfRetrievalFilter
- PushCopyOfStorageFilter
- PushEmptyRetrievalFilter
- PushEmptyStorageFilter
- PushRetrievalFilter
- PushStorageFilter
- SetBreakOnCategory
- SetBreakOnID
- SetBreakOnSeverity
- SetMessageCountLimit
- SetMuteDebugOutput