Signatur
Beschreibung
WGSLLanguageFeatures ist ein schreibgeschütztes, setähnliches Objekt (readonly setlike). Es enthält die Namen der WGSL-Spracherweiterungen (WebGPU Shading Language), die die aktuelle WebGPU-Implementierung unterstützt. Jeder Eintrag ist ein String, zum Beispiel "readonly_and_readwrite_storage_textures", "packed_4x8_integer_dot_product", "unrestricted_pointer_parameters" oder "pointer_composite_access". Sie bekommen das Objekt nicht über einen Konstruktor, sondern ausschließlich über die Eigenschaft GPU.wgslLanguageFeatures, also über navigator.gpu.wgslLanguageFeatures.
Spracherweiterungen sind etwas anderes als die Features eines Geräts (GPUAdapter.features bzw. GPUDevice.features). Die Spracherweiterungen hängen nur davon ab, welche WGSL-Version der Browser umsetzt, und gelten automatisch für jedes Gerät. Sie müssen sie also nicht bei requestDevice() anfordern. Im Shader-Code geben Sie eine benötigte Erweiterung mit der Direktive requires an, z. B. requires readonly_and_readwrite_storage_textures;.
Das Objekt bietet dieselben lesenden Methoden wie ein Set:
has(name): prüft, ob eine Erweiterung vorhanden ist.size: Anzahl der unterstützten Erweiterungen.keys(),values(),entries(),forEach()und[Symbol.iterator]: zum Durchlaufen der Einträge.
Methoden, die das Set verändern würden (add, delete, clear), gibt es nicht. Typischerweise fragen Sie das Objekt vor dem Kompilieren eines Shaders ab. Ist eine Erweiterung vorhanden, laden Sie die optimierte Shader-Variante, sonst eine Ersatzlösung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Parameter von has(name): Name der WGSL-Spracherweiterung, z. B. "pointer_composite_access". |
|
| $callbackFn Pflicht | (value: string, key: string, set: WGSLLanguageFeatures) => void | Parameter von forEach(): wird für jede unterstützte Erweiterung einmal aufgerufen. value und key sind wie bei Set identisch. |
|
| $thisArg | any | undefined | Optionaler Parameter von forEach(): Wert für this innerhalb von callbackFn. |
Rückgabewert
navigator.gpu.wgslLanguageFeatures. has() gibt einen boolean zurück, size eine number. keys(), values() und entries() geben einen Iterator über die Namen der Erweiterungen (string) zurück.Beispiele
Alle unterstützten WGSL-Spracherweiterungen auflisten
if (!navigator.gpu) {
console.warn('WebGPU wird nicht unterstützt.');
} else {
const features = navigator.gpu.wgslLanguageFeatures;
console.log(`Anzahl: ${features.size}`);
// Setähnlich: direkt iterierbar
for (const name of features) {
console.log(`- ${name}`);
}
// Oder als echtes Array
console.log([...features].sort());
}
Shader-Variante abhängig von einer Erweiterung wählen
const initCompute = async () => {
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('Kein GPU-Adapter verfügbar.');
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 aktiv' : 'Fallback mit zwei Texturen');
return { device, module };
};
initCompute().catch(console.error);
Mehrere Erweiterungen prüfen und fehlende melden
const required = [
'pointer_composite_access',
'unrestricted_pointer_parameters',
'packed_4x8_integer_dot_product'
];
const features = navigator.gpu?.wgslLanguageFeatures;
const missing = required.filter((name) => !features?.has(name));
if (missing.length === 0) {
console.log('Alle benötigten WGSL-Erweiterungen verfügbar.');
} else {
console.warn('Fehlende WGSL-Erweiterungen:', missing.join(', '));
}
// forEach wie bei Set
features?.forEach((value) => console.log('unterstützt:', value));