Ошибочная идентификация интегрированной графики 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, так что моя встроенная графика идентифицирует себя как программный адаптер.

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

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

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

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

2

Решение

Основная причина 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 Создать устройство

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector