How do I identify my DirectX 11 or 11.1 system?
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 itD3D_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 withE_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 getD3D_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.
source to share
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.
source to share
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.
source to share