Что нового в WebGPU (Chrome 124)

Франсуа Бофор
François Beaufort

Текстуры хранения данных, доступные только для чтения и для чтения и записи

Тип привязки текстур хранилища позволяет шейдерам читать данные из текстур хранилища без использования TEXTURE_BINDING и выполнять смешанное чтение и запись для определённых форматов. При наличии расширения языка WGSL "readonly_and_readwrite_storage_textures" в navigator.gpu.wgslLanguageFeatures теперь можно установить доступ к GPUStorageTexture как "read-write" или "read-only" при создании макета группы привязок. Ранее это было ограничено "write-only" .

Затем ваш код шейдера WGSL может использовать квалификатор доступа read_write и read для хранения текстур, встроенные функции textureLoad() и textureStore() ведут себя соответствующим образом, а для синхронизации доступа к памяти текстур в рабочей группе доступна новая встроенная функция textureBarrier() .

Рекомендуется использовать директиву require-, чтобы обозначить потенциальную непереносимость с помощью 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 выводит поддержку веб-воркеров на новый уровень, предлагая поддержку как сервис-воркеров , так и общих воркеров . Вы можете использовать сервис-воркеры для улучшения фоновых задач и возможностей автономной работы, а общие воркеры — для эффективного распределения ресурсов между скриптами. См. issue chromium:41494731 .

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

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

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

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

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

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

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

Обновления Dawn

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

Здесь рассматриваются лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком коммитов .

Что нового в WebGPU

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

Хром 139

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113