我正在填充一个带有空白交换链的窗口,该链由DirectX 12处理 . 在使用Explicit Multi-Adapter愚弄一点时,我遇到了这种奇怪的行为......
如现在几乎所有的DX12演示代码所示,我遍历所有使用 IDXGIFactory4::EnumAdapters1()
获得的DXGI适配器,以便在 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,这意味着我的集成图形将自己标识为软件适配器 .
这本身是合理的,但是如果你看一下picture of an Ivy Bridge die(这就是我所拥有的),你会看到一个大区域被封锁为"Processor Graphics",英特尔自己这样定义:"Processor graphics refer to graphics that are physically in the processor package or integrated into the processor silicon."这只是尖叫"hardware adapter"对我来说 .
如果我删除上面的代码块,我确实在我的列表中获得了两个适配器,但第二个将自己标识为"Microsoft Basic Render Driver"并且提供了 0x1414
的供应商ID,而Google表示英特尔通常返回 0x8086
作为其ID . This list甚至没有提到 0x1414
的所有者 .
并且,为了让事情更加令人困惑,如果我查看我的英特尔高清显卡控制面板中的信息中心,它说它的供应商ID为 0x8086
!
在有人问:是的,我的司机应该是最新的;我一注意到这一点就更新了它们 . 奇怪的是,DxDiag给了我一个不正确的集成显卡驱动程序日期,但是对于GT 650M来说却是一样的(虽然稍微接近真相) . 独立GPU驱动程序是WDDM 2.0,而集成显卡驱动程序是WDDM 1.3,这可能是相关的,因为我认为它也应该是2.0 . (更新可能会失败吗?)
1 回答
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
过滤器的主要原因是避免选择Microsoft Basic Render Driver . 这使用不支持DirectX 12的WARP11软件设备 .如果您的离散部分为此标志返回true,则可能是一个错误 . 它可能是您的代码中的错误,驱动程序错误或Optimus风格选择的一些奇怪的副作用 . WARP / MBR实际上是唯一可以返回
DXGI_ADAPTER_FLAG_SOFTWARE
的东西 .您也可以通过
if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )
的if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )
排除MBR,但我建议您挖掘代码以了解为什么您错误地为硬件设备返回DXGI_ADAPTER_FLAG_SOFTWARE
.见Anatomy of Direct3D 11 Create Device