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.

Service Worker 和 Shared Worker 支持

Chrome 中的 WebGPU 将 Web 工作器支持提升到了新的水平,现在同时支持服务工作器共享工作器。您可以使用服务工作器来增强后台任务和离线功能,并使用共享工作器在脚本之间高效共享资源。请参阅问题 chromium:41494731

您可以查看 Chrome 扩展程序示例WebLLM Chrome 扩展程序,了解如何在扩展程序服务工作线程中使用 WebGPU。

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,现在已通过适当的测试修复。请参阅问题 dawn:2402

Dawn 更新

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

这仅涵盖了部分重要亮点。查看详尽的提交列表

WebGPU 的新变化

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

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