Неверная идентификация встроенной графики Intel (DXGI)

Я заполняю окно пустой цепочкой подкачки, которая обрабатывается DirectX 12. Немного дурачась с Explicit Multi-Adapter, я столкнулся с этим странным поведением...

Как показано почти во всех существующих демонстрационных кодах DX12, я перебираю все адаптеры DXGI, которые я получаю, используя IDXGIFactory4::EnumAdapters1(), чтобы найти наиболее подходящий (или, в моем случае, каждый) адаптер с D3D_FEATURE_LEVEL_11_0 или выше. И, как показано в демо, я отбрасываю все адаптеры, у которых есть DXGI_ADAPTER_FLAG_SOFTWARE, вот так:

if ((adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) != FALSE) 
    continue; // Check the next adapter.

В моей реализации я выгружаю все совместимые адаптеры в std::vector для последующего использования.

Если я использую точку останова, чтобы проверить, как все выглядит во время выполнения, я замечаю, что мой список адаптеров содержит только один адаптер после выхода из цикла, чего я не ожидал, поскольку у меня есть и NVIDIA GeForce GT 650M, и Intel HD Graphics. 4000.

Прервав цикл и проверив структуру DXGI_ADAPTER_DESC2 для каждого адаптера, я обнаружил, что тот, который я получаю, действительно является GT 650M, а это означает, что моя встроенная графика идентифицирует себя как программный адаптер.

Это правдоподобно само по себе, но если вы посмотрите на На изображении кристалла Ivy Bridge (это то, что есть у меня) вы видите большую область, огороженную как "Графика процессора", которую сами Intel определяют следующим образом: "Графика процессора" относится к графике, которая физически находится в корпусе процессора или интегрирована в кремний процессора». Это просто кричит мне «аппаратный адаптер».

Если я удалю приведенный выше блок кода, я действительно получу два адаптера в своем списке, но второй идентифицирует себя как "базовый драйвер рендеринга Microsoft" и дает идентификатор поставщика 0x1414, в то время как Google говорит, что Intel обычно возвращает 0x8086 в качестве идентификатора. В В этом списке даже не упоминается владелец 0x1414.

И, чтобы сделать вещи еще более запутанными, если я проверю Информационный центр в моей панели управления HD-графикой Intel, он скажет, что у него есть идентификатор поставщика 0x8086!

Прежде чем кто-либо спросит: Да, мои драйверы должны быть обновлены; Я обновил их, как только заметил это. Как ни странно, DxDiag дает мне неверную дату драйвера для встроенной графики, но делает то же самое (хотя и немного ближе к истине) для GT 650M. Драйвер дискретного графического процессора относится к WDDM 2.0, а встроенный графический драйвер — к WDDM 1.3, что может иметь значение, поскольку я думаю, что он тоже должен быть 2.0. (Возможно, обновление не удалось?)


person PeanutsGrowUnderground    schedule 14.03.2016    source источник


Ответы (1)


Основная причина использования фильтра if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) заключается в том, чтобы избежать выбора базового драйвера рендеринга Microsoft. При этом используется программное устройство WARP11, которое не поддерживает DirectX 12.

WARP11 поддерживается во всех версиях Windows с DirectX 11. WARP12 в настоящее время предназначен только для разработчиков (т. е. установлена ​​дополнительная функция по запросу «Графические инструменты»).

Вероятно, это ошибка, если ваша дискретная часть возвращает true для этого флага. Это может быть ошибка в вашем коде, ошибка драйвера или какой-то странный побочный эффект выбора в стиле Optimus. WARP/MBR — это действительно единственное, что, как ожидается, будет возвращать DXGI_ADAPTER_FLAG_SOFTWARE.

Вы также можете исключить MBR с помощью теста if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) ) для известных VendorID/DeviceID, но я предлагаю покопаться в вашем коде, чтобы понять, почему вы неправильно возвращаете DXGI_ADAPTER_FLAG_SOFTWARE для аппаратных устройств.

См. Анатомия Direct3D 11 Create. Устройство

person Chuck Walbourn    schedule 14.03.2016
comment
Спасибо, я посмотрю. Я в значительной степени скопировал демонстрационный код, поэтому я был бы удивлен, если бы он уже пошел не так. - person PeanutsGrowUnderground; 15.03.2016
comment
Возможно, вы захотите взглянуть на версию DirectX 12 DeviceResources. - person Chuck Walbourn; 15.03.2016