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 との互換性が向上します。仕様 PR で、Tint、Naga、WebKit コンパイラの違いを示すサンプルコードを確認できます。

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

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

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

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

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

copyExternalImageToTexture() GPUQueue メソッドは、画像またはキャンバスの内容をテクスチャにコピーするために使用されます。デフォルト以外の向きの画像を適切に処理できるようになりました。以前は、ソースが ImageBitmap で imageOrientation "from-image" またはデフォルト以外の向きの画像の場合、そうではありませんでした。問題 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 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