WebGPU の新機能(Chrome 116)

François Beaufort
François Beaufort

WebCodecs の統合

WebGPU は、HTMLVideoElement から importExternalTexture() を介して不透明な「外部テクスチャ」オブジェクトを作成する API を公開します。これらのオブジェクトを使用すると、動画フレームを効率的にサンプリングできます。場合によっては、ソースの YUV カラーモデル データから直接コピーなしでサンプリングできます。

ただし、初期の WebGPU 仕様では、WebCodecs VideoFrame オブジェクトから GPUExternalTexture オブジェクトを作成することはできませんでした。この機能は、すでに WebCodecs を使用しており、WebGPU を動画処理パイプラインに統合したい高度な動画処理アプリにとって重要です。WebCodecs の統合により、GPUExternalTexturecopyExternalImageToTexture() の呼び出しのソースとして VideoFrame を使用できるようになりました。次の例と chromestatus エントリをご覧ください。

// Access the GPU device.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create VideoFrame from HTMLVideoElement.
const video = document.querySelector("video");
const videoFrame = new VideoFrame(video);

// Create texture from VideoFrame.
const texture = device.importExternalTexture({ source: videoFrame });
// TODO: Use texture in bind group creation.

WebCodecs を使用した動画のアップロードの試験運用版サンプルで試してみてください。

GPUAdapter requestDevice() によって返されたデバイスが失われた

GPUAdapterrequestDevice() メソッドが、GPUDevice の作成にすでに使用されているために失敗した場合、null で拒否される Promise を返すのではなく、すぐに紛失としてマークされた GPUDevice で完了するようになりました。問題 chromium:1234617 をご覧ください。

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

// New! The promise is not rejected anymore with null.
const device2 = await adapter.requestDevice();
// And the device is immediately marked as lost.
const info = await device2.lost;

importExternalTexture() が呼び出された場合に動画再生をスムーズに保つ

importExternalTexture()HTMLVideoElement で呼び出されると、動画がビューポートに表示されていない場合でも、関連付けられた動画の再生がスロットリングされなくなります。問題 chromium:1425252 をご覧ください。

仕様への準拠

GPUPipelineError() コンストラクタの message 引数は省略可能です。変更 chromium:4613967 をご覧ください。

WGSL ソース code\0 が含まれている場合、createShaderModule() を呼び出すとエラーが発生します。問題 dawn:1345 をご覧ください。

createSampler() でテクスチャをサンプリングするときに使用されるデフォルトの最大詳細レベル(lodMaxClamp)は 32 です。変更 chromium:4608063 を参照してください。

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

サポートされていないプラットフォームで WebGPU を使用している場合、デベロッパーに注意を促すメッセージが DevTools JavaScript コンソールに表示されます。chromium:4589369 の変更を参照してください。

getMappedRange() が失敗すると、デベロッパーがコマンドをキューに送信しなくても、バッファ検証エラー メッセージが DevTools JavaScript コンソールにすぐに表示されます。chromium:4597950 の変更を参照してください。

バッファ検証エラー メッセージが表示された DevTools JavaScript コンソールのスクリーンショット。
DevTools JavaScript コンソールのバッファ検証エラー メッセージ。

Dawn のアップデート

disallow_unsafe_apis デバッグ切り替えの名前が allow_unsafe_apis に変更され、デフォルトで無効になりました。この切り替えにより、まだ安全と見なされていない API エントリ ポイントまたはパラメータの組み合わせに関する検証エラーが抑制されます。これはデバッグに役立ちます。問題 dawn:1685 をご覧ください。

非推奨の wgpu::ShaderModuleWGSLDescriptor source 属性が削除され、code に置き換えられました。変更 dawn:130321 を参照してください。

欠落していた wgpu::RenderBundle::SetLabel() メソッドが実装されました。変更 dawn:134502 を参照してください。

アプリは、wgpu::RequestAdapterOptionsBackendType オプションを使用してアダプターを取得するときに、特定のバックエンドをリクエストできます。以下の例と dawn:1875 の問題をご覧ください。

wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
backendTypeOptions.backendType = wgpu::BackendType::D3D12;

wgpu::RequestAdapterOptions options = {};
options.nextInChain = &backendTypeOptions;

// Request D3D12 adapter.
myInstance.RequestAdapter(&options, myCallback, myUserData);

スワップチェーン テクスチャの追加の使用法を含む新しい SwapChain::GetCurrentTexture() メソッドが追加され、コピーで wgpu::Texture を使用できるようになりました。以下の例と dawn:1551 を参照してください

wgpu::SwapChain swapchain = myDevice.CreateSwapChain(mySurface, &myDesc);
swapchain.GetCurrentTexture();
swapchain.Present();

ここでは、主なハイライトの一部のみを取り上げます。コミットの一覧をご覧ください。

WebGPU の新機能

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

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