Feature Levels

08.11.2009 13:43

Die Entwicklung von Computerspielen für Personal Computer gestaltet sich schwieriger als die Entwicklung für Konsolen, denn herrkömmliche Computer variieren sehr stark in deren Hard- und Softwareausstattung. Während bei Konsolen die Fähigkeiten der Grafikkarte bekannt sind, muss beim PC immer abgefragt werden, welche Features die Grafikkarte unterstützt. Infolgedessen bedarf es diverser Codepfade, um Effekte abgeschwächt auf älterer Hardware auszuführen oder ganz zu deaktivieren.
Unter DirectX 9 fragen Sie die Fähigkeiten der Grafikkarte über die CAPS (Capabilities) ab. Das DirectX SDK enthält eine vollständige Auflistung aller CAPS. Ausgedruckt bringt es die Liste auf mehrere A4-Blätter. Um jener Komplexität Herr zu werden, führte Microsoft mit DirectX 10.1 die sog. Feature Levels ein. Unter DirectX 11 existieren sechs Feature Levels, die die CAPS gruppieren.
  • Feature Level 11.0
  • Feature Level 10.1
  • Feature Level 10.0
  • Feature Level 9.3
  • Feature Level 9.2
  • Feature Level 9.1

In obiger Auflistung, von oben nach unten gesehen, repräsentiert jedes Feature Level ein Superset der darunterliegenden Ebene. Jetzt stellt sich die Frage, welchen Sinn die Feature Levels haben? Hauptsächlich sollen die Feature Levels die Entwicklung vereinfachen, indem die vielen Permutationen der CAPS in den Griff zu kriegen. Statt unzähliger CAPS gibt es nun eben maximal sechs Feature Levels die die Fähigkeiten der Grafikkarte beschreiben. Darüberhinaus vereinfachen die Feature Levels die Verwendung des API, denn Sie können ebenso ein Direct3D 11 Device auf Basis von Direct3D 9 Hardware erzeugen (gleiches gilt für ein Direct3D 10.1 Device auf Basis von Direct3D Hardware).
Das Feature Level 9.1 umfasst beispielsweise das Shader Model 2.0. Feature Level 9.2 beinhaltet alle Funktionen aus dem Feature Level 9.1. Darüberhinaus unterstützt das Feature Level 9.2 u.a. vier simultane Render Targets. Ab Feature Level 9.3 steht zum Beispiel das Shader Model 3.0 zur Verfügung.
Während bei Direct3D 10.1 beispielsweise für jedes Feature Level versucht werden muss ein Device zu erzeugen, genügt bei Direct3D 11 die Erzeugung des Device. Auf welchem Feature Level das Device basiert, gibt die D3D11CreateDevice()-Funktion zurück.
Folgendes Beispiel demonstriert die Vorgehensweise beim Erzeugen eines Direct3D 10.1 Devices.
const D3D10_FEATURE_LEVEL1 pFeatureLevels[] =
{
  D3D10_FEATURE_LEVEL_10_1,
  D3D10_FEATURE_LEVEL_10_0,
  D3D10_FEATURE_LEVEL_9_3,
  D3D10_FEATURE_LEVEL_9_2,
  D3D10_FEATURE_LEVEL_9_1,
};

const D3D10_DRIVER_TYPE pDriverTypes[] =
{
  D3D10_DRIVER_TYPE_HARDWARE,
  D3D10_DRIVER_TYPE_WARP,
  D3D10_DRIVER_TYPE_REFERENCE,
};

const UINT iDriverCount = sizeof(pDriverTypes) /
  sizeof(pDriverTypes[0]);
const UINT iFeatureCount = sizeof(pFeatureLevels) /
  sizeof(pFeatureLevels[0]);

for(UINT iDriverType = 0; iDriverType < iDriverCount;
  iDriverType++)
  for(UINT iFeatureLevel = 0; iFeatureLevel < iFeatureCount;
    iFeatureLevel++)
    {
      hResult = D3D10CreateDevice1(pAdapter,
        pDriverTypes[iDriverType], NULL,
        D3D10_CREATE_DEVICE_BGRA_SUPPORT,
        pFeatureLevels[iFeatureLevel],
        D3D10_1_SDK_VERSION,
        &_pD3D10Device);

      if(SUCCEEDED(hResult))
        return S_OK;
    }
Unter Direct3D 11 wurde der Vorgang vereinfacht. Hier bedarf es lediglich der Iteration aller Device Types, bis schließlich ein Device erzeugt werden konnte.
const D3D_FEATURE_LEVEL pFeatureLevels[] =
{
  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,
};

const D3D_DRIVER_TYPE pDriverTypes[] =
{
  D3D_DRIVER_TYPE_HARDWARE,
  D3D_DRIVER_TYPE_WARP,
  D3D_DRIVER_TYPE_REFERENCE,
};

const UINT iDriverCount = sizeof(pDriverTypes) /
  sizeof(pDriverTypes[0]);
const UINT iFeatureCount = sizeof(pFeatureLevels) /
  sizeof(pFeatureLevels[0]);

for(UINT iDriverType = 0; iDriverType < iDriverCount;
  iDriverType++)
{
  hResult = D3D11CreateDeviceAndSwapChain(NULL,
    pDriverTypes[iDriverType], NULL,
    D3D11_CREATE_DEVICE_DEBUG |
    D3D11_CREATE_DEVICE_BGRA_SUPPORT,
    pFeatureLevels,
    iFeatureCount,
    D3D11_SDK_VERSION,
    &_GraphicsDeviceManager.SwapChainDesc,
    &_GraphicsDeviceManager.SwapChain,
    &_GraphicsDeviceManager.GraphicsDevice,
    &_GraphicsDeviceManager.FeatureLevel,
    &_GraphicsDeviceManager.DeviceContext);
}
 
© 2009 Jens Konerow