【问题标题】:How to determine the system DirectX is 11 or 11.1?如何判断系统DirectX是11还是11.1?
【发布时间】:2020-08-26 02:49:04
【问题描述】:

我运行的是 Windows 7。当我使用 DxDiag 时,它显示的版本为 11。

当我使用可以访问 Windows API 的 Visual Studio 2012 时,它可以运行具有 D3D_FEATURE_LEVEL_11_1 功能级别的代码

所以我很困惑,我的 DirectX 版本的确切版本是什么?

【问题讨论】:

    标签: directx directx-11


    【解决方案1】:

    这里有许多令人困惑的因素,所以让我们一次看一个:

    1. DXDIAG 与 DirectX 运行时一起是操作系统的一部分,但也为该字符串手动更新,因此报告“DirectX”版本通常不够详细/准确。对于 Windows Vista SP1,它没有说“DirectX 10.1”,而是说“DirectX 10”。同样,在安装了 Windows 8 和 Windows 7 SP 1 + KB2670838 后,它仍然显示“DirectX 11”而不是“DirectX 11.1”。在 Windows 8.1 上,它仍然显示“DirectX 11”而不是“DirectX 11.2”。简而言之,DXDIAG 不是此类技术细节的最佳选择。您可以尝试在 Windows 8.1 SDK 中使用最新版本的dxcapsviewer,它在检查事物的方式上更加复杂,但仍需要随着时间的推移手动更新,因此它目前对 DX 11.3 或 DX 12 等 Windows 10 功能一无所知.
    2. 如果您将 pFeatureLevels 的 NULL 传递给 D3DCreateDevice,即使在 Windows 8.x 上,您仍然不会得到 D3D_FEATURE_LEVEL_11_1。这是出于向后兼容的原因,并确保在 NULL 为您提供 9.1 - 11.0 时行为不会改变。您必须手动列出数组中的 11.1 值才能得到它——假设系统+驱动程序组合实际上支持它。请注意,如果您确实在数组中包含 11.1,则在没有 KB2670838 的 Windows Vista SP2、Windows 7 RTM 或 Windows 7 SP1 上,调用将失败并显示 E_INVALIDARG
    3. Windows 7 SP1 + KB2670838 提供 DirectX 11.1 API,但不支持 D3D_FEATURE_LEVEL_11_1 或任何新的可选硬件功能,因为它不支持新的 WDDM 1.2 驱动程序模型。您必须使用 Windows 8 或更高版本才能获得带有 WDDM 1.2 驱动程序和适当硬件的D3D_FEATURE_LEVEL_11_1。见Microsoft Docs

    一般来说,为 Windows 桌面应用程序处理所有这些问题的正确方法是:

    D3D_FEATURE_LEVEL lvl[] = {
       D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
       D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
       D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1
    };
    
    DWORD createDeviceFlags = 0;
    #ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
    #endif
    
    ID3D11Device* pDevice = nullptr;
    ID3D11DeviceContext* pContext = nullptr;
    D3D_FEATURE_LEVEL fl;
    HRESULT hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
        createDeviceFlags, lvl, _countof(lvl),
         D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
    if ( hr == E_INVALIDARG )
    {
        hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
             createDeviceFlags, &lvl[1], _countof(lvl)-1,
             D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
    }
    if (FAILED(hr))
       ...
    

    然后检测对 Direct3D 11.1 的支持,看看是否可以获得 Direct3D 11.1 接口:

    ID3D11Device1* pDevice1 = nullptr;
    ID3D11DeviceContext1* pContext1 = nullptr;
    hr = pDevice->QueryInterface( __uuidof( ID3D11Device1 ),
        reinterpret_cast<void**>( &pDevice1 ) );
    if ( SUCCEEDED(hr) )
    {
        // DirectX 11.1 is present, otherwise only DirectX 11.0
        (void)pContext->QueryInterface( __uuidof( ID3D11DeviceContext1 ),
             reinterpret_cast<void**>( &pContext1 ) );
    }
    

    不要根据Direct3D Feature Level 安装的 DirectX 版本做出假设,反之亦然。

    • Windows 8 应用商店应用可以假设存在 DirectX 11.1,但不能假设任何特定的 Direct3D 功能级别(尽管 9.1 是您所见过的最低版本)。
    • Windows 8.1 应用商店应用可以假设 DirectX 11.2 存在,但同样不能假设 Direct3D 功能级别。
    • Windows phone 8.0 应用程序可以假设 DirectX 11.0 存在并且设备仅支持 9.3。
    • Windows phone 8.1 应用程序可以假定 DirectX 11.1 存在并且设备仅支持 9.3。
    • Xbox One 应用可以假定 DirectX 11.1 存在。独家应用程序可以假设 FL 11.1 存在。共享应用必须使用 FL 10.0。

    有关设备创建和 DirectX 11.x 版本检测的各种细微差别的详细信息,请参阅this post

    有关 Windows 7 上 DirectX 11.1 的重要说明,请参阅 this postthis one

    【讨论】:

      【解决方案2】:

      DirectX 功能级别

      https://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx

      功能级别是一组明确定义的 GPU 功能。

      您的 DirectX 版本是 11,但根据您的硬件 (GPU),您可能会获得功能级别 11_1。如果你在街上的朋友有 Windows 8.1 和支持的显卡,他们可能有 11.2 的功能。

      尽管听起来,您至少可以使用一些 11.1 功能。

      【讨论】:

      • 顺便说一句,没有D3D_FEATURE_LEVEL_11_2。借助 Windows 8.1、WDDM 1.3 驱动程序和 Direct3D 11.2 API,FL 11.0 和 FL 11.1 显卡可以提供一些额外的硬件功能。见MSDN
      【解决方案3】:

      如前所述:运行 dxdiag -> 转到显示 -> 检查驱动程序型号。如果您有 WDDM 1.3,则系统中安装了 DirectX 11.2;如果您有 WDDM 1.2,则安装了 DirectX 11.1。

      【讨论】:

        【解决方案4】:

        https://walbourn.github.io/directx-11-1-and-windows-7-update/ (http://blogs.msdn.com/b/chuckw/archive/2013/02/26/directx-11-1-and-windows-7-update.aspx)

        DXDIAG:即使将 KB 2670838 应用于 Windows 7 SP1,DXDIAG 仍会将其报告为“DirectX 11”。

        如果有疑问,我建议依赖从 CreateDevice (et al) 返回的功能级别是正确的。

        【讨论】:

        • 谢谢。我已经更新了我对搬迁博客的回答中的链接。
        猜你喜欢
        • 2016-05-10
        • 2011-02-13
        • 2010-11-03
        • 2014-10-05
        • 2013-05-12
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多