WebGPU(Chrome 133)中的新变化

François Beaufort
François Beaufort

Published: January 29, 2025

新增 unorm8x4-bgra 和 1 分量顶点格式

新增了 "unorm8x4-bgra" 顶点格式和以下 1 分量顶点格式:"uint8""sint8""unorm8""snorm8""uint16""sint16""unorm16""snorm16""float16"。 使用 "unorm8x4-bgra" 顶点格式可以更方便地加载 BGRA 编码的顶点颜色,同时保留相同的着色器。此外,使用 1 分量顶点格式时,您只需请求必要的数据,而之前对于 8 位和 16 位数据类型,至少需要请求两倍的数据。请参阅 chromestatus 条目问题 376924407

允许使用未定义的值请求未知限制

为了使 WebGPU API 在发展过程中不那么脆弱,您现在可以在请求 GPU 设备时使用 undefined 值请求未知限制。例如,在以下应用代码中,如果 someLimit 不再存在,则 adapter.limits.someLimit 可以是 undefined。请参阅规范 PR 4781

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL 对齐规则变更

现在,您无法为结构体成员提供过小的对齐值,因为现在要求 @align(n) 除以 RequiredAlignOf。这项重大变更简化了 WGSL 语言的使用,并使其与 Firefox 和 Safari 更加兼容。您可以在规范 PR中找到显示 Tint、Naga 和 WebKit 编译器之间差异的示例代码。

使用 discard 提升 WGSL 性能

由于在渲染复杂的屏幕空间反射 (SSR) 效果时观察到性能显著下降,因此 discard 语句 的实现使用平台提供的语义来降级为辅助调用(如果可用)。这提升了使用 discard 的着色器的性能。请参阅问题 372714384

将 VideoFrame displaySize 用于外部纹理

根据 WebGPU 规范,在导入 VideoFrame 时,应将 displayWidthdisplayHeight 尺寸用作 GPUExternalTexture 的显示大小。但是,系统错误地使用了可见大小,导致在尝试对 GPUExternalTexture 使用 textureLoad() 时出现问题。该问题现已解决。请参阅问题 377574981

使用 copyExternalImageToTexture 处理具有非默认方向的图片

copyExternalImageToTexture() GPUQueue 方法用于将图片或画布的内容复制到纹理中。现在,它可以正确处理具有非默认方向的图片。之前,如果来源是具有 imageOrientation "from-image" 的 ImageBitmap 或具有非默认方向的图片,则不会出现这种情况。请参阅问题 384858956

提升开发者体验

adapter.limits 显示较高的值时,您可能会感到意外,但您没有意识到在请求 GPU 设备时需要明确请求更高的限制。如果不这样做,可能会导致日后意外达到限制。

为了帮助您,我们扩展了错误消息,其中包含提示,告知您在调用 requestDevice() 时,如果 requiredLimits 中未指定任何限制,则需要明确请求更高的限制。请参阅问题 42240683

以下示例向您展示了在创建大小超出默认最大缓冲区空间设备限制的 GPU 缓冲区时,开发者工具控制台中记录的改进后的出错提示。

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

使用 featureLevel 启用兼容模式

现在,您可以通过将标准化 featureLevel 选项设置为 "compatibility",在 实验性兼容模式 下请求 GPU 适配器。只允许使用 "core"(默认)和 "compatibility" 字符串值。请参阅以下示例和 规范 PR 4897

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel 选项取代了非标准化 compatibilityMode 选项,而非标准化 featureLevel 属性取代了 isCompatibilityMode 属性。

由于它仍处于实验阶段,因此您现在需要使用 chrome://flags/#enable-unsafe-webgpu 中的“Unsafe WebGPU Support”标志运行 Chrome。您可以访问 webgpureport.org 试用一下。

清理实验性子群组功能

移除了已废弃的 "chromium-experimental-subgroups""chromium-experimental-subgroup-uniform-control-flow" 实验性子群组功能。请参阅问题 377868468

现在,在进行子群组实验时,您只需要 "subgroups" 实验性功能。"subgroups-f16" 实验性功能已废弃,即将移除。当您的应用同时请求 "shader-f16""subgroups" 功能时,您可以将 f16 值与子群组搭配使用。请参阅问题 380244620

废弃 maxInterStageShaderComponents 限制

由于以下多种因素,maxInterStageShaderComponents 限制已废弃:

  • maxInterStageShaderVariables 冗余:此限制已用于类似目的,即控制着色器阶段之间传递的数据量。
  • 细微差异:虽然这两个限制的计算方式略有不同,但这些差异很小,可以在 maxInterStageShaderVariables 限制内有效管理。
  • 简化:移除 maxInterStageShaderComponents 可简化着色器接口,并降低开发者的复杂性。开发者无需管理两个略有不同的单独限制,而是可以专注于名称更恰当且更全面的 maxInterStageShaderVariables

我们的目标是在 Chrome 135 中将其完全移除。请参阅废弃意向问题 364338810

Dawn 更新

您可以使用 wgpu::Device::GetAdapterInfo(adapterInfo) 直接从 wgpu::Device 获取适配器信息。请参阅问题 376600838

WGPUProgrammableStageDescriptor 结构体已重命名为 WGPUComputeState,以使计算状态与顶点和片段状态保持一致。请参阅问题 379059434

移除了 wgpu::VertexStepMode::VertexBufferNotUsed 枚举值。现在,可以使用 {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} 表示未使用的顶点缓冲区布局。请参阅问题 383147017

这仅涵盖了一些主要亮点。如需查看完整的提交列表,请点击此处。

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