WebGPU 的新变化 (Chrome 115)

François Beaufort
François Beaufort

支持的 WGSL 语言扩展

GPU 对象的 wgslLanguageFeatures 成员列出了支持的 WGSL 语言扩展的名称。系统会自动启用受支持的 WGSL 语言扩展,因此您无需明确请求。此列表目前为空,但您预计将来会看到很多此类事件(例如 do-while loops)。请参阅问题 dawn:1777。

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

对 Direct3D 11 的实验性支持

Chromium 团队正在努力为 Direct3D 11 添加 WebGPU 支持。现在,您可以通过在 Windows 上使用 --enable-unsafe-webgpu --use-webgpu-adapter=d3d11 命令行标志运行 Chrome,在本地对其进行实验。请参阅问题 dawn:1705

在使用交流电源时,默认获取独立显卡

在双 GPU macOS 设备上,如果调用 requestAdapter() 时未指定 powerPreference 选项,则在用户设备使用交流电源时,系统会返回独立显卡。否则,系统会返回集成 GPU。请参阅更改 4499307

改进开发者体验

新的 DevTools 警告

如果在 GPUExtend3DDict 中使用 depth 键,开发者工具控制台中会显示一条警告,因为正确的键是 depthOrArrayLayers。请参阅问题 chromium:1440900

如果 GPUBlendComponent 同时包含显式成员和默认成员,系统也会发出警告。请参阅问题 dawn:1785

虽然大小为零的调度和绘制是有效的,但系统会发出警告,提示开发者尽可能避免使用它们。请参阅问题 dawn:1786

改进了错误消息

现在,如果已调用 finish(),使用 GPUCommandEncoder 时会提供经过改进的错误消息。请参阅 issue dawn:1736

提交包含已销毁对象的命令缓冲区时,错误消息中现在会显示在 submit() 中使用的命令缓冲区的标签。请参阅问题 dawn:1747

现在,在验证 depthStencil 时,深度模板状态的无效部分会在错误消息中指定。请参阅问题 dawn:1735

minBindingSize 验证错误消息现在会报告未通过验证的绑定的组和编号,以及缓冲区。请参阅问题 dawn:1604

改进了对 GPUBuffer 对象使用 mapAsync() 方法返回的错误消息,以便开发者在调试时获得帮助。请参阅下面的示例和问题 chromium:1431622

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

macOS 调试工具中的标签

借助 use_user_defined_labels_in_backend 调试切换开关,您可以将对象标签转发到后端,以便在 RenderDoc、PIX 或 Instruments 等平台专用调试工具中看到这些标签。从现在起,当您在 macOS 上为 debugging 启用该功能时,系统会提供更好的调试体验。请参阅 issue dawn:1784

显示来自 WebGPU 的自定义标签的 macOS 上 Instruments 应用的屏幕截图。
macOS 上 Instruments 应用中的用户定义标签。

如果编译失败,则记录 HLSL

借助 dump_shaders 调试切换开关,您可以记录输入 WGSL 着色器和转换后的后端着色器。从现在开始,如果您启用此功能以进行调试,当 HLSL 编译失败时,系统会转储 HLSL。请参阅问题 dawn:1681

Dawn 更新

未设置顶点缓冲区

通过 wgpu::RenderPassEncoderwgpu::RenderBundleEncodernullptr(而非 wgpu::Buffer)传递给 SetVertexBuffer(),您可以取消设置给定槽中之前设置的顶点缓冲区。请参阅问题 dawn:1675

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

临时附件

您可以创建附件,让渲染传递操作保留在功能块内存中,从而避免 VRAM 流量,并通过设置 wgpu::TextureUsage::TransientAttachment 用量来避免为纹理分配 VRAM。只有 Metal 和 Vulkan 支持此功能。请参阅问题“黎明:1695”

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

不使用 depot_tools 进行构建

借助新的 DAWN_FETCH_DEPENDENCIES CMake 选项,您可以使用读取 DEPS 文件的 Python 脚本提取 Dawn 依赖项,而无需依赖于它的所有项目都安装 depot_tools。请参阅更改 131750

WebGPU 中的新变化

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

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