WebGPU 的新变化 (Chrome 124)

François Beaufort
François Beaufort

只读和读写存储纹理

存储纹理绑定类型允许着色器在不增加 TEXTURE_BINDING 用法的情况下从存储纹理中读取数据,并针对特定格式执行混合读写操作。当 navigator.gpu.wgslLanguageFeatures 中存在 "readonly_and_readwrite_storage_textures" WGSL 语言扩展时,您现在可以在创建绑定组布局时将 GPUStorageTexture 访问权限设置为 "read-write""read-only"。之前,只有 "write-only" 可以使用。

然后,WGSL 着色器代码可以对存储纹理使用 read_writeread 访问限定符,textureLoad()textureStore() 内置函数会相应地运行,并且新的 textureBarrier() 内置函数可用于同步工作组中的纹理内存访问。

建议在 WGSL 着色器代码顶部使用 requires-directive 来指明 requires readonly_and_readwrite_storage_textures; 可能无法移植。请参阅以下示例和问题 dawn:1972

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

const shaderModule = device.createShaderModule({ code: `
  requires readonly_and_readwrite_storage_textures;

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

服务工件和共享工件支持

Chrome 中的 WebGPU 将 Web Worker 的支持更上一层楼,现在可为 Service Worker共享 Worker 提供支持。您可以使用服务工件来增强后台任务和离线功能,并使用共享工作器在脚本之间高效共享资源。请参阅问题 chromium:41494731

如需了解如何在扩展程序 Service Worker 中使用 WebGPU,请查看 Chrome 扩展程序示例WebLLM Chrome 扩展程序

WebLLM Chrome 扩展程序的屏幕截图。
WebLLM Chrome 扩展程序。

新的适配器信息属性

如果用户在 chrome://flags/#enable-webgpu-developer-features 上启用了“WebGPU 开发者功能”标志,那么现在在调用 requestAdapterInfo() 时,即可使用非标准的 d3dShaderModelvkDriverVersion 适配器信息属性。支持时:

  • d3dShaderModel 是支持的最大 D3D 着色器模型编号。例如,值 62 表示当前驱动程序支持 HLSL SM 6.2。请参阅文档问题 dawn:1254

  • vkDriverVersion 是供应商指定的 Vulkan 驱动程序的版本号。请参阅文档问题 chromium:327457605

https://webgpureport.org 的屏幕截图,其中显示了适配器信息中的 vkDriverVersion。
https://webgpureport.org 上显示的适配器信息 vkDriverVersion

问题修复

现在,使用 layout: "auto" 创建两个具有匹配绑定组的流水线,然后使用第一个流水线创建绑定组,并将其用于第二个流水线,会引发 GPUValidationError。允许这样做是一个实现 bug,现在已通过适当的测试修复。请参阅 issue dawn:2402

Dawn 更新

在 Dawn API 中,现在在 GPU 设备丢失后,系统不会调用使用 wgpuDeviceSetUncapturedErrorCallback 设置的未捕获错误回调。此修复使 Dawn 与 JavaScript API 规范和 Blink 的实现保持一致。请参阅问题 dawn:2459

本文仅介绍了一些主要亮点。查看详尽的提交内容列表

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