Start · Sprachen · JavaScript · Referenz · WGSLLanguageFeatures

WGSLLanguageFeatures

Schnittstelle

Schreibgeschütztes, setähnliches Objekt der WebGPU-API, das die WGSL-Spracherweiterungen auflistet, die der Browser unterstützt. Erreichbar über <code>navigator.gpu.wgslLanguageFeatures</code>.

seit JavaScript WebGPU; Chromium 115+, Safari 26+, Firefox 141+ (W Kategorie: webapi

Signatur

interface WGSLLanguageFeatures { readonly setlike&lt;DOMString&gt; }

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

Typ
WGSLLanguageFeatures
Beschreibung
Der Wert von 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());
}
Anzahl: 4 - readonly_and_readwrite_storage_textures - packed_4x8_integer_dot_product - unrestricted_pointer_parameters - pointer_composite_access ["packed_4x8_integer_dot_product", "pointer_composite_access", "readonly_and_readwrite_storage_textures", "unrestricted_pointer_parameters"]

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

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));
Alle benötigten WGSL-Erweiterungen verfügbar. unterstützt: readonly_and_readwrite_storage_textures unterstützt: packed_4x8_integer_dot_product unterstützt: unrestricted_pointer_parameters unterstützt: pointer_composite_access