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

李亚当

我正在运行Windows7。使用DxDiag时,它将版本显示为11。

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

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

查克·沃尔本

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

  1. DXDIAG与DirectX Runtime一起是OS的一部分,但也已针对该字符串进行了手动更新,因此,对于报告“ DirectX”版本而言,DXDIAG通常不够详尽/不准确。对于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,它在检查内容方面会更加复杂,
  2. 如果D3DCreateDevice即使在Windows 8.x上也将pFeatureLevels传递为NULL,仍然不会获得D3D_FEATURE_LEVEL_11_1这是出于向后兼容的原因,并确保在NULL使您获得9.1-11.0时,行为不会改变。您必须手动在数组中列出11.1值才能获得它-假设system + driver组合实际上支持它。请注意,如果确实在阵列中包含11.1,则E_INVALIDARG在Windows Vista SP2,Windows 7 RTM或Windows 7 SP1(不带KB2670838)上,调用将失败
  3. Windows 7 SP1 + KB2670838提供DirectX 11.1 API,但不支持D3D_FEATURE_LEVEL_11_1或任何新的可选硬件功能,因为它不包括对新的WDDM 1.2驱动程序模型的支持。您必须使用Windows 8或更高版本才能D3D_FEATURE_LEVEL_11_1使用WDDM 1.2驱动程序和适当的硬件。请参阅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功能级别进行假设,而应该安装哪个版本的DirectX,反之亦然。

  • Windows 8 Store应用程序可以假定存在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版本检测的各种细微差别的详细信息,请参见这篇文章

这个职位这个有关DirectX 11.1在Windows 7上的重要事项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章