WebGPU(Chrome 132)中的新变化

François Beaufort
François Beaufort

Published: January 8, 2025

纹理视图使用情况

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 之外的其他信息。

为了解决此问题,GPUAdapterInfo 现在可以通过 GPUDevice adapterInfo 属性公开。这些属性与现有的 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 错误

以前,将无效的纹理格式与 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 更新

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

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

这仅涵盖了一些主要亮点。如需查看提交的完整列表,请点击此处。

WebGPU 的新变化

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

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

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