WebGPU(Chrome 132)中的新变化

François Beaufort
François Beaufort

发布时间:2025 年 1 月 8 日

TextureView 使用情况

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 错误

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