WebGPU 的新变化 (Chrome 124)

François Beaufort
François Beaufort

只读和读写存储纹理

存储纹理绑定类型允许着色器从存储纹理读取数据,而无需添加 TEXTURE_BINDING 用法,并对某些格式执行混合读取和写入操作。当 "readonly_and_readwrite_storage_textures" WGSL 语言扩展 存在于 navigator.gpu.wgslLanguageFeatures 中时,您现在可以在创建绑定组布局时将 GPUStorageTexture 访问权限设置为 "read-write""read-only"。之前,此权限仅限于 "write-only"

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

建议您使用 requires 指令 来表明可能存在不可移植性,方法是在 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 和 Shared Worker

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

请查看 Chrome 扩展程序示例WebLLM Chrome 扩展程序,了解如何在扩展程序 Service Worker 中使用 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。
适配器信息vkDriverVersion 显示在https://webgpureport.org 上。

问题修复

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

Dawn 更新

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

这仅涵盖了一些关键亮点。请查看提交的完整列表

WebGPU 的新变化

列出了“WebGPU 的新变化”系列中涵盖的所有内容。

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