WebGPU の新機能(Chrome 130)

François Beaufort
François Beaufort

デュアルソース ブレンディング

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

新しい "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 チームは、Metal バックエンドで WebGPU をサポートするデバイスの中間表現(IR)を導入することで、WebGPU シェーダー言語コンパイラである Tint を強化しています。Tint の抽象構文木(AST)と Metal バックエンド ライターの間に配置されるこの IR により、コンパイラの効率と保守性が向上し、最終的にはデベロッパーとユーザーの両方にメリットがもたらされます。初期テストでは、Unity の WGSL シェーダーを MSL に変換する際に、新しいバージョンの Tint が最大 10 倍高速であることが示されています。

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

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

GPUAdapter requestAdapterInfo() の非推奨

デベロッパーは GPUAdapter の info 属性を使用して GPUAdapterInfo を同期的に取得できるため、GPUAdapter の requestAdapterInfo() 非同期メソッドは冗長です。そのため、非標準の 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、未定義)をより適切に反映するようになりました。詳細については、次のコード スニペットと webgpu-headers PR をご覧ください。

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

これは主なハイライトの一部にすぎません。コミットの完全なリストをご覧ください。

WebGPU の新機能

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

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