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。请参阅 spec 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 编译器之间差异的示例代码。

使用舍弃功能提升 WGSL 性能

由于在渲染复杂的屏幕空间反射 (SSR) 效果时观察到性能大幅下降,因此舍弃语句的实现会使用平台提供的语义(如果有)降级为辅助调用。这可以提高使用舍弃的着色器的性能。请参阅问题 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 中将其完全移除。请参阅废弃 intent问题 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 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