首页 文章

英特尔集成显卡错误识别(DXGI)

提问于
浏览
2

我正在填充一个带有空白交换链的窗口,该链由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 回答

  • 1

    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 ) )if ( ( adapterDesc.VendorId == 0x1414 ) && ( adapterDesc.DeviceId == 0x8c ) ) 排除MBR,但我建议您挖掘代码以了解为什么您错误地为硬件设备返回 DXGI_ADAPTER_FLAG_SOFTWARE .

    Anatomy of Direct3D 11 Create Device

相关问题