WebGPU の新機能(Chrome 133)

François Beaufort
François Beaufort

公開日: 2025 年 1 月 29 日

追加の unorm8x4-bgra と 1 コンポーネントの頂点形式

"unorm8x4-bgra" 頂点形式と、次の 1 コンポーネント頂点形式が追加されました。"uint8""sint8""unorm8""snorm8""uint16""sint16""unorm16""snorm16""float16""unorm8x4-bgra" 頂点形式を使用すると、同じシェーダーを維持しながら BGRA でエンコードされた頂点色を読み込むのが少し便利になります。また、1 コンポーネントの頂点形式では、必要なデータのみをリクエストできるため、8 ビットおよび 16 ビットのデータ型では少なくとも 2 倍の量が必要でした。chromestatus のエントリ問題 376924407 をご覧ください。

未定義の値で不明な上限をリクエストできるようにする

WebGPU API の進化に伴う脆弱性を軽減するため、GPU デバイスをリクエストするときに、undefined 値を使用して不明な上限をリクエストできるようになりました。これは、次のアプリコードで役立ちます。たとえば、someLimit が存在しなくなった場合、adapter.limits.someLimitundefined にできます。仕様 PR 4781 をご覧ください。

const adapter = await navigator.gpu.requestAdapter();

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL アライメント ルールの変更

すべての構造体で @align(n)RequiredAlignOf を割る必要があるため、構造体メンバーに小さすぎるアライメント値を指定することはできなくなりました。この破壊的変更により、WGSL 言語の使用が簡素化され、Firefox と Safari との互換性が向上します。Tint、Naga、WebKit コンパイラ間の違いを示すサンプルコードは、仕様 PR で確認できます。

破棄による WGSL のパフォーマンスの向上

複雑なスクリーン空間反射(SSR)エフェクトのレンダリング時にパフォーマンスが大幅に低下するため、破棄ステートメントの実装では、プラットフォーム提供のセマンティクスを使用して、利用可能な場合はヘルパー呼び出しに降格します。これにより、破棄を使用するシェーダーのパフォーマンスが向上します。問題 372714384 をご覧ください。

外部テクスチャに VideoFrame displaySize を使用する

WebGPU 仕様に従って VideoFrame をインポートする際、displayWidthdisplayHeight のディメンションは GPUExternalTexture の見かけのサイズとして使用する必要があります。しかし、表示サイズが誤って使用され、GPUExternalTexture で textureLoad() を使用する際に問題が発生していました。この問題は解決済みです。問題 377574981 をご覧ください。

copyExternalImageToTexture を使用して、デフォルト以外の向きの画像を処理する

copyExternalImageToTexture() GPUQueue メソッドは、画像またはキャンバスのコンテンツをテクスチャにコピーするために使用されます。デフォルト以外の向きの画像が正しく処理されるようになりました。以前は、ソースが imageOrientation "from-image" の ImageBitmap またはデフォルト以外の向きの画像の場合、この動作は行われませんでした。問題 384858956 をご覧ください。

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

adapter.limits に大きな値が表示されても、GPU デバイスをリクエストする際に上限を引き上げるように明示的にリクエストする必要があることに気付かない場合があります。そうしないと、後で予期せず上限に達する可能性があります。

エラー メッセージが拡張され、requestDevice() の呼び出し時に requiredLimits で上限が指定されていない場合は、上限を明示的にリクエストするよう求めるヒントが表示されるようになりました。問題 42240683 をご覧ください。

次の例は、デフォルトの最大バッファサイズのデバイス上限を超えるサイズの GPU バッファを作成するときに、DevTools コンソールに記録されるエラー メッセージの改善を示しています。

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

featureLevel で互換モードを有効にする

標準化された featureLevel オプションを "compatibility" に設定することで、試験運用版の互換モードで GPU アダプターをリクエストできるようになりました。指定できる値は、"core"(デフォルト)と "compatibility" の文字列のみです。次の例と 仕様 PR 4897 をご覧ください。

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel オプションは標準化されていない compatibilityMode オプションに代わるもので、標準化されていない featureLevel 属性は isCompatibilityMode 属性に代わるものです。

まだ試験運用版であるため、現時点では chrome://flags/#enable-unsafe-webgpu で「Unsafe WebGPU Support」フラグを有効にして Chrome を実行する必要があります。webgpureport.org で試してみてください。

試験運用版のサブグループ機能のクリーンアップ

非推奨の "chromium-experimental-subgroups""chromium-experimental-subgroup-uniform-control-flow" の試験運用版サブグループ機能が削除されました。問題 377868468 をご覧ください。

サブグループをテストする際には、"subgroups" 試験運用版機能のみが必要です。"subgroups-f16" 試験運用版機能は非推奨となり、まもなく削除されます。アプリケーションが "shader-f16" 機能と "subgroups" 機能の両方をリクエストする場合は、サブグループで f16 値を使用できます。問題 380244620 をご覧ください。

maxInterStageShaderComponents の上限を非推奨にする

maxInterStageShaderComponents の上限は、次の要因が重なって非推奨になりました。

  • maxInterStageShaderVariables との冗長性: この上限はすでに同様の目的を果たしており、シェーダー ステージ間で渡されるデータの量を制御しています。
  • わずかな差異: 2 つの上限の計算方法には若干の違いがありますが、この差異は軽微であり、maxInterStageShaderVariables の上限内で効果的に管理できます。
  • 簡素化: maxInterStageShaderComponents を削除することで、シェーダー インターフェースが合理化され、デベロッパーの複雑さが軽減されます。わずかな違いがある 2 つの上限を別々に管理するのではなく、より適切な名前の包括的な maxInterStageShaderVariables に集中できます。

目標は Chrome 135 で完全に削除することです。サポート終了の目的問題 364338810 をご覧ください。

Dawn の更新

wgpu::Device::GetAdapterInfo(adapterInfo) を使用すると、wgpu::Device から直接アダプター情報を取得できます。問題 376600838 をご覧ください。

コンピューティング ステータスを頂点状態とフラグメント状態と整合させるため、WGPUProgrammableStageDescriptor 構造体の名前を WGPUComputeState に変更しました。問題 379059434 をご覧ください。

wgpu::VertexStepMode::VertexBufferNotUsed 列挙値が削除されました。使用されていない頂点バッファ レイアウトを {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} で表現できるようになりました。問題 383147017 をご覧ください。

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

WebGPU の新機能

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

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