Signatur
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
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();
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();
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));
// Wichtig · Fallstricke
- Adapter und Gerät sind nicht dasselbe:
adapter.features.has('x')heißt nicht, dassdevice.features.has('x')gilt. Eine Funktion ist auf dem Gerät nur aktiv, wenn sie inrequiredFeaturesangefordert wurde. - Wird in
requiredFeatureseine Funktion angefordert, die der Adapter nicht unterstützt, wird das Promise vonrequestDevice()mit einemTypeErrorabgelehnt. Deshalb vorher mitadapter.featuresfiltern. - Die Menge ist schreibgeschützt: Es gibt kein
add()und keindelete(). Die Funktionen stehen beim Erzeugen des Geräts fest. - Einige Funktionen muss man zusätzlich im Shader freischalten, zum Beispiel
shader-f16mitenable 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
requiredFeaturesführen zu einem Fehler, deshalb nie ungeprüft anfordern.