WebGPU の新機能(Chrome 115)

François Beaufort
François Beaufort

サポートされている WGSL 言語の拡張機能

GPU オブジェクトの wgslLanguageFeatures メンバーには、サポートされている WGSL 言語拡張機能の名前が一覧表示されます。サポートされている WGSL 言語拡張機能は自動的に有効になるため、明示的にリクエストする必要はありません。現在、このリストには何も登録されていませんが、今後数多くなることが予想されます(do-while loops など)。問題 dawn:1777 をご覧ください。

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Direct3D 11 の試験運用版サポート

Chromium チームは、Direct3D 11 の WebGPU サポートの追加に取り組んでいます。これで、--enable-unsafe-webgpu --use-webgpu-adapter=d3d11 コマンドライン フラグを指定して Windows で Chrome を実行し、ローカルで試せるようになりました。問題 dawn:1705 をご覧ください。

AC 電源でデフォルトで個別の GPU を取得する

デュアル GPU macOS デバイスで、powerPreference オプションを指定せずに requestAdapter() が呼び出されると、ユーザーのデバイスが AC 電源に接続されていれば、ディスクリート GPU が返されます。それ以外の場合は、統合 GPU が返されます。変更 4499307 をご覧ください。

デベロッパー エクスペリエンスの向上

新しい DevTools の警告

GPUExtend3DDictdepth キーが使用されている場合、正しいキーは depthOrArrayLayers であるため、DevTools コンソールに警告が表示されます。issue chromium:1440900 をご覧ください。

また、GPUBlendComponent に明示的なメンバーとデフォルトのメンバーが混在している場合も、警告が生成されます。問題 dawn:1785 をご覧ください。

サイズがゼロのディスパッチと描画は有効ですが、可能な限り回避するようデベロッパーに警告します。問題 dawn:1786 をご覧ください。

エラー メッセージの改善

finish() がすでに呼び出されている場合に GPUCommandEncoder を使用すると、エラー メッセージが改善されました。問題 dawn:1736 をご覧ください。

破棄されたオブジェクトを含むコマンド バッファを送信すると、submit() で使用していたコマンド バッファのラベルがエラー メッセージに表示されるようになりました。問題 dawn:1747 をご覧ください。

depthStencil の検証時に、深度ステンシル状態の無効な部分がエラー メッセージに指定されるようになりました。問題 dawn:1735 をご覧ください。

minBindingSize 検証エラー メッセージに、検証で不合格となったバインディングのグループと番号、バッファが報告されるようになりました。問題 dawn:1604 をご覧ください。

GPUBuffer オブジェクトの mapAsync() メソッドから返されるエラー メッセージを改善し、デベロッパーがデバッグする際に役立つようにしました。以下の例と issue chromium:1431622 をご覧ください。

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

macOS デバッグツールのラベル

use_user_defined_labels_in_backend デバッグ切り替えボタンを使用すると、オブジェクト ラベルをバックエンドに転送して、RenderDoc、PIX、Instruments などのプラットフォーム固有のデバッグツールで表示できます。今後は、macOS でデバッグを有効にすると、より優れたデバッグ環境が提供されます。問題 dawn:1784 をご覧ください。

WebGPU によるカスタムラベルを表示している、macOS の Instruments アプリのスクリーンショット
macOS の Instruments アプリでユーザー定義のラベル。

コンパイルが失敗した場合に HLSL をログに記録

dump_shaders デバッグ切り替えボタンを使用すると、入力 WGSL シェーダーと変換済みのバックエンド シェーダーをログに記録できます。これ以降、デバッグで HLSL を有効にすると、コンパイルに失敗すると HLSL がダンプされます。問題 dawn:1681 を参照

Dawn の更新

頂点バッファの設定解除

wgpu::RenderPassEncoder または wgpu::RenderBundleEncoderSetVertexBuffer()wgpu::Buffer ではなく nullptr を渡すことで、特定のスロットで以前に設定された頂点バッファを設定解除できます。問題 dawn:1675 をご覧ください。

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

一時的な添付ファイル

wgpu::TextureUsage::TransientAttachment の用途を設定することで、レンダリング パス オペレーションをタイルメモリに保持できるアタッチメントを作成できます。これにより、VRAM トラフィックやテクスチャに対する VRAM の割り当てを回避できます。この機能は Metal と Vulkan でのみサポートされています。問題の dawn: 1695 をご覧ください。

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

depot_tools を使用せずにビルド

新しい DAWN_FETCH_DEPENDENCIES CMake オプションを使用すると、DEPS ファイルを読み取る Python スクリプトを使用して、Dawn の依存関係を取得できるようになりました。Dawn に依存するすべてのプロジェクトで depot_tools をインストールする必要はありません。変更点 131750 をご覧ください。

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