WebGPU-Entwicklerfunktionen

François Beaufort
François Beaufort

Veröffentlicht: 3. Juni 2025

Die WebGPU API-Implementierung von Chrome enthält Funktionen, die ausschließlich für die Entwicklung und Tests vorgesehen sind. Diese Funktionen fallen nicht unter die WebGPU-Standardspezifikation und dürfen nicht in der Produktion verwendet werden.

In diesem Dokument wird beschrieben, wie Sie WebGPU-Entwicklerfunktionen aktivieren. Außerdem finden Sie dort eine umfassende Liste.

Voraussetzungen

So aktivieren Sie WebGPU-Entwicklerfunktionen in Chrome:

  1. Aktivieren Sie das Flag „WebGPU-Entwicklerfunktionen“ bei chrome://flags/#enable-webgpu-developer-features.
  2. Starten Sie den Chrome-Browser neu.

Quantisierung von Zeitstempelabfragen deaktivieren

Mit Zeitstempelabfragen können WebGPU-Anwendungen die Ausführungszeit von GPU-Befehlen während der Compute- und Rendering-Pässe auf Nanosekunden genau messen. Diese Abfragen sind für die Analyse der Leistung und des Verhaltens der GPU-Arbeitslast unerlässlich. Weitere Informationen finden Sie unter Zeitstempelabfragen in Compute- und Rendering-Passes.

Aus Sicherheitsgründen werden Zeitstempelabfragen aufgrund von Timing-Angriffen mit einer Auflösung von 100 Mikrosekunden quantisiert. Dies bietet einen guten Kompromiss zwischen Genauigkeit und Sicherheit. Diese Quantisierung wird automatisch deaktiviert, wenn das Flag „WebGPU Developer Features“ aktiviert ist.

Erweiterte Adapterinformationen

Um mehr über den verwendeten Adapter zu erfahren, stellt GPUAdapterInfo die folgenden Attribute bereit:

  • Das device-Attribut (standardisiert) ist eine anbieterspezifische Adapter-ID.
  • Das Attribut description (standardisiert) ist ein für Menschen lesbarer String mit Adapterdetails.
  • Das Attribut driver (nicht standardisiert) ist ein für Menschen lesbarer String, der den Fahrer beschreibt.
  • Das backend-Attribut (nicht standardisiert) gibt das Grafik-Back-End an, z. B. "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" oder "null".
  • Das Attribut type (nicht standardisiert) gibt den GPU-Typ an: "discrete GPU", "integrated GPU", "CPU" oder "unknown".
  • Das Attribut d3dShaderModel (nicht standardisiert) gibt die maximal unterstützte D3D-Shadermodellnummer an. „62“ steht beispielsweise für die Unterstützung von HLSL SM 6.2.
  • Das Attribut vkDriverVersion (nicht standardisiert) ist die vom Anbieter angegebene Vulkan-Treiberversion.
  • Das powerPreference-Attribut (nicht standardisiert) ist "low-power" oder "high-performance", je nach GPUPowerPreference in GPURequestAdapterOptions.

Um Speichereinschränkungen bei der Zuweisung großer Mengen während der Entwicklung Ihrer App zu antizipieren, gibt GPUAdapterInfo memoryHeaps nicht standardisierte Informationen wie die Größe und den Typ der Speicherbereiche preis, die auf dem Adapter verfügbar sind.

const adapter = await navigator.gpu.requestAdapter();

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

Shader-Modul-Kompilierungsoption „Strict Math“

Der GPUShaderModuleDescriptor enthält eine nicht standardisierte boolesche Option strictMath, mit der die strikte mathematische Genauigkeit während der Shadermodulkompilierung aktiviert oder deaktiviert wird. Diese Option wird von Metal und Direct3D unterstützt. Wenn strictMath aktiviert ist, hält sich der Compiler an genaue mathematische Regeln. Wenn Sie sie deaktivieren, kann der Compiler Shader auf folgende Weise optimieren:

  • Die Möglichkeit von NaN- und Infinity-Werten wird ignoriert.
  • -0 wird als +0 behandelt.
  • Ersetzen der Division durch eine schnellere Multiplikation mit dem Kehrwert.
  • Umsortieren von Operationen basierend auf assoziativen und distributiven Eigenschaften.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

Video mit Zero-Copy-Technologie importieren

Das nicht standardisierte boolesche Attribut „GPUExternalTexture“ isZeroCopy gibt an, ob auf das mit importExternalTexture() importierte Video direkt von der GPU zugegriffen wurde, ohne dass eine Zwischenkopie erforderlich war.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}