Ошибочная идентификация интегрированной графики 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 (что у меня есть), вы увидите большую область, оцепленную как "Processor Graphics", которую сами Intel определяют так: "Графические изображения процессора к графике, которая физически находится в корпусе процессора или интегрирована в процессор ". Это просто кричит "аппаратный адаптер" на меня.

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

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

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

1 ответ

Решение

Основная причина if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) Фильтр, чтобы избежать выбора Microsoft Basic Render Driver. При этом используется программное обеспечение 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 Создание устройства

Другие вопросы по тегам