WebGPU 的新变化 (Chrome 116)

François Beaufort
François Beaufort

WebCodecs 集成

WebGPU 公开了一个 API,用于创建从 HTMLVideoElementimportExternalTexture() 的不透明“外部纹理”对象。您可以使用这些对象高效地对视频帧进行采样(可能直接从 YUV 颜色模型数据中以 0 复制的方式进行采样)。

不过,初始 WebGPU 规范不允许通过 WebCodecs VideoFrame 对象创建 GPUExternalTexture 对象。对于已经在使用 WebCodecs 并希望将 WebGPU 集成到视频处理流水线中的高级视频处理应用,此功能非常重要。WebCodecs 集成增加了对使用 VideoFrame 作为 GPUExternalTexturecopyExternalImageToTexture() 调用的来源的支持。请参阅以下示例以及 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(),则确保视频播放流畅

使用 HTMLVideoElement 调用 importExternalTexture() 时,如果视频在视口中不可见,相关联的视频播放便不会再受限。请参阅问题 chromium:1425252

规范一致性

GPUPipelineError() 构造函数中的 message 参数是可选的。请参阅更改 chromium:4613967

如果 WGSL 源 code 包含 \0,则调用 createShaderModule() 时会触发错误。请参阅问题 dawn:1345

使用 createSampler() 对纹理进行采样时使用的默认最大细节级别 (lodMaxClamp) 为 32。请参阅更改 chromium:4608063

改善开发者体验

当开发者在不受支持的平台上使用 WebGPU 时,开发者工具 JavaScript 控制台中会显示一条消息来提醒开发者。请参阅更改 chromium:4589369

getMappedRange() 失败时,缓冲区验证错误消息会立即显示在开发者工具 JavaScript 控制台中,而不会强制开发者向队列发送命令。请参阅更改 chromium:4597950

显示缓冲区验证错误消息的开发者工具 JavaScript 控制台的屏幕截图。
开发者工具 JavaScript 控制台中的缓冲区验证错误消息。

黎明动态

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 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