英特尔集成显卡错误识别 (DXGI)
Intel Integrated Graphics misidentification (DXGI)
我正在用 DirectX 12 处理的空白交换链填充 window。在使用 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" 并提供供应商 ID 0x1414
,而Google表示Intel通常用returns 0x8086
作为其ID。 This list 甚至没有提到 0x1414
的所有者。
而且,让事情变得更加混乱的是,如果我在我的 Intel 高清显卡控制面板中查看信息中心,它会显示其供应商 ID 为 0x8086
!
在任何人问之前:是的,我的驱动程序应该是最新的;我一注意到这一点就更新了它们。奇怪的是,DxDiag 为我提供了错误的集成显卡驱动程序日期,但为 GT 650M 提供了相同的驱动程序日期(虽然稍微接近事实)。独立GPU驱动是WDDM 2.0,而集成显卡驱动是WDDM 1.3,这可能是相关的,因为我认为它也应该是2.0。 (可能是更新失败了?)
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
过滤器的主要原因是为了避免选择 Microsoft Basic Render Driver。这里使用不支持DirectX 12的WARP11软件设备。
WARP11 is supported in all versions of Windows with DirectX 11. WARP12 is currently a developer only device (i.e. "Graphics Tools" optional feature-on-demand is installed).
如果您的分立部分 return 此标志为真,则可能是错误。它可能是您的代码中的错误、驱动程序错误或 Optimus 样式选择的一些奇怪的副作用。 WARP / MBR 确实是唯一被期望 return DXGI_ADAPTER_FLAG_SOFTWARE
.
您也可以通过针对 well-known VendorID/DeviceID 的 if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )
测试排除 MBR,但我建议您深入研究您的代码以了解为什么您错误地获得 DXGI_ADAPTER_FLAG_SOFTWARE
returned硬件设备。
我正在用 DirectX 12 处理的空白交换链填充 window。在使用 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" 并提供供应商 ID 0x1414
,而Google表示Intel通常用returns 0x8086
作为其ID。 This list 甚至没有提到 0x1414
的所有者。
而且,让事情变得更加混乱的是,如果我在我的 Intel 高清显卡控制面板中查看信息中心,它会显示其供应商 ID 为 0x8086
!
在任何人问之前:是的,我的驱动程序应该是最新的;我一注意到这一点就更新了它们。奇怪的是,DxDiag 为我提供了错误的集成显卡驱动程序日期,但为 GT 650M 提供了相同的驱动程序日期(虽然稍微接近事实)。独立GPU驱动是WDDM 2.0,而集成显卡驱动是WDDM 1.3,这可能是相关的,因为我认为它也应该是2.0。 (可能是更新失败了?)
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
过滤器的主要原因是为了避免选择 Microsoft Basic Render Driver。这里使用不支持DirectX 12的WARP11软件设备。
WARP11 is supported in all versions of Windows with DirectX 11. WARP12 is currently a developer only device (i.e. "Graphics Tools" optional feature-on-demand is installed).
如果您的分立部分 return 此标志为真,则可能是错误。它可能是您的代码中的错误、驱动程序错误或 Optimus 样式选择的一些奇怪的副作用。 WARP / MBR 确实是唯一被期望 return DXGI_ADAPTER_FLAG_SOFTWARE
.
您也可以通过针对 well-known VendorID/DeviceID 的 if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) )
测试排除 MBR,但我建议您深入研究您的代码以了解为什么您错误地获得 DXGI_ADAPTER_FLAG_SOFTWARE
returned硬件设备。