WebGPU 的新变化 (Chrome 128)

François Beaufort
François Beaufort

对子群组进行实验

子组功能可实现 SIMD 级别的并行处理,从而允许组内的线程进行通信并执行集数学运算(例如,计算 16 个数字的总和)。这提供了一种高效的跨线程数据共享形式。

子群组提案的最小实现可在“不安全的 WebGPU 支持”后面进行本地测试标志位于 chrome://flags/#enable-unsafe-webgpu

您还可以注册参与源试用,邀请真实用户在您的网站上试用子群组。如需了解如何准备您的网站以使用源试用,请参阅开始试用。源试用将从 Chrome 128 到 Chrome 131(截至 2025 年 2 月 19 日)运行。请参阅实验目的

GPUAdapter 中提供 "subgroups" 功能时,请求具有此功能的 GPUDevice 以获取 WGSL 中的子群组支持,并检查其 minSubgroupSizemaxSubgroupSize 限制。

您还需要在 WGSL 代码中使用 enable subgroups; 明确启用此扩展。启用后,您将可以访问以下附加内容:

  • subgroup_invocation_id:子组中线程的索引的内置值。
  • subgroup_size:用于访问子组大小的内置值。
  • subgroupBallot(value):返回一组位字段,如果对于该有效调用,value 为 true,则 subgroup_invocation_id 对应的位为 1,否则为 0。
  • subgroupBroadcast(value, id):将调用中的 value(其中 subgroup_invocation_idid 匹配)广播到子组中的所有调用。注意:id 必须是编译时常量。

未来我们将添加更多内置函数,例如 subgroupAddsubgroupAllsubgroupElectsubgroupShuffle。请参阅问题 354738715

若要允许在子群组操作中使用 f16,请请求具有 "subgroups""subgroups-f16""shader-f16" 功能的 GPUDevice,然后使用 enable f16, subgroups, subgroups_f16; 在您的 WGSL 代码中启用它。

以下代码段提供了一个基础来改进和发现子群组的潜力。

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

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

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

弃用了为线和点设置深度偏差

当渲染流水线的拓扑是线或点类型时,WebGPU 规范变更会使将 depthBiasdepthBiasSlopeScaledepthBiasClamp 设置为非零值成为验证错误。为了让开发者有足够的时间来更新其代码,在开发者工具控制台中显示有关即将进行的验证的警告,同时在这些情况下还会将值设置为 0。请参阅问题 352567424

如果阻止默认,则隐藏开发者工具警告中未捕获的错误

在开发者工具控制台中,如果注册了 uncapturederror 的事件监听器并在事件监听器回调中调用了事件 preventDefault() 方法,系统将不再显示针对 uncapturederror 事件的警告。此行为与 JavaScript 中的事件处理一致。请参阅以下示例和问题 40263619

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

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL 先内插采样,然后

通过 WGSL interpolate 属性,您可以管理用户定义的 IO 数据插值。现在,新的插值采样参数 first(默认)和 either 可让您进行额外的控制:first 使用基元第一个顶点的值,而 either 允许使用第一个或最后一个顶点。请参阅问题 340278447

Dawn 最新动态

Dawn 用于处理异步操作的 WGPUFuture 现已实现完毕。关键概念包括用于机会性事件处理的 wgpuInstanceProcessEvents 和用于定义回调位置的 WGPUCallbackMode。WGPUFuture 表示生命周期无限的一次性事件,wgpuInstanceWaitAny 会等待任何 Future 完成或超时。请参阅问题 42240932

Surface::GetCapabilities() 现在不报告 CompositeAlphaMode::Auto 值。它仍然有效,等同于 Surface::GetCapabilities().alphaMode[0]。请参阅问题 292

OpenGL 后端现在支持 Surface,并为每个 Present() 调用使用 y-flip blit。请参阅问题 344814083

Adapter::GetProperties() 方法已废弃,取而代之的是 Adapter::GetInfo()

外部贡献者 Jaswant 重写了所有 CMake 文件,使其更易于更新并支持预构建。请参阅快速入门指南,了解如何在 CMake 项目中使用 Dawn。

本指南仅涵盖部分重要内容。查看详尽的提交内容列表

WebGPU 的新变化

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

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