发布时间: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_SRC
、COPY_DST
、TEXTURE_BINDING
、RENDER_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::Adapter
和 wgpu::Device
中的 EnumerateFeatures(FeatureName * features)
方法,转为使用 GetFeatures(SupportedFeatures * features)
。请参阅问题 368672123。
webgpu.h C API 已将所有 char const *
更改为 WGPUStringView
结构,该结构定义了 UTF-8 编码字符串的视图。它充当指向字符串数据的指针,并附带长度。这样一来,您就可以处理字符串的部分内容,而无需复制该字符串。请参阅问题 42241188。
这仅涵盖了部分重要亮点。查看详尽的提交列表。
WebGPU 的新变化
WebGPU 新变化系列中涵盖的所有内容的列表。
Chrome 140
- 设备请求消耗适配器
- 使用纹理视图时使用纹理的简写形式
- WGSL textureSampleLevel 支持一维纹理
- 弃用 bgra8unorm 只读存储纹理用法
- 移除了 GPUAdapter isFallbackAdapter 属性
- Dawn 更新
Chrome 139
Chrome 138
Chrome 137
- 使用纹理视图进行 externalTexture 绑定
- 复制缓冲区,但不指定偏移量和大小
- 使用指向原子变量的指针的 WGSL workgroupUniformLoad
- GPUAdapterInfo powerPreference 属性
- 移除 GPURequestAdapterOptions compatibilityMode 属性
- Dawn 更新
Chrome 136
Chrome 135
- 允许创建具有 null bind 组布局的流水线布局
- 允许视口超出渲染目标边界
- 更轻松地访问 Android 上的实验性兼容性模式
- 移除 maxInterStageShaderComponents 限制
- Dawn 更新
Chrome 134
Chrome 133
- 新增了 unorm8x4-bgra 和 1 分量顶点格式
- 允许请求具有未定义值的未知限制
- WGSL 对齐规则变更
- 使用 discard 提高 WGSL 性能
- 针对外部纹理使用 VideoFrame displaySize
- 使用 copyExternalImageToTexture 处理具有非默认方向的图片
- 改善开发者体验
- 启用与 featureLevel 的兼容模式
- 清理实验性子群组功能
- 弃用 maxInterStageShaderComponents 限制
- Dawn 更新
Chrome 132
- 纹理视图使用情况
- 32 位浮点纹理混合
- GPUDevice adapterInfo 属性
- 使用无效格式配置画布上下文时抛出 JavaScript 错误
- 纹理的过滤采样器限制
- 扩展子群组实验
- 改善开发者体验
- 实验性支持 16 位归一化纹理格式
- Dawn 更新
Chrome 131
- 剪裁 WGSL 中的距离
- GPUCanvasContext getConfiguration()
- 点和线图元不得具有深度偏移
- 子群组的包含性扫描内置函数
- 对多重绘制间接调用的实验性支持
- 着色器模块编译选项 strict math
- 移除 GPUAdapter requestAdapterInfo()
- Dawn 更新
Chrome 130
Chrome 129
Chrome 128
Chrome 127
Chrome 126
Chrome 125
Chrome 124
Chrome 123
Chrome 122
Chrome 121
- 在 Android 上支持 WebGPU
- 在 Windows 上使用 DXC 而不是 FXC 进行着色器编译
- 计算和渲染通道中的时间戳查询
- 着色器模块的默认入口点
- 支持将 display-p3 用作 GPUExternalTexture 色彩空间
- 内存堆信息
- Dawn 更新
Chrome 120
Chrome 119
Chrome 118
Chrome 117
Chrome 116
- WebCodecs 集成
- 由 GPUAdapter
requestDevice()
返回的丢失设备 - 如果调用了
importExternalTexture()
,则保持视频播放流畅 - 规范一致性
- 改善开发者体验
- Dawn 更新
Chrome 115
Chrome 114
Chrome 113
- 在
importExternalTexture()
中使用 WebCodecs VideoFrame 来源