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 ビット浮動小数点テクスチャのブレンド

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

新しい "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 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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