WebGPU の新機能(Chrome 116)

François Beaufort
François Beaufort

WebCodecs の統合

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

しかし、最初の 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() が呼び出された場合に動画のスムーズな再生を維持する

HTMLVideoElementimportExternalTexture() が呼び出されると、動画がビューポートに表示されていないときは、関連する動画の再生がスロットリングされなくなります。問題 chromium:1425252 をご覧ください。

仕様の適合性

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

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

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

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

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

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

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

夜明けの更新情報

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

サポートが終了した source 属性 wgpu::ShaderModuleWGSLDescriptor が削除され、code に置き換えられました。change dawn:130321 をご覧ください。

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

アプリケーションは、wgpu::RequestAdapterOptionsBackendType オプションを使用してアダプタを取得するときに、特定のバックエンドをリクエストできます。下記の例と issue 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 をコピーで使用できます。下記の例と issue dawn:1551 をご覧ください。

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

ここでは、重要なハイライトの一部についてのみ説明します。commit の完全なリストを確認する。

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