2

我正在用一个由 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。(可能更新失败了?)

4

1 回答 1

2

过滤器的主要原因if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)是避免选择Microsoft Basic Render Driver。这使用了不支持 DirectX 12 的 WARP11 软件设备。

所有带有 DirectX 11 的 Windows 版本都支持 WARP11。WARP12 目前是开发人员专用设备(即安装了“图形工具”可选的按需功能)。

如果您的离散部分为此标志返回 true,则可能是一个错误。它可能是代码中的错误、驱动程序错误或 Optimus 样式选择的一些奇怪的副作用。WARP/MBR 确实是唯一有望返回的东西DXGI_ADAPTER_FLAG_SOFTWARE

您也可以通过if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )测试众所周知的 VendorID/DeviceID来排除 MBR ,但我建议挖掘您的代码以了解为什么错误地DXGI_ADAPTER_FLAG_SOFTWARE返回硬件设备。

请参阅Direct3D 11 创建设备的剖析

于 2016-03-14T20:57:36.727 回答