WebGPU の新機能(Chrome 132)

François Beaufort
François Beaufort

公開日: 2025 年 1 月 8 日

テクスチャ ビューの使用

現在、GPU テクスチャビューは、ソース GPU テクスチャからすべての使用フラグを継承します。一部のビュー形式は特定の用途に対応していないため、問題になる可能性があります。この問題に対処するには、オプションの usage メンバーを指定して createView() を呼び出すと、選択したビュー形式と互換性のあるソース テクスチャの使用フラグのサブセットを明示的に指定できます。

この変更により、事前検証が可能になり、ビューの使用方法をよりきめ細かく制御できるようになります。また、使用フラグがビューの作成で一般的なパラメータである他のグラフィックス API と整合し、最適化の機会を提供します。

以下のスニペット、chromestatus のエントリ問題 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 ビット浮動小数点テクスチャのブレンド

32 ビットの浮動小数点テクスチャは、HDR レンダリングで広範な色値を保持し、色のバンディング アーティファクトを防ぐために不可欠です。たとえば、科学的な可視化で使用します。

新しい "float32-blendable" GPU 機能により、"r32float""rg32float""rgba32float" の形式の GPU テクスチャをブレンドできるようになりました。この機能を使用して GPU デバイスをリクエストするときに、float32 形式のアタッチメントでブレンドを使用するレンダリング パイプラインを作成できるようになりました。

次のスニペット、chromestatus のエントリ問題 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 adapterInfo 属性

ユーザー提供の GPUDevice オブジェクトを使用するライブラリは、GPU アーキテクチャに基づいて回避策を最適化または実装する必要がある可能性があるため、物理 GPU に関する情報にアクセスすることが重要です。この情報には GPUAdapter オブジェクトからアクセスできますが、GPUDevice から直接取得する方法はありません。ユーザーが GPUDevice とともに追加情報を提供しなければならない可能性があるため、これは不便です。

この問題に対処するため、GPUAdapterInfoGPUDevice adapterInfo 属性を介して公開されるようになりました。これらは、既存の GPUAdapter info 属性に似ています。

次のスニペット、chromestatus のエントリ問題 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.
  }
}

無効な形式でキャンバス コンテキストを構成すると JavaScript エラーがスローされる

以前は、GPU キャンバス コンテキストの configure() メソッドで無効なテクスチャ形式を使用すると、GPU 検証エラーが発生していました。これは、JavaScript TypeError をスローするように変更されました。これにより、GPU キャンバス コンテキストが正しく構成されていないにもかかわらず、getCurrentTexture() が有効な GPU テクスチャを返すシナリオを防ぐことができます。詳しくは、問題 372837859 をご覧ください。

テクスチャでのフィルタリング サンプラーの制限

以前は、"sint""uint"depth" 形式のテクスチャをフィルタリング サンプルで使用できました。フィルタリング サンプラーで "sint" 形式または "uint" 形式のテクスチャを使用することを正しく禁止するようになりました。なお、現在は「depth" テクスチャとフィルタリング サンプラー」を使用すると警告が表示されますが、これは今後禁止される予定です。問題 376497143 をご覧ください。

これらの制限により、フィルタリングなしのサンプラーで深度テクスチャを使用するには、バインディング グループ レイアウトを手動で作成する必要があります。これは、「自動」生成されたバインディング グループ レイアウトがまだこの組み合わせをサポートしていないためです。仕様の問題 4952 には、この制限事項に対処するための提案が記載されています。

サブグループの拡張テスト

サブグループのテストは、当初 Chrome 131 で終了する予定でしたが、Chrome 133 まで延長され、2025 年 4 月 16 日に終了します。最初のオリジン トライアルではパフォーマンスに重点を置きましたが、重要なポータビリティ保護対策が欠落していました。これらの安全保護対策が追加され、既存のコードでエラーが発生する可能性があります。

デベロッパー エクスペリエンスの向上

Windows で requestAdapter()powerPreference オプションを使用すると、DevTools に警告が表示されるようになりました。この警告は、Chrome が 2 つの異なる GPU を使用して結果を合成する方法を認識すると削除されます。問題 369219127 をご覧ください。

サイズが大きすぎる GPU バッファを作成すると、エラー メッセージに GPU バッファのサイズが表示されるようになりました。問題 374167798 をご覧ください。

16 ビットの正規化テクスチャ形式の試験運用版サポート

16 ビットの正規化された符号付きテクスチャ形式と正規化されていない符号付きテクスチャ形式が、標準化の議論の対象となっている "chromium-experimental-snorm16-texture-formats" GPU 機能と "chromium-experimental-unorm16-texture-formats" GPU 機能で、それぞれ試験運用版として利用できるようになりました。

これらの機能により、COPY_SRCCOPY_DSTTEXTURE_BINDINGRENDER_ATTACHMENT の使用、マルチサンプリング、解決機能による 16 ビットの正規化テクスチャ形式がサポートされます。その他の形式は、"r16unorm""rg16unorm""rgba16unorm""r16snorm""rg16snorm""rgba16snorm" です。

これらの試験運用版の機能が標準化されるまで、chrome://flags/#enable-unsafe-webgpu で「Unsafe WebGPU Support」フラグを有効にして、Chrome でこれらの機能を利用できるようにします。

以下のスニペットと 問題 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 の更新

wgpu::Adapterwgpu::DeviceEnumerateFeatures(FeatureName * features) メソッドのサポートを終了し、GetFeatures(SupportedFeatures * features) の使用に置き換えました。問題 368672123 を参照。

webgpu.h C API では、すべての char const * が UTF-8 エンコード文字列へのビューを定義する WGPUStringView 構造に変更されました。これは、長さと組み合わせて文字列のデータへのポインタとして機能します。これにより、文字列をコピーしなくても、文字列の一部を操作できます。問題 42241188 をご覧ください。

以下に、主なハイライトをいくつかご紹介します。コミットの一覧(すべて網羅)をご覧ください。

WebGPU の新機能

WebGPU の新機能シリーズで取り上げられたすべての内容のリスト。

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