我正在用DirectX 12处理的空白交换链填充一个窗口。当我用显式多适配器愚弄一圈的时候,我发现了这个奇怪的行为.
正如目前已经存在的几乎所有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 650 m和Intel HD Graphics 4000。
通过在循环期间中断并检查每个适配器的DXGI_ADAPTER_DESC2结构,我发现我得到的确实是GT 650 m,这意味着我的集成图形正在将自己标识为一个软件适配器。
这本身是有道理的,但如果你看看一个常春藤桥模图 (这就是我所拥有的),你就会看到一个很大的区域被封锁为“处理器图形”,英特尔自己对它的定义如下:“处理器图形指的是物理上在处理器包中或集成到处理器硅中的图形。”只会对我尖叫“硬件适配器”。
如果删除上面的代码块,我确实会在列表中得到两个适配器,但第二个适配器标识为"Microsoft呈现驱动程序“,并给出了0x1414的供应商ID,而谷歌表示英特尔通常返回0x8086作为其ID。这份清单甚至没有提到0x1414的所有者。
而且,让事情更加混乱,如果我检查信息中心在我的英特尔高清图形控制面板,它说它有一个供应商ID的0x8086!
在有人问:是的,我的司机应该是最新的,我一注意到就更新了他们。奇怪的是,DxDiag给了我一个不正确的集成图形的驱动日期,但是对于GT 650米也是如此(虽然稍微接近事实)。离散GPU驱动程序为WDDM 2.0,而集成图形驱动程序为WDDM 1.3,这可能是相关的,因为我认为它也应该是2.0。(更新是否失败?)
发布于 2016-03-14 20:57:36
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)筛选器的主要原因是避免选择Microsoft呈现驱动程序。这使用了不支持WARP11 12的DirectX软件设备。
所有版本的WARP11都支持DirectX 11。WARP12目前是开发人员专用的设备。“图形工具”可选特性按需安装)。
如果您的离散部分返回此标志的true,则可能是一个错误。这可能是代码中的一个bug,驱动程序的错误,或者Optimus样式选择的一些奇怪的副作用。WARP / MBR实际上是唯一期望返回DXGI_ADAPTER_FLAG_SOFTWARE的东西。
您还可以通过对if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )的著名供应商/设备测试排除MBR,但我建议深入了解您的代码,以理解为什么您不正确地将DXGI_ADAPTER_FLAG_SOFTWARE返回给硬件设备。
https://stackoverflow.com/questions/35996360
复制相似问题