WebGPU の新機能(Chrome 130)

François Beaufort
François Beaufort

デュアルソースの統合

2 つのフラグメント シェーダー出力を 1 つのフレームバッファに結合することを、デュアルソース ブレンドと呼びます。この手法は、Porter-Duff ブレンドモードに基づいたものなど、複雑なブレンディング操作を必要とするアプリケーションに特に有用です。デュアルソース ブレンディングでは、後続のレンダリング パスを単一のレンダリング パスに置き換えることで、パフォーマンスと柔軟性を向上させることができます。

新しい "dual-source-blending" WebGPU 機能では、WGSL の @blend_src 属性(@location(0))を使用して、ブレンディング ソース インデックスとブレンド係数"src1""one-minus-src1""src1-alpha""one-minus-src1-alpha")を指定できます。以下のスニペット、chromestatus のエントリ問題 341973423 をご覧ください。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("dual-source-blending")) {
  throw new Error("Dual source blending support is not available");
}
// Explicitly request dual source blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["dual-source-blending"],
});

const code = `
  enable dual_source_blending;

  struct FragOut {
    @location(0) @blend_src(0) color : vec4f,
    @location(0) @blend_src(1) blend : vec4f,
  }

  @fragment fn main() -> FragOut {
    var output : FragOut;
    output.color = vec4f(1.0, 1.0, 1.0, 1.0);
    output.blend = vec4f(0.5, 0.5, 0.5, 0.5);
    return output;
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a render pipeline with this shader module
// and run the shader on the GPU...

Metal でのシェーダーのコンパイル時間を改善

Chrome チームは、WebGPU シェーダーの言語コンパイラである Tint を強化するために、Meta バックエンドで WebGPU をサポートするデバイス向けに中間表現(IR)を導入しています。この IR は、Tint の抽象構文木(AST)と Metal バックエンド ライターの間に位置し、コンパイラをより効率的でメンテナンス可能にし、最終的にはデベロッパーとユーザーの両方にメリットをもたらします。初期テストでは、Unity の WGSL シェーダーを MSL に変換すると、新しいバージョンの Tint が最大 10 倍高速になることがわかりました。

フローチャートは、WGSL シェーダー コードを低レベルの GPU 命令に変換するプロセスを示しています。
macOS でのレンダリング パイプラインの作成。

これらの改善は、Android と ChromeOS ですでに利用可能でしたが、Meta バックエンドで WebGPU をサポートする macOS デバイスにも段階的に展開されます。問題 42251016 をご覧ください。

GPUAdapter requestAdapterInfo() のサポート終了

GPUAdapter の requestAdapterInfo() 非同期メソッドは、開発者がすでに GPUAdapter の info 属性を使用して GPUAdapterInfo を同期的に取得できるため、冗長です。そのため、非標準の GPUAdapter requestAdapterInfo() メソッドは非推奨となりました。サポート終了の予告をご覧ください。

<ph type="x-smartling-placeholder">
</ph> DevTools コンソールに、requestAdapterInfo() の非推奨に関する警告が表示されます。
Chrome DevTools での requestAdapterInfo() の非推奨の機能に関する警告。

夜明けの最新情報

webgpu.h C API では、拡張構造体の命名規則がいくつか定義されています。以下の名前の変更と 問題 42241174 をご覧ください。

WGPURenderPassDescriptor 拡張機能
WGPURenderPassDescriptorMaxDrawCount -> WGPURenderPassMaxDrawCount
WGPUShaderModuleDescriptor 個の拡張機能
WGPUShaderModuleSPIRVDescriptor -> WGPUShaderSourceSPIRV
WGPUShaderModuleWGSLDescriptor -> WGPUShaderSourceWGSL
WGPUSurfaceDescriptor 拡張機能
WGPUSurfaceDescriptorFromMetalLayer -> WGPUSurfaceSourceMetalLayer
WGPUSurfaceDescriptorFromWindowsHWND -> WGPUSurfaceSourceWindowsHWND
WGPUSurfaceDescriptorFromXlibWindow -> WGPUSurfaceSourceXlibWindow
WGPUSurfaceDescriptorFromWaylandSurface -> WGPUSurfaceSourceWaylandSurface
WGPUSurfaceDescriptorFromAndroidNativeWindow -> WGPUSurfaceSourceAndroidNativeWindow
WGPUSurfaceDescriptorFromXcbWindow -> WGPUSurfaceSourceXCBWindow
WGPUSurfaceDescriptorFromCanvasHTMLSelector -> WGPUSurfaceSourceCanvasHTMLSelector_Emscripten

WGPUDepthStencilStatedepthWriteEnabled 属性型がブール値から WGPUOptionalBool に切り替わり、JavaScript API の場合と同様に、3 つの状態(true、false、未定義)がより適切に反映されるようになりました。詳しくは、次のコード スニペットと webgpu-headers PR をご覧ください。

wgpu::DepthStencilState depthStencilState = {};
depthStencilState.depthWriteEnabled = wgpu::OptionalBool::True; // Undefined by default

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

WebGPU の新機能

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

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