WebGPU 的新变化 (Chrome 116)

François Beaufort
François Beaufort

WebCodecs 集成

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

不过,初始 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() 返回的丢失设备

如果 requestDevice() 上的 GPUAdapter 方法因已用于创建 GPUDevice 而失败,则现在会使用立即标记为丢失的 GPUDevice 来完成,而不是返回拒绝并返回 null 的 Promise。请参阅问题 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

规范一致性

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

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

使用 createSampler() 对纹理进行采样时使用的默认最大详细程度 (lodMaxClamp) 为 32。请参阅变更 chromium:4608063

提升开发者体验

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

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

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

Dawn 更新

disallow_unsafe_apis 调试切换开关已重命名为 allow_unsafe_apis,并将其默认设置为停用。此切换开关会禁止显示尚未被视为安全的 API 入口点或参数组合的验证错误。它对于调试可能很有用。 请参阅问题 dawn:1685

为了支持 code,移除了 wgpu::ShaderModuleWGSLDescriptor 中已废弃的 source 属性。请参阅变更 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 149-150

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