WebGPU の新機能(Chrome 130)

François Beaufort
François Beaufort

デュアルソースのブレンド

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

新しい "dual-source-blending" WebGPU 機能を使用すると、@location(0) で WGSL @blend_src 属性を使用して、ブレンド ソース インデックスと次のブレンド係数"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 チームは、Metal バックエンドを使用して WebGPU をサポートするデバイス向けの中間表現(IR)を導入することで、WebGPU シェーダー言語コンパイラである Tint を強化しています。Tint の抽象構文ツリー(AST)と Metal バックエンド ライターの間にあるこの IR は、コンパイラの効率と保守性を向上させ、最終的にはデベロッパーとユーザーの双方に利益をもたらします。初期テストでは、新しいバージョンの Tint は、Unity の WGSL シェーダーを MSL に変換する際に最大 10 倍高速であることが示されています。

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

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

GPUAdapter requestAdapterInfo() の非推奨

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

DevTools コンソールに、requestAdapterInfo() の非推奨に関する警告が表示されます。
Chrome DevTools での requestAdapterInfo() の非推奨の機能に関する警告。

Dawn の更新

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、undefined)をより適切に反映できるようになりました。詳細については、次のコード スニペットと webgpu-headers PR をご覧ください。

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

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

WebGPU の新機能

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

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