Das ist neu bei WebGPU (Chrome 132)

François Beaufort
François Beaufort

Veröffentlicht: 8. Januar 2025

Nutzung der Texturansichten

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

Diese Änderung ermöglicht eine Vorabprüfung und eine detailliertere Kontrolle darüber, wie die Ansicht verwendet wird. Außerdem ist sie mit anderen Grafik-APIs kompatibel, in denen Nutzungsflags gängige Parameter beim Erstellen von Ansichten sind, was Optimierungsmöglichkeiten bietet.

Weitere Informationen finden Sie im folgenden Snippet, im chromestatus-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.
});

32-Bit-Gleitkommatextur-Mischung

32-Bit-Fließkommatextur sind für das HDR-Rendering unerlässlich, um einen großen Bereich von Farbwerten zu erhalten und Farbbanding-Artefakte zu vermeiden. Zum Beispiel bei der wissenschaftlichen Visualisierung.

Mit der neuen GPU-Funktion "float32-blendable" können GPU-Texturen mit den Formaten "r32float", "rg32float" und "rgba32float" überlagert werden. Wenn Sie ein GPU-Gerät mit dieser Funktion anfordern, ist es jetzt möglich, eine Renderpipeline zu erstellen, die das Mischen mit beliebigen Anhängen im Float32-Format verwendet.

Weitere Informationen finden Sie im folgenden Snippet, im chromestatus-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, auf Informationen zur physischen GPU zuzugreifen, da sie je nach GPU-Architektur optimiert oder Umgehungslösungen implementiert werden 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 ärgerlich sein, da Nutzer möglicherweise neben der GPUDevice zusätzliche Informationen angeben müssen.

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

Weitere Informationen finden Sie im folgenden Snippet, im chromestatus-Eintrag und im 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 geworfen

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, um eine JavaScript-TypeError zu werfen. So wird verhindert, dass 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

Bisher war es zulässig, Texturen im "sint"-, "uint"- und depth"-Format mit Filterproben zu verwenden. 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. Siehe Problem 376497143.

Aufgrund dieser Einschränkungen müssen Bindungsgruppenlayouts manuell erstellt werden, wenn eine Tiefentextur mit einem nicht filternden Sampler verwendet wird. Das liegt daran, dass diese Kombination von den automatisch generierten Bindungsgruppenlayouts noch nicht unterstützt wird. Spezifikationsproblem 4952 enthält einen Vorschlag, wie diese Einschränkung in Zukunft behoben werden könnte.

Erweiterte Tests von Untergruppen

Der Test für Untergruppen, der ursprünglich mit Chrome 131 enden sollte, wurde bis Chrome 133 verlängert und endet am 16. April 2025. Während sich der erste Test auf die Leistung konzentrierte, fehlten ihm wichtige Sicherheitsmaßnahmen für die Portabilität. Diese Sicherheitsmaßnahmen werden jetzt hinzugefügt, was möglicherweise zu Fehlern im vorhandenen Code führt.

Verbesserung der Entwicklerfreundlichkeit

In den DevTools wird jetzt eine Warnung angezeigt, wenn die Option powerPreference unter Windows mit requestAdapter() verwendet wird. Diese Warnung wird entfernt, sobald Chrome weiß, wie zwei verschiedene GPUs verwendet und die Ergebnisse zusammengeführt werden. Siehe Problem 369219127.

Die Größe des GPU-Buffers wird jetzt in der Fehlermeldung angezeigt, wenn ein zu großer GPU-Buffer erstellt wird. Siehe Problem 374167798.

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

16-Bit-normalisierte Texturformate mit Vorzeichen und ohne Vorzeichen sind jetzt experimentell über die "chromium-experimental-snorm16-texture-formats"- und "chromium-experimental-unorm16-texture-formats"-GPU-Funktionen verfügbar, während sie für die Standardisierung diskutiert werden.

Diese Funktionen unterstützen 16‑Bit-normalisierte Texturformate mit COPY_SRC-, COPY_DST-, TEXTURE_BINDING- und RENDER_ATTACHMENT-Nutzung, Multisampling und Auflösungsfunktionen. Die zusätzlichen Formate sind "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" und "rgba16snorm".

Bis diese experimentellen Funktionen standardisiert sind, aktivieren Sie das Flag „Unsafe WebGPU Support“ (Unterstützung für unsichere WebGPU) unter chrome://flags/#enable-unsafe-webgpu, um sie in Chrome verfügbar zu machen.

Weitere Informationen finden Sie im folgenden Snippet und in Issue 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 von wgpu::Adapter und wgpu::Device wurden zugunsten von GetFeatures(SupportedFeatures * features) eingestellt. 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. Er fungiert als Zeiger auf die Daten des Strings, gekoppelt mit einer Länge. So können Sie mit Teilen eines Strings arbeiten, ohne ihn kopieren zu müssen. Siehe Problem 42241188.

Dies sind nur einige der wichtigsten Highlights. Eine vollständige Liste der Commits

Das ist neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Was ist neu in WebGPU? behandelt wurden.

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