Signatur
Beschreibung
navigator.gpu.wgslLanguageFeatures gibt ein WGSLLanguageFeatures-Objekt zurück. Es verhält sich wie ein schreibgeschütztes Set aus Strings. Jeder Eintrag steht für eine WGSL-Spracherweiterung, die der Shader-Compiler des Browsers versteht, z. B. readonly_and_readwrite_storage_textures, packed_4x8_integer_dot_product, unrestricted_pointer_parameters oder pointer_composite_access.
Anders als GPUAdapter.features oder GPUDevice.features hängen diese Erweiterungen nicht von der Hardware ab, sondern nur davon, wie weit die WGSL-Implementierung des Browsers ist. Deshalb liegt die Eigenschaft direkt am globalen GPU-Objekt. Sie ist abrufbar, ohne dass vorher ein Adapter oder Gerät angefordert wurde, und sie muss nicht über requiredFeatures aktiviert werden.
Die Eigenschaft ist nützlich, wenn man verschiedene Varianten eines Shaders ausliefert. Unterstützt der Browser eine Erweiterung, nutzt man die modernere Syntax. Andernfalls greift man auf kompatiblen WGSL-Code zurück. Im Shader selbst kann man die Erweiterung zusätzlich mit der Direktive requires verlangen, etwa requires readonly_and_readwrite_storage_textures;.
Rückgabewert
Set<string> verhält. Es bietet has(), size, keys(), values(), entries() und forEach() und lässt sich mit for...of durchlaufen. Die Einträge sind die Namen der unterstützten WGSL-Spracherweiterungen.Beispiele
Alle unterstützten WGSL-Erweiterungen auflisten
if (!navigator.gpu) {
console.log('WebGPU wird nicht unterstützt');
} else {
const features = navigator.gpu.wgslLanguageFeatures;
console.log(`Anzahl: ${features.size}`);
for (const name of features) {
console.log(`- ${name}`);
}
}
Shader-Variante abhängig von einer Erweiterung wählen
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const hasRW = navigator.gpu.wgslLanguageFeatures
.has('readonly_and_readwrite_storage_textures');
const code = hasRW
? `requires readonly_and_readwrite_storage_textures;
@group(0) @binding(0) var tex: texture_storage_2d<r32float, read_write>;
@compute @workgroup_size(8, 8)
fn main(@builtin(global_invocation_id) id: vec3u) {
let v = textureLoad(tex, id.xy);
textureStore(tex, id.xy, v * 2.0);
}`
: `@group(0) @binding(0) var src: texture_2d<f32>;
@group(0) @binding(1) var dst: texture_storage_2d<r32float, write>;
@compute @workgroup_size(8, 8)
fn main(@builtin(global_invocation_id) id: vec3u) {
let v = textureLoad(src, id.xy, 0);
textureStore(dst, id.xy, v * 2.0);
}`;
const module = device.createShaderModule({ code });
console.log(hasRW ? 'Read-Write-Variante' : 'Fallback mit zwei Texturen');
Erweiterungsliste als Array für Telemetrie
const getWgslFeatures = () =>
navigator.gpu ? [...navigator.gpu.wgslLanguageFeatures].sort() : [];
console.log(JSON.stringify({ wgsl: getWgslFeatures() }));
// Wichtig · Fallstricke
- Nur in sicheren Kontexten:
navigator.gpugibt es nur über HTTPS oderlocalhost. Prüfen Sie deshalb immer zuerst, obnavigator.gpuexistiert. - Browser-Kompatibilität: Chromium-Browser unterstützen die Eigenschaft ab Version 113 (einige Versionen hatten sie hinter einem Flag). Safari und Firefox haben WebGPU erst vor Kurzem freigegeben. Dort kann die Eigenschaft fehlen oder eine kleinere Liste liefern. Mit optionaler Verkettung bleibt der Code robust:
navigator.gpu?.wgslLanguageFeatures?.has(...). - Nicht verwechseln mit
GPUAdapter.featuresundGPUDevice.features. Diese melden hardwareabhängige Funktionen wieshader-f16und müssen beim Anfordern des Geräts aktiviert werden. WGSL-Spracherweiterungen sind immer aktiv, wenn sie gemeldet werden. - Nur lesbar: Das Objekt hat kein
add(),delete()oderclear(). Es lässt sich also nicht verändern. - Nutzt ein Shader eine nicht unterstützte Erweiterung in einer
requires-Direktive, schlägt die Kompilierung fehl. Die Fehlermeldung erhält man überGPUShaderModule.getCompilationInfo(). - Die Liste kann mit neuen Browserversionen wachsen. Fragen Sie deshalb gezielt einzelne Namen mit
has()ab, statt eine feste Liste zu erwarten.