WebGPU 的新变化 (Chrome 115)

François Beaufort
François Beaufort

支持的 WGSL 语言扩展

wgslLanguageFeatures 对象的 GPU 成员列出了支持的 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 上运行 Chrome 并使用 --enable-unsafe-webgpu --use-webgpu-adapter=d3d11 命令行标志在本地进行实验。请参阅问题 dawn:1705

在交流电源下默认获取独立 GPU

在双 GPU macOS 设备上,如果 requestAdapter() 时没有 powerPreference 选项,则当用户的设备使用交流电源时,系统会返回独立 GPU。否则,系统会返回集成 GPU。请参阅变更 4499307

提升开发者体验

新的开发者工具警告

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

如果 GPUBlendComponent 混合了显式成员和默认成员,也会引发警告。请参阅问题 dawn:1785

即使零大小调度和绘制有效,警告也会鼓励开发者尽可能避免使用它们。请参阅问题 dawn:1786

改进了错误消息

如果已调用 finish(),则在使用 GPUCommandEncoder 时,系统现在会提供改进的错误消息。请参阅问题 dawn:1736

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

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

minBindingSize 验证错误消息现在会报告验证失败的绑定组和绑定数量,以及缓冲区。请参阅问题 dawn:1604

改进了 mapAsync() 方法在 GPUBuffer 对象上返回的错误消息,以帮助开发者进行调试。请参阅下面的示例和问题 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 会提供更好的调试体验。请参阅问题 dawn:1784

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

如果编译失败,则记录 HLSL

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

Dawn 更新

取消设置顶点缓冲区

nullptr 而不是 wgpu::Buffer 传递给 wgpu::RenderPassEncoderwgpu::RenderBundleEncoder 上的 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。请参阅问题 dawn: 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 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