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 で確認できます。

discard を使用した WGSL のパフォーマンス向上

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

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

WebGPU 仕様に従って VideoFrame をインポートする場合、displayWidth ディメンションと displayHeight ディメンションは 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" の文字列のみが許可されます。次の例と spec 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 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