Start · Sprachen · JavaScript · Referenz · GPUAdapter.features

GPUAdapter.features

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>GPUSupportedFeatures</code>-Objekt mit den optionalen WebGPU-Funktionen liefert, die der Adapter unterstützt.

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

Signatur

GPUAdapter.features

Beschreibung

Die Eigenschaft features eines GPUAdapter gibt ein GPUSupportedFeatures-Objekt zurück. Es verhält sich wie ein schreibgeschütztes Set und enthält als Zeichenketten die Namen der optionalen Funktionen, die der physische bzw. logische Grafikadapter bereitstellen kann – etwa "texture-compression-bc", "timestamp-query", "shader-f16" oder "depth-clip-control".

Diese Funktionen sind bei einem neu erzeugten GPUDevice nicht automatisch aktiv. Du musst sie beim Aufruf von GPUAdapter.requestDevice() ausdrücklich im Feld requiredFeatures anfordern. adapter.features nutzt du also, bevor du das Gerät anforderst: Du prüfst, was verfügbar ist, und forderst nur das an, was es tatsächlich gibt. Wird eine nicht unterstützte Funktion angefordert, wird das Promise von requestDevice() mit einem TypeError abgelehnt.

Typische Anwendungsfälle sind die Auswahl eines passenden Texturkompressionsformats (BC auf dem Desktop, ETC2/ASTC auf Mobilgeräten), GPU-Zeitmessung mit Timestamp-Queries zum Profiling oder 16-Bit-Gleitkommazahlen in WGSL-Shadern für mehr Leistung.

Rückgabewert

Typ
GPUSupportedFeatures
Beschreibung
Ein Set-ähnliches, schreibgeschütztes Objekt mit Funktionsnamen als Zeichenketten. Unterstützt has(), size, forEach(), keys(), values(), entries() und Iteration mit for...of.

Beispiele

Alle unterstützten Funktionen auflisten

const listAdapterFeatures = async () => {
  if (!navigator.gpu) {
    console.warn('WebGPU wird nicht unterstützt.');
    return;
  }
  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    console.warn('Kein passender GPU-Adapter gefunden.');
    return;
  }
  console.log(`Anzahl Features: ${adapter.features.size}`);
  for (const feature of adapter.features) {
    console.log(feature);
  }
};

listAdapterFeatures();
Anzahl Features: 5 depth-clip-control texture-compression-bc timestamp-query shader-f16 float32-filterable (Die Werte hängen von Hardware und Browser ab.)

Optionale Funktionen gezielt beim Gerät anfordern

const initDevice = async () => {
  const adapter = await navigator.gpu?.requestAdapter();
  if (!adapter) throw new Error('WebGPU nicht verfügbar');

  // Wunschliste – nur Vorhandenes anfordern
  const wanted = ['timestamp-query', 'shader-f16'];
  const requiredFeatures = wanted.filter((f) => adapter.features.has(f));

  const device = await adapter.requestDevice({ requiredFeatures });
  console.log('Aktivierte Features:', [...device.features]);
  return device;
};

initDevice().catch(console.error);
Aktivierte Features: ['timestamp-query', 'shader-f16']

Texturkompressionsformat passend zur Hardware wählen

const pickCompressionFormat = (adapter) => {
  const { features } = adapter;
  if (features.has('texture-compression-bc')) return 'bc7-rgba-unorm';
  if (features.has('texture-compression-astc')) return 'astc-4x4-unorm';
  if (features.has('texture-compression-etc2')) return 'etc2-rgba8unorm';
  return 'rgba8unorm'; // unkomprimierter Rückfall
};

const adapter = await navigator.gpu.requestAdapter();
const format = pickCompressionFormat(adapter);
console.log('Gewähltes Format:', format);
Gewähltes Format: bc7-rgba-unorm

// Wichtig · Fallstricke

  • Adapter-Features ≠ Geräte-Features: adapter.features zeigt nur, was möglich ist. Aktiv sind nur die Funktionen, die über requiredFeatures angefordert wurden – maßgeblich ist danach GPUDevice.features.
  • Wird eine nicht enthaltene Funktion in requiredFeatures angegeben, lehnt requestDevice() mit einem TypeError ab. Immer vorher mit has() filtern.
  • Fordere nur an, was du wirklich brauchst: Jede zusätzliche Funktion kann die Kompatibilität einschränken und erleichtert Fingerprinting. Browser können aus Datenschutzgründen einzelne Funktionen verbergen.
  • Das Objekt ist schreibgeschützt; Methoden wie add() oder delete() gibt es nicht.
  • navigator.gpu.requestAdapter() kann null liefern – vor dem Zugriff auf features prüfen.
  • Kompatibilität: WebGPU ist nur in sicheren Kontexten (HTTPS, localhost) verfügbar; Unterstützung in Firefox und Safari ist neu bzw. plattformabhängig. Vorher per 'gpu' in navigator prüfen. Auch in Web Workern verfügbar.