WebGPU 的新变化 (Chrome 124)

François Beaufort
François Beaufort

只读和读写存储纹理

存储纹理绑定类型允许着色器在不添加 TEXTURE_BINDING 使用量的情况下读取存储纹理,以及对某些格式执行混合读取和写入。现在,当 navigator.gpu.wgslLanguageFeatures 中存在 "readonly_and_readwrite_storage_textures" WGSL 语言扩展时,您可以在创建绑定组布局时设置对 "read-write""read-only"GPUStorageTexture 访问权限。以前,只有 "write-only" 可以执行此操作。

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

建议使用 WGSL 着色器代码顶部的 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 和共享 Worker 支持

Chrome 中的 WebGPU 让 Web 工作器支持更上一层楼,现在同时支持Service 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。
适配器信息 vkDriverVersion 显示在 https://webgpureport.org 上。

bug 修复

现在,使用 layout: "auto" 创建两个具有匹配 bindgroup 的流水线,然后使用第一个流水线创建绑定组,并在第二个流水线上使用它,现在会引发 GPUValidationError。允许该错误是一个实现 bug,现已通过适当的测试进行修复。请参阅问题 dawn:2402

黎明动态

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

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

WebGPU 的新变化

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

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