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 ディレクティブ を使用して、requires readonly_and_readwrite_storage_textures; で移植できない可能性があることを示すことをおすすめします。次の例と 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.

Service Worker と Shared Worker のサポート

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

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

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

新しいアダプター情報属性

ユーザーが chrome://flags/#enable-webgpu-developer-features で "WebGPU Developer Features" flag を有効にしている場合、requestAdapterInfo() を呼び出すと、非標準の d3dShaderModel アダプター情報属性と vkDriverVersion アダプター情報属性を使用できるようになりました。サポートされている場合:

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

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

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

バグの修正

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

Dawn の更新

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

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

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