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 とともに追加情報を提供する必要があるため、不便になる可能性があります。

この問題に対処するため、GPUDevice adapterInfo 属性を通じて GPUAdapterInfo が公開されるようになりました。これらは、既存の 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""chromium-experimental-unorm16-texture-formats" GPU 機能の背後で試験的に利用できるようになりました。これらの形式は、現在標準化に向けて議論されています。

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

これらの試験運用版の機能が標準化されるまでは、chrome://flags/#enable-unsafe-webgpu で「安全でない WebGPU サポート」フラグを有効にして、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 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