Signatur
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
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();
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);
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);
// Wichtig · Fallstricke
- Adapter-Features ≠ Geräte-Features:
adapter.featureszeigt nur, was möglich ist. Aktiv sind nur die Funktionen, die überrequiredFeaturesangefordert wurden – maßgeblich ist danachGPUDevice.features. - Wird eine nicht enthaltene Funktion in
requiredFeaturesangegeben, lehntrequestDevice()mit einemTypeErrorab. Immer vorher mithas()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()oderdelete()gibt es nicht. navigator.gpu.requestAdapter()kannnullliefern – vor dem Zugriff auffeaturesprü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 navigatorprüfen. Auch in Web Workern verfügbar.