DXGI - SIISII/DirectX GitHub Wiki
DXGI (графическая инфраструктура DirectX) появилась в Windows Vista и предназначена для совместной работы с Direct3D 10 и более поздними версиями. Она отвечает за операции, не связанные напрямую с формированием изображения (рендерингом), но так или иначе относящиеся к выводу изображений на экран. К ним относятся перечисление адаптеров, управление цепочками буферов кадров, переключение в полноэкранный режим и обратно и т. п.
Интерфейсы DXGI версий 1.0 и 1.1 определены в заголовочном файле dxgi.h
, для более поздних версий предусмотрены файлы dxgi1_2.h
— dxgi1_6.h
.
К интерфейсам DXGI нельзя обращаться из функции DllMain
. Это ограничение вызвано тем обстоятельством, что нельзя предсказать порядок загрузки DLL и их инициализации.
Базовый интерфейс объектов DXGI
Почти все интерфейсы DXGI являются наследниками интерфейса IDXGIObject, который, в свою очередь, является наследником IUnknown. Благодаря этому каждый интерфейс DXGI содержит следующие методы:
- из
IUnknown
: - из
IDXGIObject
:
Наиболее значительным исключением из этого правила являются отладочные интерфейсы, порождённые прямо от IUnknown
.
Фабрика DXGI
Фабрика DXGI служит для создания других объектов. Её создание обычно является одной из первых операций, выполняемых приложением, использующим DirectX.
Перечисление адаптеров
Адаптер — это объект, являющийся абстракцией для средств рендеринга изображения. Помимо встроенных или дискретных графических процессоров, к адаптерам относятся и средства чисто программного рендеринга средствами самого DirectX.
Цепочка переключения буферов
Цепочка переключения буферов используется для обеспечения вывода отрендеренного изображения на монитор. Цепочка привязывается и к окну, в которое осуществляется вывод, и к устройству Direct3D, осуществляющему рендеринг. DXGI обеспечивает создание и управление цепочкой буферов.
Устройства DXGI
Устройство DXGI является объектом, формирующим изображения. Фактически это самая низкоуровневая часть устройства Direct3D: последнее является наследником устройства DXGI.
Ресурсы и поверхности
Ресурс (resource) — это, по сути, область памяти, доступная либо для центрального процессора, либо для графического процессора, либо для обоих процессоров вместе, в которой хранится различная информация, используемая в процессе рендеринга. Например, ресурсом является вершинный буфер.
Частным случаем ресурса является поверхность (surface) — область памяти, выделенная для хранения изображения (текстуры). В частности, каждый из буферов в цепочке переключения является отдельной поверхностью.
Данные (в частности, цвета пикселей) хранятся в ресурсах в том или ином формате. Выбор форматов зависит от используемой версии Direct3D и конкретного назначения поверхности.
Помимо распакованных данных, поддерживаются упакованные данные в нескольких форматах.
DXGI и многопоточность
DirectX 11 и особенно DirectX 10 имеют ограниченные возможности по организации многопоточной работы. Фактически накладываемые ограничения сводятся к следующему:
-
если для рендеринга и обработки сообщений Windows используются разные потоки, не должно возникать ситуаций, когда поток обработки сообщений ожидает каких-либо событий, вызываемых потоком рендеринга. Это требование связано, в частности, с тем, что вызов методов вроде IDXGISwapChain1::Present1, производимый потоком рендеринга, может заставить этот поток ожидать завершения обработки сформированных им сообщений Windows;
-
методы интерфейсов DXGI должны вызываться тем же потоком, который осуществляет рендеринг (в случае Direct3D 11 таковым считается поток, работающий с непосредственным контекстом устройства; работа с отложенными контекстами возможна и из других потоков).
При создании устройства Direct3D можно указать флаг D3D10_CREATE_DEVICE_SINGLETHREADED
или D3D11_CREATE_DEVICE_SINGLETHREADED
; в этом случае вызывать функции DirectX можно только из одного потока, но при этом снижаются накладные расходы на вызов, поскольку DirectX API не будет захватывать блокировку, упорядочивающую доступ к его методам.
Флаг D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS
или D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS
запрещает DirectX создавать внутри себя дополнительные потоки, и вся работа осуществляется в потоке, вызывающем методы его интерфейсов. Эта возможность может быть полезна для упрощения отладки, но в обычных случаях не используется.
Отладочные возможности
Direct3D и DXGI предоставляют средства, упрощающие отладку приложений. Они доступны, если в программе используется так называемый слой отладки Direct3D.
Прочее
Для создания цепочек переключения буферов, предназначенных для работы с поверхностями DirectComposition, предназначен интерфейс IDXGIFactoryMedia, появившийся в Windows 8.1. В отличие от большинства других интерфейсов DXGI, он порождён прямо от интерфейса IUnknown
. В нём реализованы два метода:
Ресурсы, совместно используемые несколькими устройствами Direct3D 10 и 11, создаются с использованием флага D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX
или D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
. Для обеспечения монопольного доступа к такому ресурсу необходимо захватывать специальный мьютекс, для работы с которым предназначен интерфейс IDXGIKeyedMutex. Получить этот интерфейс можно с помощью обычного метода QueryInterface
, вызванного для совместно используемого ресурса.