Start · Sprachen · JavaScript · Referenz · GPUDevice.features

GPUDevice.features

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>GPUSupportedFeatures</code>-Objekt mit den Zusatzfunktionen liefert, die für dieses <code>GPUDevice</code> tatsächlich aktiviert sind.

seit JavaScript WebGPU – Chrome/Edge 113+, Safari 26+, Firefox 141 Kategorie: webapi

Signatur

GPUDevice.features

Beschreibung

Die Eigenschaft GPUDevice.features gibt ein GPUSupportedFeatures-Objekt zurück. Das ist eine mengenartige Struktur (wie ein Set, nur lesbar) mit den Namen der optionalen WebGPU-Funktionen, die auf diesem logischen Gerät aktiviert sind, zum Beispiel "texture-compression-bc", "timestamp-query", "shader-f16" oder "depth-clip-control".

Wichtig ist der Unterschied zu GPUAdapter.features: Der Adapter meldet, was die Hardware bzw. der Treiber kann. Das Gerät enthält dagegen nur die Funktionen, die du beim Aufruf von adapter.requestDevice() über requiredFeatures ausdrücklich angefordert hast. Alles, was nicht angefordert wurde, steht nicht zur Verfügung, selbst wenn der Adapter es unterstützt.

Nutze device.features, um zur Laufzeit zu prüfen, welcher Codepfad erlaubt ist, etwa ob komprimierte BC-Texturen geladen, Zeitstempel-Abfragen für Profiling angelegt oder f16 in WGSL-Shadern verwendet werden dürfen. Das ist besonders hilfreich, wenn das Gerät an anderer Stelle erzeugt wurde, zum Beispiel in einer Bibliothek, und du nur die GPUDevice-Instanz bekommst.

Rückgabewert

Typ
GPUSupportedFeatures
Beschreibung
Ein schreibgeschütztes, mengenartiges Objekt mit den Methoden has(), keys(), values(), entries(), forEach() und der Eigenschaft size. Es enthält die Namen der aktivierten Funktionen als Strings.

Beispiele

Aktivierte Funktionen des Geräts auflisten

const main = async () => {
  if (!navigator.gpu) {
    throw new Error('WebGPU wird nicht unterstützt.');
  }
  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) throw new Error('Kein GPU-Adapter gefunden.');

  const device = await adapter.requestDevice();

  // Ohne requiredFeatures ist die Menge meist leer
  console.log('Anzahl:', device.features.size);
  for (const feature of device.features) {
    console.log(feature);
  }
};

main();
Anzahl: 0

Funktionen gezielt anfordern und danach prüfen

const initGPU = async () => {
  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) throw new Error('Kein GPU-Adapter gefunden.');

  // Nur anfordern, was der Adapter wirklich kann – sonst schlägt requestDevice fehl
  const wanted = ['timestamp-query', 'shader-f16', 'texture-compression-bc'];
  const requiredFeatures = wanted.filter((f) => adapter.features.has(f));

  const device = await adapter.requestDevice({ requiredFeatures });

  console.log('Aktiviert:', [...device.features].join(', '));
  return device;
};

initGPU();
Aktiviert: timestamp-query, shader-f16, texture-compression-bc

Codepfad abhängig von device.features wählen

// device: ein bereits erzeugtes GPUDevice
const chooseTextureFormat = (device) =>
  device.features.has('texture-compression-bc')
    ? 'bc7-rgba-unorm'
    : 'rgba8unorm';

const createProfilerQuerySet = (device) => {
  if (!device.features.has('timestamp-query')) {
    console.warn('Zeitstempel-Abfragen nicht aktiviert – Profiling deaktiviert.');
    return null;
  }
  return device.createQuerySet({ type: 'timestamp', count: 2 });
};

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
console.log(chooseTextureFormat(device));
console.log(createProfilerQuerySet(device));
rgba8unorm Zeitstempel-Abfragen nicht aktiviert – Profiling deaktiviert. null

// Wichtig · Fallstricke

  • Adapter und Gerät sind nicht dasselbe: adapter.features.has('x') heißt nicht, dass device.features.has('x') gilt. Eine Funktion ist auf dem Gerät nur aktiv, wenn sie in requiredFeatures angefordert wurde.
  • Wird in requiredFeatures eine Funktion angefordert, die der Adapter nicht unterstützt, wird das Promise von requestDevice() mit einem TypeError abgelehnt. Deshalb vorher mit adapter.features filtern.
  • Die Menge ist schreibgeschützt: Es gibt kein add() und kein delete(). Die Funktionen stehen beim Erzeugen des Geräts fest.
  • Einige Funktionen muss man zusätzlich im Shader freischalten, zum Beispiel shader-f16 mit enable f16; in WGSL.
  • Zur Kompatibilität: WebGPU ist nur in sicheren Kontexten (HTTPS) verfügbar. Die Unterstützung ist noch nicht überall gleich; in Firefox und Safari ist sie erst seit Kurzem und je nach Plattform vorhanden. Prüfe immer zuerst navigator.gpu. Welche Funktionen verfügbar sind, hängt außerdem stark von Hardware und Treiber ab.
  • Die Liste der Funktionsnamen kann mit neuen Spezifikationsversionen wachsen. Unbekannte Namen in requiredFeatures führen zu einem Fehler, deshalb nie ungeprüft anfordern.