我正在用一个由 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.
在我的实现中,我将所有兼容的适配器转储到 astd::vector
中以供以后使用。
如果我使用断点检查运行时的一切情况,我注意到我的适配器列表在循环退出后仅包含一个适配器,这不是我所期望的,因为我同时拥有 NVIDIA GeForce GT 650M 和英特尔高清显卡4000。
通过在循环中中断并检查DXGI_ADAPTER_DESC2
每个适配器的结构,我发现我得到的确实是 GT 650M,这意味着我的集成显卡将自己标识为软件适配器。
这本身是合理的,但是如果您查看Ivy Bridge 芯片的图片(这就是我所拥有的),您会看到一个很大的区域被封锁为“处理器图形”,英特尔自己定义如下:“处理器图形参考到物理上位于处理器封装中或集成到处理器芯片中的图形。” 这只是对我尖叫“硬件适配器”。
如果我删除上面的代码块,我确实在我的列表中得到了两个适配器,但第二个将自己标识为“Microsoft Basic Render Driver”并提供供应商 ID 0x1414
,而 Google 表示英特尔通常返回0x8086
它的 ID。这份名单甚至没有提到0x1414
.
而且,更令人困惑的是,如果我在英特尔核芯显卡控制面板中查看信息中心,它会显示供应商 ID 为0x8086
!
在有人问之前:是的,我的驱动程序应该是最新的;我一注意到这一点就更新了它们。奇怪的是,DxDiag 给了我一个不正确的集成显卡驱动程序日期,但对 GT 650M 也是如此(虽然稍微接近事实)。独立 GPU 驱动程序是 WDDM 2.0,而集成显卡驱动程序是 WDDM 1.3,这可能是相关的,因为我认为它也应该是 2.0。(可能更新失败了?)