WebGPU の新機能(Chrome 115)

François Beaufort
François Beaufort

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

GPU オブジェクトの wgslLanguageFeatures メンバーは、サポートされている WGSL の言語拡張機能の名前をリストします。サポートされている WGSL 言語拡張機能は自動的に有効になるため、明示的にリクエストする必要はありません。このリストは現在空ですが、今後多くのリストが追加される予定です(do-while loops など)。issue 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 を実行することで、ローカルでテストできるようになりました。Issue dawn:1705 をご覧ください。

デフォルトで独立した GPU を AC 電源で使用

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

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

DevTools の新しい警告

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

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

サイズがゼロのディスパッチと描画は有効ですが、デベロッパーが可能な限りこれらを避けるよう警告が表示されます。issue dawn:1786 をご覧ください。

エラー メッセージの改善

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

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

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

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

GPUBuffer オブジェクトの mapAsync() メソッドから返されるエラー メッセージが、デベロッパーによるデバッグに役立つように改善されました。下記の例と 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 でデバッグを有効にすると、デバッグ エクスペリエンスが向上します。issue dawn:1784 をご覧ください。

WebGPU から取得したカスタムラベルを表示する macOS の Instruments アプリのスクリーンショット。
macOS の Instruments アプリでのユーザー定義のラベル。

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

dump_shaders デバッグ切り替えを使用すると、入力 WGSL シェーダーと変換されたバックエンド シェーダーをログに記録できます。これ以降、デバッグを有効にすると、コンパイルに失敗した場合に HLSL がダンプされます。issue dawn:1681 をご覧ください。

夜明けの更新情報

頂点バッファの設定を解除

wgpu::RenderPassEncoder または wgpu::RenderBundleEncoderSetVertexBuffer()wgpu::Buffer ではなく nullptr を渡すと、特定のスロットで以前に設定した頂点バッファの設定を解除できます。issue 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 でのみサポートされています。Issue 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 依存関係を取得できます。これに依存するすべてのプロジェクトで depot_tools をインストールする必要はありません。変更点 131750 をご覧ください。

WebGPU の新機能

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

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