如何确定系统DirectX是11还是11.1?

时间:2015-04-23 14:11:27

标签: directx directx-11

我正在运行Windows 7.当我使用DxDiag时,它将版本显示为11。

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

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

4 个答案:

答案 0 :(得分:7)

这里有许多令人困惑的因素在起作用,所以让我们一次拿一个:

  1. DXDIAG是操作系统的一部分以及DirectX Runtime,但也会针对该字符串进行手动更新,因此通常不会详细/准确地报告" 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这样的Windows 10功能或DX 12。
  2. 即使在Windows 8.x上,如果将pFeatureLevels的NULL传递给D3DCreateDevice,您仍然无法获得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。请参阅MSDN
  4. 通常,为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

答案 1 :(得分:0)

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个功能。

答案 2 :(得分:0)

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(等人)返回的功能级别是正确的。

答案 3 :(得分:0)

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