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

标签 c++ visual-studio graphics directx dxgi

我正在用 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 650M 和 NVIDIA GeForce GT 650M。英特尔高清显卡 4000。

通过在循环期间中断并检查 DXGI_ADAPTER_DESC2查看每个适配器的结构,我发现我得到的确实是GT 650M,所以这意味着我的集成显卡将自己识别为软件适配器。

这本身是合理的,但如果你看一下picture of an Ivy Bridge die (这就是我所拥有的)你会看到一个大区域被隔离为“处理器显卡”,英特尔自己定义如下:“处理器显卡是指物理上位于处理器封装中的显卡或集成到处理器芯片中。” 这只是对我尖叫“硬件适配器”。

如果我删除上述代码块,我的列表中确实会出现两个适配器,但第二个适配器将自身标识为“Microsoft Basic Render Driver”,并提供供应商 ID 0x1414 ,而谷歌表示英特尔通常会返回 0x8086作为其 ID。 This list甚至没有提到 0x1414 的所有者.

而且,更令人困惑的是,如果我检查英特尔高清显卡控制面板中的信息中心,它会显示其供应商 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).

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

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

参见Anatomy of Direct3D 11 Create Device

关于c++ - 英特尔集成显卡错误识别 (DXGI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996360/

相关文章:

c++ - 打开 C++ 崩溃转储不会在调用堆栈中显示正确的行

c++ - MSVC 对 C++20 中闭包类型的默认构造函数的行为有所不同

math - 点到椭圆弧的最短距离算法

c++ - DirectX 11中立方体网格的渲染不正确

c++ - 删除放置或非放置新

c++ - 专门的 shared_ptr 转换 C++0x

c++ - 当提供轴和四元数时,如何使用 GLM 获得角度?

c# - NuGet:无法安装包 VVVV.EmguCV 2.4.2.1

c - 在 C/C++ 中绘制 3D 球体

c++ - sprintf 何时以及为何会失败?