Адаптер - SIISII/DirectX GitHub Wiki

Адаптер — это объект, являющийся абстракцией для средств рендеринга изображения. Помимо встроенных или дискретных графических процессоров, к адаптерам относятся и средства чисто программного рендеринга средствами самого DirectX.

Перечисление адаптеров

[DXGI]] формирует список адаптеров во время создания [фабрики, поэтому при изменении набора адаптеров в системе необходимо пересоздать фабрику. В последних версиях системы можно подписаться на уведомления об изменении состава адаптеров, используя функцию IDXGIFactory7::RegisterAdaptersChangedEvent.

Хронологически первой функцией для перечисления адаптеров в системе является IDXGIFactory::EnumAdapters. Она принимает порядковый номер адаптера и возвращает указатель на интерфейс IDXGIAdapter. Последовательно увеличивая номера до тех пор, пока не будет возвращён код ошибки, можно получить полный перечень адаптеров в системе. Первым из них всегда будет адаптер, к которому подключён основной монитор, затем адаптеры, имеющие видеовыходы, а в конце — адаптеры без видеовыходов (правда, не совсем понятно, имеются ли в виду просто видеовыходы или же выходы, к которым фактически подключены мониторы).

Функция IDXGIFactory1::EnumAdapters1 работает аналогично, но возвращает интерфейс IDXGIAdapter1.

Функция IDXGIFactory6::EnumAdapterByGpuPreference позволяет перечислять адаптеры либо без каких-либо предпочтений (аналогично упомянутым выше функциям), либо в порядке понижения производительности, либо в порядке уменьшения потребления энергии, и возвращает запрошенную версию интерфейса адаптера (соответствующий IID передаётся ей как параметр). Следует учитывать, что порядок сортировки адаптеров не отражает реальную производительность или потребление, а основывается на формальных критериях. Так, дискретный графический процессор всегда считается более производительным, чем встроенный в ЦП, даже если это не соответствует действительности (например, графический процессор nVidia GT218, лежащий в основе видеокарты GeForce GT210 2009-го года, считается более мощным, чем AMD Radeon Vega 8 2018-го года, встраиваемый во многие современные ЦП AMD Ryzen и превосходящий GT218 по производительности примерно в 10 раз).

Функция IDXGIFactory4::EnumAdapterByLuid возвращает запрошенную версию интерфейса адаптера; последний идентифицируется по так называемому LUID. Эта функция нужна для получения адаптера, использованного для создания устройства Direct3D 12, так как последнее (в отличие от устройств Direct3D более ранних версий) не позволяет получить адаптер напрямую, но может предоставить LUID адаптера (функция ID3D12Device::GetAdapterLuid).

Функция IDXGIFactory4::EnumWarpAdapter возвращает запрошенную версию интерфейса для так называемого WARP-адаптера, т. е. программного адаптера, пригодного для рендеринга средствами Direct3D 12. Такой адаптер в системе один, поэтому эта функция перечисление как таковое не производит.

Специальной функции для получения программного адаптера для более ранних версий Direct3D нет. В Windows Vista и 7 такой адаптер, возможно, должен создаваться приложением самостоятельно, поскольку в DXGI 1.0 предусмотрена функция IDXGIFactory::CreateSoftwareAdapter. Кроме того, создать программный адаптер можно одновременно с созданием устройства Direct3D.

Начиная с Windows 8, в системе всегда присутствует программный адаптер с именем «Microsoft Basic Render Driver». Как правило, он считается не имеющим видеовыходов и перечисляется последним, однако в случае, если для аппаратного адаптера отсутствуют драйверы и он управляется базовым драйвером Microsoft, «Microsoft Basic Render Driver» будет перечислен дважды: сначала как аппаратный и имеющий видеовыход, а затем — как программный без видеовыхода. Последний никогда из системы удалён быть не может, в то время как первый существует лишь при отсутствии подходящих драйверов для видеокарты.

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

IDXGIAdapter

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

IDXGIAdapter1

Этот интерфейс доступен, начиная с Windows 7; вероятно, он реализован также и в Windows Vista SP2.

IDXGIAdapter2

Этот интерфейс доступен, начиная с Windows 8; он поддерживается также в Windows 7 с Platform Update.

IDXGIAdapter3

Документация Microsoft не указывает, с какой версии системы доступен этот интерфейс; вероятно, он был введён в Windows 10 (во всяком случае, появление DXGI 1.4, где он описан, связано с поддержкой Direct3D 12).

IDXGIAdapter4

Вероятно, этот интерфейс доступен, начиная с Windows 10 версии 1803 (документация не содержит точной информации на этот счёт, однако данная версия указана для некоторых других интерфейсов, объявленных в файле dxgi1_6.h).

Выходы адаптеров

Как правило, адаптеры (видеокарты) имеют выходы, к которым могут подключаться мониторы. Могут существовать также адаптеры, не имеющие выходов; относящиеся к ним графические процессоры (устройства Direct3D) пригодны для выполнения рендеринга, однако отображение результатов будет осуществляться через другие адаптеры, к которым подключены мониторы.

Для работы с выходами адаптеров их интерфейсы предоставляют следующие методы.

IDXGIOutput

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

IDXGIOutput1

Этот интерфейс доступен, начиная с DirectX 11.1 (появился в Windows 8 и поддерживается в Windows 7 с Platform Update).

IDXGIOutput2

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

IDXGIOutput3

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

IDXGIOutput4

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

IDXGIOutput5

Этот интерфейс доступен, начиная с Windows 10 (скорее всего, начиная с одного из ранних обновлений).

IDXGIOutput6

Этот интерфейс доступен, начиная с Windows 10 (вероятно, с версии 1803).