DXGI - SIISII/DirectX GitHub Wiki

DXGI (графическая инфраструктура DirectX) появилась в Windows Vista и предназначена для совместной работы с Direct3D 10 и более поздними версиями. Она отвечает за операции, не связанные напрямую с формированием изображения (рендерингом), но так или иначе относящиеся к выводу изображений на экран. К ним относятся перечисление адаптеров, управление цепочками буферов кадров, переключение в полноэкранный режим и обратно и т. п.

Интерфейсы DXGI версий 1.0 и 1.1 определены в заголовочном файле dxgi.h, для более поздних версий предусмотрены файлы dxgi1_2.hdxgi1_6.h.

К интерфейсам DXGI нельзя обращаться из функции DllMain. Это ограничение вызвано тем обстоятельством, что нельзя предсказать порядок загрузки DLL и их инициализации.

Базовый интерфейс объектов DXGI

Почти все интерфейсы DXGI являются наследниками интерфейса IDXGIObject, который, в свою очередь, является наследником IUnknown. Благодаря этому каждый интерфейс DXGI содержит следующие методы:

Наиболее значительным исключением из этого правила являются отладочные интерфейсы, порождённые прямо от 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, вызванного для совместно используемого ресурса.