How do I identify my DirectX 11 or 11.1 system?

I am running Windows 7. When I use DxDiag it shows the version as 11.

When I use Visual Studio 2012, which can access the Windows API, it can run the code with the D3D_FEATURE_LEVEL_11_1 function level

So I'm confused which version of my DirectX version exactly?

+3


source to share


3 answers


There are a number of confusing factors here, so let's take them one at a time:

  • DXDIAG is included with the OS along with the DirectX Runtime, but is also manually updated for this line, so there is often less than a detailed / accurate DirectX version report. For Windows Vista SP1, it doesn't say "DirectX 10.1" and says "DirectX 10". Likewise, in both Windows 8 and Windows 7 SP 1 + KB2670838 , it still says "DirectX 11" and not "DirectX 11.1". In Windows 8.1 it still says "DirectX 11" and not "DirectX 11.2". In short, DXDIAG is not the best option for technical details like this. You can try using the latest dxcapsviewer in the Windows 8.1 SDK, which is a little trickier in how it checks things out, but still needs a manual update over time, so it currently doesn't say anything about Windows 10 features like DX 11.3 or DX 12.
  • If you pass NULL for pFeatureLevels to D3DCreateDevice

    even on Windows 8.x, you still don't get it D3D_FEATURE_LEVEL_11_1

    . This goes for the backcompat reasons and ensures that the behavior doesn't change when NULL gets you 9.1 - 11.0. You have to manually enumerate 11.1 in the array to get it - assuming the system + driver command actually supports it. Please note that if you include 11.1 in the array, the call will end with E_INVALIDARG

    on Windows Vista Service Pack 2 (SP2), Windows 7 RTM, or Windows 7 Service Pack 1 (SP1) without KB2670838.
  • Windows 7 SP1 + KB2670838 provides the DirectX 11.1 API, but does not support D3D_FEATURE_LEVEL_11_1

    or any new additional hardware features as it does not support the new WDDM 1.2 driver model. You must be using Windows 8 or newer to get D3D_FEATURE_LEVEL_11_1

    with the WDDM 1.2 driver and related hardware. See MSDN

In general, the correct way to handle all of this for Windows desktop apps is:

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))
   ...

      

Then, to discover Direct3D 11.1 support, you'll see if you can get Direct3D 11.1 interfaces:



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 ) );
}

      

Don't make assumptions based on the level of Direct3D capabilities which version of DirectX is installed, or vice versa.

  • Windows 8 Store apps may assume DirectX 11.1 is present, but may not accept any particular level of Direct3D capability (although 9.1 is the minimum you'll ever see).
  • Windows 8.1 Store apps may assume DirectX 11.2 is present, but again cannot accept anything about the Direct3D feature level.
  • Windows Phone 8.0 apps may assume DirectX 11.0 is present and devices only support 9.3.
  • Windows Phone 8.1 apps may assume DirectX 11.1 is present and devices only support 9.3.
  • Xbox One application can have DirectX 11.1. Exclusive apps can receive FL 11.1. Common applications must use FL 10.0.

For more information on the various nuances of device creation and DirectX 11.x version detection, see this post .

See this post and this one for important notes about DirectX 11.1 on Windows 7.

+7


source


DirectX Feature Levels

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

Feature level is a well-defined set of GPU features.



Your DirectX version is 11, but depending on your hardware (GPU) you might get level 11_1. If your friend on the street has Windows 8.1 and a supporting graphics card, they might have 11.2 features.

Although from what it sounds, you have at least 11.1 features available to you.

0


source


http://blogs.msdn.com/b/chuckw/archive/2013/02/26/directx-11-1-and-windows-7-update.aspx

DXDIAG: Even after applying KB 2670838 to Windows 7 SP1, DXDIAG will still report it as "DirectX 11".

When in doubt, I would rather rely on the functionality level returned from CreateDevice (et al.) To be correct.

0


source







All Articles