# How should I interpret these DirectX Caps Viewer values?

Briefly asking - what do the nodes mean and what the difference is between them in DirectX Caps Viewer?

1. DXGI Devices
2. Direct3D9 Devices
3. DirectDraw Devices

The most interesting for me is 1 vs 2. In the Direct3D9 Devices under HAL node I can see that my GeForce 8800GT supports PixelShaderVersion 3.0. However, under DXGI Devices I have DX 10, DX 10.1 and DX 11 having Shader model 4.0 (actually why DX 11? My card is not compatible with DX 11).

I am implementing a DX 11 application (including d3d11.h) with shaders compiled in 4.0 version, so I can clearly see that 4.0 is supported.

What is the difference between 1 and 2? Could you give me some theory behind the nodes?

There was a huge change in the architecture of DirectX when Vista came out. All versions of Direct3D up to 9 were pretty much all-in APIs. With Direct3D 10, part of the API -mostly all the low level stuff like talking to the hardware- was sent to a different API called DXGI. Direct3D10, 10.1 and 11 are different services that interact with DXGI.

Even though they share the same name, Direct3D 9 and below are completely different APIs to DXGI, and that's why you can have both working side to side on Vista and above (you couldn't have Direct3D8 and 9 installed on the same computer. In fact, Direct3D9 is AFAIK backwards compatible a long way back)

Regarding the caps viewer, "DXGI" makes reference to what your card is available to do when running a DXGI-based program (Direct3D 10 and above), while "Direct3D9" makes reference to what your card is available to do when running a program based on Direct3D 9. That's all there is to it.

You see that PixelShaderVersion is 3 in the Direct3D9 device, because that's the last version supported by Direct3D 9. You cannot use Shader model 4.0 from a Direct3D 9 program, even if the card supports it.

Regarding DXGI support, if your card supports Direct3D9, then it supports DXGI, and therefore Direct3D11. Direct3D11 is not based on "caps" like 9 and before, but on feature levels. The most basic feature level (9_1) is (mostly) equivalent to Direct3D9 support, so any program written with Direct3D11 that targets feature level 9_1 will most likely work on a Direct3D9 capable card, even if it came out before Direct3D11 came out.

Remember that "feature level" is different from the Direct3D version: if the caps viewer says that your card supports up to shader model 4.0, then it probably means that it is unlikely to support feature levels above 10_0, but you can certainly create a Direct3D11 device based on feature level 9_1 if you want.

Supporting feature level 11_0 and above is what manufacturers usually mean with "Direct3D11 support".

Regarding DirectDraw, that's a completely different, and even older (DirectX 7 era) API.

You can read more about DXGI in here, and feature levels in here. The docs are your friends.