WebGPU(Chrome 133)中的新变化

François Beaufort
François Beaufort

发布时间:2025 年 1 月 29 日

新增了 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 更加兼容。您可以在 spec 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 并将“不安全的 WebGPU 支持”标志设置为 chrome://flags/#enable-unsafe-webgpu。您可以访问 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,以使计算状态与顶点和 fragment 状态保持一致。请参阅问题 379059434

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

这仅涵盖了部分重要亮点。查看详尽的提交列表

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