WebGPU(Chrome 132)中的新变化

François Beaufort
François Beaufort

发布时间:2025 年 1 月 8 日

纹理视图使用情况

GPU 纹理视图目前会从其源 GPU 纹理继承所有使用标志。这可能会带来问题,因为某些视图格式与特定用途不兼容。为解决此问题,您可以使用可选的 usage 成员调用 createView(),以明确指定与所选视图格式兼容的源纹理使用标志子集。

此项变更可实现预先验证,并对视图的使用方式进行更精细的控制。它还与其他图形 API 保持一致,在这些 API 中,使用标志是视图创建中的常见参数,可提供优化机会。

请参阅以下代码段、chromestatus 条目问题 363903526

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

32 位浮点纹理混合

32 位浮点纹理对于 HDR 渲染至关重要,可保留广泛的颜色值并防止出现色带伪影。例如,在科学可视化方面。

借助新的 "float32-blendable" GPU 功能,格式为 "r32float""rg32float""rgba32float" 的 GPU 纹理可以进行混合。现在,当请求具有此功能的 GPU 设备时,可以创建使用混合的渲染流水线,该流水线具有任何 float32 格式的附件。

请参阅以下代码段、chromestatus 条目问题 369649348

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice adapterInfo 属性

对于采用用户提供的 GPUDevice 对象的库,访问有关物理 GPU 的信息非常重要,因为它们可能需要根据 GPU 架构进行优化或实现变通方案。虽然可以通过 GPUAdapter 对象访问此信息,但无法仅通过 GPUDevice 直接获取此信息。这可能会给用户带来不便,因为用户可能需要在提供 GPUDevice 的同时提供其他信息。

为了解决此问题,我们现在通过 GPUDevice adapterInfo 属性公开了 GPUAdapterInfo。这些属性与现有的 GPUAdapter info 属性类似。

请参阅以下代码段、chromestatus 条目问题 376600838

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

配置格式无效的画布上下文时抛出 JavaScript 错误

之前,如果使用 GPU 画布上下文的 configure() 方法时使用了无效的纹理格式,会导致 GPU 验证错误。此行为已更改为抛出 JavaScript TypeError。这样可以防止出现以下情况:即使 GPU 画布上下文配置不正确,getCurrentTexture() 仍返回有效的 GPU 纹理。如需了解详情,请参阅问题 372837859

纹理的过滤采样器限制

之前允许使用 "sint""uint" 和“depth" 格式纹理以及过滤样本。现在,它会正确禁止将 "sint""uint" 格式的纹理与过滤采样器搭配使用。请注意,如果您使用“带有过滤采样器的 depth" 纹理,系统目前会发出警告,因为将来会禁止这样做。请参阅问题 376497143

这些限制意味着,将深度纹理与非过滤采样器搭配使用时,需要手动创建绑定组布局。这是因为“自动”生成的绑定组布局尚不支持此组合。规范问题 4952 包含一项正在考虑的提案,旨在将来解决此限制。

扩展了子群组实验

子群组实验最初计划在 Chrome 131 中结束,现已延长至 Chrome 133,将于 2025 年 4 月 16 日结束。虽然第一个来源试用版侧重于性能,但缺少关键的可移植性保障措施。现在,我们将添加这些安全措施,这可能会导致现有代码出现错误。

改善开发者体验

现在,在 Windows 上将 powerPreference 选项与 requestAdapter() 搭配使用时,开发者工具中会显示警告。当 Chrome 知道如何使用两个不同的 GPU 并将它们的结果进行合成时,此警告将会移除。请参阅问题 369219127

现在,在创建过大的 GPU 缓冲区时,错误消息中会显示 GPU 缓冲区的大小。请参阅问题 374167798

实验性支持 16 位归一化纹理格式

16 位有符号归一化和无符号归一化纹理格式现已在 "chromium-experimental-snorm16-texture-formats""chromium-experimental-unorm16-texture-formats" GPU 功能后面以实验性方式提供,同时正在讨论标准化

这些功能增加了对 16 位归一化纹理格式的支持,并具有 COPY_SRCCOPY_DSTTEXTURE_BINDINGRENDER_ATTACHMENT 用法、多重采样和解析功能。其他格式包括 "r16unorm""rg16unorm""rgba16unorm""r16snorm""rg16snorm""rgba16snorm"

在这些实验性功能标准化之前,请在 chrome://flags/#enable-unsafe-webgpu 处启用“不安全的 WebGPU 支持”标志,以便在 Chrome 中使用这些功能。

请参阅以下代码段和问题 374790898

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

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

Dawn 更新

弃用了 wgpu::Adapterwgpu::Device 中的 EnumerateFeatures(FeatureName * features) 方法,转为使用 GetFeatures(SupportedFeatures * features)。请参阅问题 368672123

webgpu.h C API 已将所有 char const * 更改为 WGPUStringView 结构,该结构定义了 UTF-8 编码字符串的视图。它充当指向字符串数据的指针,并附带长度。这样一来,您就可以处理字符串的部分内容,而无需复制该字符串。请参阅问题 42241188

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

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