Games for Windows and the DirectX SDK blog

Technical tips, tricks, and news about game development for Microsoft platforms including desktop, Xbox, and UWP

Project maintained by walbourn Hosted on GitHub Pages — Theme by mattgraham
Home | Posts by Tag | Posts by Month

Direct3D Feature Levels

direct3d, winphone, xbox

Originally posted to Chuck Walbourn's Blog on MSDN,

In various forums and discussion threads of late, I’ve seen some confusion about the difference between “DirectX 11” the API and “DirectX 11” the class of video hardware. The key to this is the concept of a “Feature Level” for devices which simplifies the old Direct3D 9 “sea of capabilities bits” to an increasingly capable group of level-sets for video hardware. An application requests a particular feature level (or a set of feature levels where the application can optionally use more advanced features if present), and the majority of the capabilities are known already. There are some specific optional features and format usages that may or may not be present (and thus require the use of CheckFormatSupport or CheckFeatureSupport), but most things can just be assumed based on the current device’s Feature Level. This makes writing games and applications much simpler, and more importantly if something works for Feature Level X, then you can assume it will work for Feature Level X+1. This simplifies fallbacks as well, where the application only has to handle a few discrete cases. The HLSL shader profiles are designed so that a shader compiled for 4_0_level_9_1 will work on all feature levels, and a shader compiled for 4_0 will work on Feature Level 10.0, 10.1, 11.0, or 11.1 devices to limit the combinatorial explosion problem of shader permutations.

The concept of Feature Levels was actually introduced back in Direct3D 10.1, but at the time there were only two of them: 10.0 and 10.1. With DirectX 11, we introduced both an 11.0 feature level and the “10level9” technology for running on many Direct3D 9 era Shader Model 2.0 and 3.0 parts via the 9.1, 9.2, and 9.3 feature levels. DirectX 11.1 supports the same set of feature levels, and adds a new 11.1 feature level. The concept of feature levels was one of my key talking points for my Gamefest 2010 / GDC 2010 presentation DirectX 11 Technology Update. I’ve also filed a lot of documentation bugs to get this topic well-covered on Microsoft Docs.

This is an important topic for Windows Store apps (a.k.a. Metro style apps) as “DirectX 11” the API is required for these applications, but you will see potentially a wide range of feature levels on machines running Windows 8. See the GDC 2012 presentation Developing Metro Style Games on the Full Range of Windows 8 Devices. With the guidelines presented in the Windows 8 Hardware Certification Requirements document, most new desktop systems sold with Windows 8 will have Feature Level 10.0 or greater hardware–actually most gaming systems are likely to have Feature Level 11.0 or 11.1 even newer laptops with integrated graphics. For tablet form-factor systems, particularly those running Windows RT, most will be Feature Level 9.1 or Feature Level 9.3 at least in the near-term. To support any system running Windows 8 including upgraded machines, you have to support Feature Level 9.1 which may be sufficient for some kinds of applications but not others.

In my Gamefest 2010 talk I tried to make this a bit more concrete with a table. Here is the table updated with some new information. Note that the listed video cards are examples and not an exhaustive list of video cards that support that feature level.

D3D_FEATURE_LEVEL_9_1 (e.g. Intel G965 Express Chipset; Surface RT; Surface 2)

Implies a WDDM 1.0 or later driver

Direct3D 9 hardware: must support Shader Model 2.0 (vs_2_0/ps_2_0), 2K textures, volume textures, event queries, BC1-3 (aka DXTn), and a few other specific capabilities.
D3D_FEATURE_LEVEL_9_2 (e.g. ATI Radeon 9500) Direct3D 9 hardware: must support Shader Model 2.0 (vs_2_0/ps_2_0), occlusion queries, floating-point formats (no blending), extended caps, all 9_1 features.
D3D_FEATURE_LEVEL_9_3 (e.g. nVidia GeForce 6600; ATI Radeon X1300)

Direct3D 9 hardware: must support Shader Model 2.0 (vs_2_0/ps_2_x) with instancing and additional shader caps, 4K textures, multiple render targets (4 MRTs), floating-point blending (limited), all 9_2 features.

Windows phone 8.x developers have access to this feature level.

D3D_FEATURE_LEVEL_10_0 (e.g. ATI Radeon HD 2000; nVidia GeForce 8/9; Intel G965M Express Chipset, HD Graphics "Arrandale/Clarkdale")

Direct3D 10 hardware: Shader Model 4.0, geometry shader, stream out, alpha-to-coverage, 8K textures, MSAA textures, 2-sided stencil, general render target views, texture arrays, BC4/BC5, optional DirectCompute (CS 4.0), full floating-point format support, all 9_3 features.

Xbox One ADK / UWP developers have access to this feature level.

D3D_FEATURE_LEVEL_10_1 (e.g. ATI Radeon HD 3000/4000; nVidia GeForce GTX 300; Intel HD Graphics 3000/2000 "Sandy Bridge") Direct3D 10.1 hardware: Shader Model 4.1, cubemap arrays, extended MSAA, optional DirectCompute (CS 4.1), all 10_0 features.

D3D_FEATURE_LEVEL_11_0 (e.g. ATI Radeon HD 5000-7000; nVidia Geforce GTX 400-700; Intel HD Graphics 4000/2500 "Ivy Bridge"; Surface Pro)

Implies a WDDM 1.1 or later driver

Direct3D 11 hardware: Shader Model 5.0, hull & domain shaders, mandatory DirectCompute (CS 5.0), 16K textures, BC6H/BC7, all 10_1 features.

D3D_FEATURE_LEVEL_11_1 (e.g. AMD Radeon HD 8000; nVidia GeForce GTX 900; Intel HD Graphics 5000/4x00 "Haswell"; Intel "Broadwell"; Surface 3, Surface Pro 2, Surface Pro 3, Xbox One, HoloLens)

Implies a WDDM 1.2 or later driver

Direct3D 11.1 hardware: Shader Model 5.0 with optional extensions, Logical blend operations, Target-independent rasterization, UAVs at every stage, Constant buffer offsetting and partial updates, UAV only rendering with force sample count, all 11_0 features.

Note: This feature level is only available on Windows 8.x / Windows Server 2012 or later. DirectX 11.1 on Windows 7 does not support this feature level.

Xbox One XDK developers have access to this feature level plus additional platform-specific APIs.

D3D_FEATURE_LEVEL_12_0 (e.g. AMD Radeon 400/500 Series, nVidia GeForce 700/800 Series, Intel "Skylake-S")</code>

D3D_FEATURE_LEVEL_12_1 (e.g. AMD Radeon RX 5000 Series, nVidia GeForce 10/20 Series, Intel Xe-LP, Surface X Pro)

Implies a WDDM 2.0 or later driver

See Advanced DirectX12 Graphics and Performance (GDC 2015).

D3D_FEATURE_LEVEL_12_2 (e.g. AMD Radeon RX 6000 Series, nVidia GeForce RTX 30 Series, Intel Xe-HPG, Xbox Series X/S)

See this blog post about this new DirectX12 only feature level. Technical details are here.

See Microsoft Docs: Direct3D feature levels for DX11 / DX12, and the various Hardware Support for Direct3D9 X Formats pages in the DXGI documentation.

By default, if you call D3D11CreateDevice or D3D11CreateDeviceAndSwapChain with the pFeatureLevels parameter set to NULL (or better yet nullptr for VS 2010 and VS 2012 developers!), then the system will try to create a device using the highest feature level available. Note for compatibility reasons, this does not include Feature Level 11.1 on machines with the DirectX 11.1 runtime installed. If you try to use D3D_FEATURE_LEVEL_11_1 on a system with only the DirectX 11.0 runtime installed, it fails immediately. The solution is covered in Anatomy of Direct3D 11 Create Device–the retry isn’t needed for Windows Store apps where you can assume DirectX 11.1 runtime is always available.

WARP supports Feature Level 9.1, 9.2, 9.3, 10, and 10.1 on systems with the DirectX 11.0 runtime. On a system with the DirectX 11.1 runtime, it supports 11.0 and 11.1 as well. Note that on Windows 7 SP1 with DirectX 11.1, WARP supports 11.0, but not 11.1.

A few quirks of this system you should be aware of:

  • For technical reasons, you should prefer using Feature Level 10.0 or later when working with DirectX 10 class or later hardware. They typically support Feature Levels 9.1 - 9.3 as well, but it is more efficient to avoid using the "10level9" layer that emulates some aspects of Direct3D 10+ for Direct3D 9 devices.
  • Most hardware that supports a given feature level supports all the feature levels below it, but that is not actually required behavior. There are a few older integrated graphics parts that only support Feature Level 9.1 and Feature Level 10.0, but not 9.2 or 9.3. This also means that while most 10.x or 11.x class cards will also have support for Feature Level 9.1, 9.2, and 9.3 through the Direct3D 9 "10level9" layer, they aren't required to.
  • While compiling an HLSL shader using one of the 4_0_level_9_? profiles, the shader is actually compiled twice. Once using a Shader Model 2.0 profile and again using the Shader Model 4.0 profile. This generally means you have to live with the limitations of the Shader Model 2.0 profile for these shaders. Note that these shaders are not actually written as legacy Shader Model 2.0 shaders and instead should use the modern HLSL syntax, but the limits on complexity and features from the older Shader Model 2.0 profiles will apply.
  • You will note there is no feature level which exposes Shader Model 3.0 profiles. Feature Level 9.3 does imply the hardware is actually a Shader Model 3.0 compliant device since it requires instancing. The ps_2_x profile with additional shader capabilities is supported but not the full Shader Model 3.0 profiles. This design was driven by the fact that not all Shader Model 3.0 cards really had the same feature set (notably ATI cards were "Shader Model 3.0" but didn't support vertex shader texture fetch, while other vendors did), and the rule that Shader Model 3.0 vertex and pixel shaders can't be mixed with 2.0 shaders which would have broken the general model for always being able to use a 'lower' profile shader on a 'higher' feature level. You have to use Feature Level 10.0 or later to get vertex shader texture fetch support.
  • There is no way for a given device to expose more features than those defined for a given feature level, with the exception of the few specific optional features defined for that level. For example, Feature Level 9.3 devices can optionally support texture filtering for R16G16B16A16_FLOAT formats, but cannot do so for other ``_FLOAT`` formats that are only supported for point sampling in the Feature Level 9.3 definition. You have to use Feature Level 10.0 or later to get full-featured floating-point resource support.
  • The one exception to the previous note is that maximum supported resource sizes (i.e. maximum texture width, height, or depth) is a minimum for a given feature level, but a device could support larger sizes which you can determine by trying to create a larger sized texture and it will return a failure.

XNA 4 Note: None of these feature levels directly maps to the XNA “Reach” or “HiDef” profiles. “Reach” is very similar to Feature Level 9.1, and “HiDef” is designed for the Shader Model 3.0 capabilities of the Xbox 360 so it’s a bit more than Feature Level 9.3 offers but not as much as Feature Level 10.0.

Note: “10level9” feature levels require WDDM drivers and do not support legacy XPDM drivers–XPDM drivers are not supported at all on Windows 8.

Windows Phone 8: Windows phone 8 devices are Feature Level 9.3.

Detecting Feature Levels: Generally speaking, you determine if a device supports a given feature level by trying to create the device. There isn’t an API that lets you enumerate feature level support from devices in DirectX 11. See Anatomy of Direct3D 11 Create Device.

DirectX 12: To date, all Direct3D 12 supporting drivers are Feature Level 11.0 or later. For this reason, all Direct3D 12 samples use D3D_FEATURE_LEVEL_11_0 as the MinimumFeatureLevel. If support for 9.x, 10.0, or 10.1 Direct3D feature level hardware is required, applications needs to make use of Direct3D 11. In DirectX 12, you create a device with a ‘minimum’ feature level, and then use CheckFeatureSupport to determine if the device supports any higher feature levels. See Anatomy of Direct3D 12 Create Device. For DirectX 12 Hardware Feature Levels, see Microsoft Docs.

Related: Getting Started with Direct3D 11, Getting Started with Direct3D 12