WebGPU の新機能(Chrome 124)

François Beaufort
François Beaufort

読み取り専用と読み取り / 書き込みのストレージ テクスチャ

ストレージ テクスチャ バインディング タイプを使用すると、シェーダーは TEXTURE_BINDING の使用を追加せずにストレージ テクスチャから読み取り、特定の形式で読み取りと書き込みを混在させることができます。navigator.gpu.wgslLanguageFeatures"readonly_and_readwrite_storage_textures" WGSL 言語拡張機能が存在する場合、バインディング グループ レイアウトを作成するときに、GPUStorageTexture アクセスを "read-write" または "read-only" に設定できるようになりました。以前は、この機能は "write-only" に制限されていました。

これにより、WGSL シェーダー コードでストレージ テクスチャに read_write アクセス修飾子と read アクセス修飾子を使用できるようになります。textureLoad() 組み込み関数と textureStore() 組み込み関数はそれに応じて動作し、ワークグループ内のテクスチャ メモリアクセスを同期するために新しい textureBarrier() 組み込み関数を使用できます。

WGSL シェーダー コードの上部に requires readonly_and_readwrite_storage_textures; を使用して、requires ディレクティブを使用して、移植できない可能性を通知することをおすすめします。次の例と issue dawn:1972 をご覧ください。

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

const shaderModule = device.createShaderModule({ code: `
  requires readonly_and_readwrite_storage_textures;

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

サービス ワーカーと共有ワーカーのサポート

Chrome の WebGPU は、ウェブワーカーのサポートを次のレベルに引き上げ、サービス ワーカー共有ワーカーの両方をサポートするようになりました。Service Worker を使用すると、バックグラウンド タスクとオフライン機能を強化できます。また、共有ワーカーを使用すると、スクリプト間でリソースを効率的に共有できます。issue chromium:41494731 をご覧ください。

拡張機能の Service Worker で WebGPU を使用する方法については、Chrome 拡張機能のサンプルWebLLM Chrome 拡張機能をご覧ください。

WebLLM Chrome 拡張機能のスクリーンショット。
WebLLM Chrome 拡張機能。

新しいアダプタ情報属性

ユーザーが chrome://flags/#enable-webgpu-developer-features で「WebGPU デベロッパー機能」フラグを有効にしている場合、requestAdapterInfo() を呼び出すと、標準以外の d3dShaderModel アダプター情報属性と vkDriverVersion アダプター情報属性が使用できるようになりました。サポートされている場合:

  • d3dShaderModel は、サポートされている最大の D3D シェーダー モデル番号です。たとえば、値 62 は、現在のドライバが HLSL SM 6.2 をサポートしていることを示します。ドキュメント問題 dawn:1254 をご覧ください。

  • vkDriverVersion は、ベンダーが指定した Vulkan ドライバのバージョン番号です。ドキュメントissue chromium:327457605 をご覧ください。

アダプター情報に vkDriverVersion が表示されている https://webgpureport.org のスクリーンショット。
アダプタ情報 vkDriverVersionhttps://webgpureport.org に表示)

バグの修正

layout: "auto" を使用して一致する bindgroup を持つ 2 つのパイプラインを作成し、最初のパイプラインで bindgroup を作成して 2 番目のパイプラインで使用すると、GPUValidationError がスローされるようになりました。許可されていたのは実装バグであり、適切なテストによって修正されました。問題 dawn:2402 をご覧ください。

Dawn の更新

Dawn API で、wgpuDeviceSetUncapturedErrorCallback で設定されたキャプチャされていないエラー コールバックが、GPU デバイスが失われた後に呼び出されなくなりました。この修正により、Dawn は JavaScript API 仕様と Blink の実装に準拠するようになりました。問題 dawn:2459 をご覧ください。

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

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