Что нового в 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_write и read для текстур хранилища, встроенные функции textureLoad() и textureStore() будут работать соответствующим образом, а новая встроенная функция textureBarrier() позволит синхронизировать доступ к памяти текстур в рабочей группе.

Рекомендуется использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью requires readonly_and_readwrite_storage_textures; в верхней части кода шейдера WGSL. Ознакомьтесь с примером ниже и проблемой 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.

Поддержка сервисных и общих работников

WebGPU в Chrome выводит поддержку веб-работников на новый уровень, теперь предлагая поддержку как сервисных работников, так и совместных работников. Файлы service worker можно использовать для улучшения фоновых задач и возможностей офлайн-режима, а файлы shared worker – для эффективного обмена ресурсами между скриптами. Подробнее о проблеме chromium:41494731…

Посмотрите пример расширения Chrome и расширение Chrome WebLLM, чтобы узнать, как использовать WebGPU в сервисном работнике расширения.

Скриншот расширения WebLLM для Chrome.
Расширение WebLLM для Chrome.

Новые атрибуты информации об адаптере

Нестандартные атрибуты информации об адаптере d3dShaderModel и vkDriverVersion теперь доступны при вызове requestAdapterInfo(), если пользователь включил флаг "Функции разработчика WebGPU" на странице chrome://flags/#enable-webgpu-developer-features. Если поддерживается:

  • d3dShaderModel – максимальный поддерживаемый номер модели шейдера D3D. Например, значение 62 указывает, что текущий драйвер поддерживает HLSL SM 6.2. Подробнее о проблеме и о ее решении…

  • vkDriverVersion – это номер версии драйвера Vulkan, указанный поставщиком. Подробнее о документации и проблеме chromium:327457605…

Скриншот сайта https://webgpureport.org с информацией об адаптере, в которой указана версия драйвера VK.
Информация об адаптере vkDriverVersion показана на сайте https://webgpureport.org.

Исправлены ошибки.

Создание двух конвейеров с совпадающими группами привязки с помощью layout: "auto", а затем создание группы привязки с первым конвейером и использование ее во втором конвейере теперь вызывает ошибку GPUValidationError. Разрешение на это было ошибкой реализации, которая теперь исправлена с помощью тестов. См. issue dawn:2402.

Обновления на рассвете

В API Dawn обратный вызов необработанной ошибки, заданный с помощью wgpuDeviceSetUncapturedErrorCallback, теперь не вызывается после потери устройства GPU. Это исправление приводит Dawn в соответствие со спецификацией JavaScript API и реализацией Blink. Подробнее об ошибке dawn:2459…

Это лишь некоторые из основных изменений. Ознакомьтесь с полным списком коммитов.

Что нового в WebGPU

Список всех тем, которые были рассмотрены в серии статей Что нового в WebGPU.

Chrome 155–156

Chrome 153–154

Chrome 151–152

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