Я заполняю окно пустой цепочкой подкачки, которая обрабатывается 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. (Возможно, обновление не удалось?)