Das ist neu bei WebGPU (Chrome 132)

François Beaufort
François Beaufort

Veröffentlicht am 8. Januar 2025

Verwendung der Texturansicht

GPU-Texturansichten übernehmen derzeit alle Nutzungsflags von ihrer Quell-GPU-Textur. Das kann problematisch sein, da einige Ansichtsformate mit bestimmten Verwendungszwecken nicht kompatibel sind. Um dieses Problem zu beheben, können Sie createView() mit dem optionalen usage-Member aufrufen, um explizit eine Teilmenge der Nutzungs-Flags der Quelltextur anzugeben, die mit dem ausgewählten Ansichtsformat kompatibel sind.

Diese Änderung ermöglicht eine Vorabvalidierung und eine genauere Steuerung der Verwendung der Ansicht. Außerdem entspricht es anderen Grafik-APIs, bei denen Nutzungs-Flags häufige Parameter bei der Ansichtserstellung sind und Optimierungsmöglichkeiten bieten.

Weitere Informationen finden Sie im folgenden Snippet, im Chrome-Status-Eintrag und in Problem 363903526.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

Mischen von 32-Bit-Gleitkomma-Texturen

32‑Bit-Gleitkomma-Texturen sind für das HDR-Rendering unerlässlich, um einen großen Bereich von Farbwerten beizubehalten und Farbstreifenartefakte zu vermeiden. Zum Beispiel in der wissenschaftlichen Visualisierung.

Mit der neuen GPU-Funktion "float32-blendable" können GPU-Texturen mit den Formaten "r32float", "rg32float" und "rgba32float" überblendet werden. Es ist jetzt möglich, eine Rendering-Pipeline zu erstellen, die Blending mit einem beliebigen Attachment im float32-Format verwendet, wenn ein GPU-Gerät mit dieser Funktion angefordert wird.

Weitere Informationen finden Sie im folgenden Snippet, im Chrome-Status-Eintrag und in Problem 369649348.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice-Attribut adapterInfo

Für Bibliotheken, die von Nutzern bereitgestellte GPUDevice-Objekte verwenden, ist es wichtig, dass sie auf Informationen zur physischen GPU zugreifen können, da sie möglicherweise Optimierungen oder Workarounds basierend auf der GPU-Architektur implementieren müssen. Es ist zwar möglich, über das GPUAdapter-Objekt auf diese Informationen zuzugreifen, aber es gibt keine direkte Möglichkeit, sie nur über ein GPUDevice abzurufen. Das kann umständlich sein, da Nutzer möglicherweise zusätzliche Informationen zusammen mit der GPUDevice angeben müssen.

Um dieses Problem zu beheben, wird GPUAdapterInfo jetzt über das Attribut GPUDevice adapterInfo verfügbar gemacht. Sie ähneln dem vorhandenen Attribut GPUAdapter info.

Weitere Informationen finden Sie im folgenden Snippet, im Chrome-Status-Eintrag und in Problem 376600838.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

Beim Konfigurieren des Canvas-Kontexts mit einem ungültigen Format wird ein JavaScript-Fehler ausgegeben.

Bisher führte die Verwendung eines ungültigen Texturformats mit der Methode configure() des GPU-Canvas-Kontexts zu einem GPU-Validierungsfehler. Dies wurde geändert, sodass ein JavaScript-TypeError ausgelöst wird. So werden Szenarien verhindert, in denen getCurrentTexture() eine gültige GPU-Textur zurückgibt, obwohl der GPU-Canvas-Kontext falsch konfiguriert ist. Weitere Informationen finden Sie unter Problem 372837859.

Einschränkungen für Sampler bei Texturen filtern

Die Verwendung von "sint"-, "uint"- und depth"-Formattexturen mit Filterstichproben war bisher zulässig. Die Verwendung einer Textur im Format "sint" oder "uint" mit einem Filter-Sampler ist jetzt korrekt nicht zulässig. Derzeit wird eine Warnung ausgegeben, wenn Sie eine depth"-Textur mit einem Filter-Sampler verwenden, da dies in Zukunft nicht mehr zulässig sein wird. Weitere Informationen finden Sie unter Problem 376497143.

Aufgrund dieser Einschränkungen ist es erforderlich, Bindungsgruppenlayouts manuell zu erstellen, wenn eine Tiefentextur mit einem Sampler ohne Filterung verwendet wird. Das liegt daran, dass die automatisch generierten Bindungsgruppenlayouts diese Kombination noch nicht unterstützen. Spec issue 4952 enthält einen Vorschlag, der derzeit geprüft wird, um diese Einschränkung in Zukunft zu beheben.

Tests mit erweiterten Untergruppen

Die Untergruppen-Tests, die ursprünglich in Chrome 131 enden sollten, wurden auf Chrome 133 verlängert und enden am 16. April 2025. Im ersten Ursprungstest lag der Fokus auf der Leistung, es fehlten jedoch wichtige Portabilitätsschutzmaßnahmen. Diese Sicherheitsmaßnahmen werden jetzt hinzugefügt, was möglicherweise Fehler im vorhandenen Code verursacht.

Entwicklererfahrung verbessern

In den Entwicklertools wird jetzt eine Warnung angezeigt, wenn die Option powerPreference mit requestAdapter() unter Windows verwendet wird. Diese Warnung wird entfernt, sobald Chrome zwei verschiedene GPUs verwenden und die Ergebnisse zusammenführen kann. Weitere Informationen finden Sie unter Problem 369219127.

Die Größe des GPU-Puffers wird jetzt in der Fehlermeldung angezeigt, wenn ein zu großer GPU-Puffer erstellt wird. Weitere Informationen finden Sie unter Problem 374167798.

Experimentelle Unterstützung für normalisierte 16‑Bit-Texturformate

Die Texturformate „16-Bit-Signed-Normalized“ und „Unsigned-Normalized“ sind jetzt experimentell hinter den GPU-Funktionen "chromium-experimental-snorm16-texture-formats" und "chromium-experimental-unorm16-texture-formats" verfügbar, während sie für die Standardisierung diskutiert werden.

Diese Funktionen bieten Unterstützung für normalisierte 16-Bit-Texturformate mit den Verwendungszwecken COPY_SRC, COPY_DST, TEXTURE_BINDING und RENDER_ATTACHMENT sowie für Multisample- und Auflösungsfunktionen. Die zusätzlichen Formate sind "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" und "rgba16snorm".

Bis diese experimentellen Funktionen standardisiert sind, müssen Sie das Flag „Unsafe WebGPU Support“ unter chrome://flags/#enable-unsafe-webgpu aktivieren, damit sie in Chrome verfügbar sind.

Weitere Informationen finden Sie im folgenden Snippet und unter Problem 374790898.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Dawn-Updates

Die EnumerateFeatures(FeatureName * features)-Methoden aus wgpu::Adapter und wgpu::Device sind zugunsten der Verwendung von GetFeatures(SupportedFeatures * features) veraltet. Siehe Problem 368672123.

In der C-API webgpu.h wurde char const * in eine WGPUStringView-Struktur geändert, die eine Ansicht in einen UTF-8-codierten String definiert. Es fungiert als Zeiger auf die Daten des Strings, zusammen mit einer Länge. So können Sie mit Teilen eines Strings arbeiten, ohne ihn kopieren zu müssen. Weitere Informationen finden Sie unter Problem 42241188.

Dies sind nur einige der wichtigsten Neuerungen. Vollständige Liste der Commits

Neues zu WebGPU

Eine Liste mit allen Themen, die in der Reihe Neu in WebGPU behandelt wurden.

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113