WebGPU 中的新变化(Chrome 144)

François Beaufort
François Beaufort

发布时间:2026 年 1 月 7 日

WGSL subgroup_id 扩展

借助 WGSL 语言扩展程序 subgroup_id,您可以在启用 subgroups 扩展程序后,在工作组中使用以下新的内置值:

  • subgroup_id:提供当前工作组内调用子组的 ID。
  • num_subgroups:报告工作组中存在的子组数量。

以前,若要使用子群组调用 ID 为内存编制索引,您必须重建子群组 ID(通常通过 原子操作),以避免内存访问重叠。现在,您可以使用 subgroup_id 来填充等式的另一半。由于 D3D 后端尚不支持此功能,因此在此处进行了模拟。将 local_invocation_index 等效为 subgroup_invocation_id + subgroup_size * subgroup_id 应该是安全的。请注意,在某些情况下,子群组可能未满员。

可以使用 navigator.gpu.wgslLanguageFeatures 检测此语言扩展功能。建议在 WGSL 着色器代码的顶部使用 requires 指令来表明 requires subgroup_id; 可能存在不兼容问题。请参阅以下示例和发货意向

if (!navigator.gpu.wgslLanguageFeatures.has("subgroup_id")) {
  throw new Error(`WGSL subgroup_id and num_subgroups built-in values are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
const device = await adapter.requestDevice({ requiredFeatures: ["subgroups"] });

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;
  requires subgroup_id;

  @compute @workgroup_size(64, 1, 1)
  fn main(@builtin(subgroup_id) subgroup_id : u32,
          @builtin(num_subgroups) num_subgroups : u32) {
    // TODO: Use subgroup_id and num_subgroups values.
  }`,
});

WGSL uniform_buffer_standard_layout 扩展程序

WGSL 语言扩展程序 uniform_buffer_standard_layout 使统一缓冲区能够使用与存储缓冲区相同的内存布局限制,从而更轻松地在两种缓冲区中共享数据结构。这意味着,统一缓冲区不再需要对数组元素进行 16 字节对齐,也不再需要将嵌套结构偏移量填充为 16 字节的倍数。

可以使用 navigator.gpu.wgslLanguageFeatures 检测此语言扩展功能。建议在 WGSL 着色器代码的顶部使用 requires 指令来表明 requires uniform_buffer_standard_layout; 可能存在不兼容问题。请参阅以下示例和发货意向

if (!navigator.gpu.wgslLanguageFeatures.has("uniform_buffer_standard_layout")) {
  throw new Error(`WGSL uniform buffer standard layout is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires uniform_buffer_standard_layout;

  struct S {
      x: f32
  }
  struct Uniforms {
      a: S,
      b: f32
      // b is at offset 4. Without standard layout, alignment rules would
      // force b to be at offset 16 (or a multiple of 16), and you would have
      // to add extra fields or use an @align attribute.
  }

  @group(0) @binding(0) var<uniform> u: Uniforms;

  @fragment fn fs_main() -> @location(0) vec4<f32> {
      return vec4<f32>(u.a.x);
  }`,
});

Linux 上的 WebGPU

Chrome 团队正在谨慎地为 Linux 推出 WebGPU,首先支持 Intel Gen12+ GPU,但计划将其扩展到更多设备(AMD、NVIDIA)。此实现采用的架构是 WebGPU 使用 Vulkan,而 Chromium 的其余部分仍使用 OpenGL,从而利用现有的已知良好代码路径。请参阅问题 442791440

更快的 writeBuffer 和 writeTexture

writeBuffer()writeTexture() 在 Chrome 中得到了优化,因此性能提升高达 2 倍(具体取决于所传输数据的大小),优于之前的版本。此变更也会影响 Dawn Wire 实现的所有用户。请参阅问题 441900745

“黎明”更新

Android GPU 团队已发布 第一个 Alpha 版的 Kotlin 绑定,用于在 Android 上使用 Jetpack 的 WebGPU。androidx.webgpu 软件包让 Android 开发者能够使用 Kotlin 访问现代 GPU API,从而绕过 OpenGL 的旧版问题或 Vulkan 的复杂性,这对于生态系统来说是一项令人兴奋的开发!

以下仅介绍了一些关键亮点。查看详尽的提交列表

WebGPU 最新动态

WebGPU 的新变化系列中涵盖的所有内容。

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