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 を強化しています。この IR は、Tint の抽象構文木(AST)と Metal バックエンド ライターの間に位置し、コンパイラをより効率的でメンテナンス可能にします。最終的には、デベロッパーとユーザーの両方にメリットをもたらします。初期テストでは、新しいバージョンの 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