Start · Sprachen · JavaScript · Referenz · GPU.wgslLanguageFeatures

GPU.wgslLanguageFeatures

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>WGSLLanguageFeatures</code>-Objekt mit den von der WebGPU-Implementierung unterstützten WGSL-Spracherweiterungen liefert.

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

Signatur

GPU.wgslLanguageFeatures

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

Typ
WGSLLanguageFeatures
Beschreibung
Ein Objekt, das sich wie ein schreibgeschütztes 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}`);
  }
}
Anzahl: 4 - readonly_and_readwrite_storage_textures - packed_4x8_integer_dot_product - unrestricted_pointer_parameters - pointer_composite_access

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');
Read-Write-Variante

Erweiterungsliste als Array für Telemetrie

const getWgslFeatures = () =>
  navigator.gpu ? [...navigator.gpu.wgslLanguageFeatures].sort() : [];

console.log(JSON.stringify({ wgsl: getWgslFeatures() }));
{"wgsl":["packed_4x8_integer_dot_product","pointer_composite_access","readonly_and_readwrite_storage_textures","unrestricted_pointer_parameters"]}

// Wichtig · Fallstricke

  • Nur in sicheren Kontexten: navigator.gpu gibt es nur über HTTPS oder localhost. Prüfen Sie deshalb immer zuerst, ob navigator.gpu existiert.
  • 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.features und GPUDevice.features. Diese melden hardwareabhängige Funktionen wie shader-f16 und 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() oder clear(). 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 über GPUShaderModule.getCompilationInfo().
  • Die Liste kann mit neuen Browserversionen wachsen. Fragen Sie deshalb gezielt einzelne Namen mit has() ab, statt eine feste Liste zu erwarten.