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

François Beaufort
François Beaufort

Дата публикации: 26 мая 2025 г.

Используйте представление текстуры для привязки externalTexture

Теперь при создании GPUBindGroup вместо привязки GPUExternalTexture можно использовать совместимый GPUTextureView (2D, один подресурс).

Это упрощает логику шейдеров в конвейерах видеоэффектов, где необходимо обрабатывать как GPUExternalTexture (для исходного видео), так и GPUTextureView (для промежуточной обработки). Кроме того, это позволяет избежать динамической компиляции шейдеров в зависимости от того, откуда поступает текстура. Подробнее о намерении реализовать WebGPU: GPUTextureView для привязки externalTexture…

const texture = myDevice.createTexture({
  size: [42, 42],
  format: navigator.gpu.getPreferredCanvasFormat(),
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

const code = `
@group(0) @binding(0) var texture : texture_external;
@group(0) @binding(1) var<storage, read_write> buffer: vec2u;
    
@compute @workgroup_size(1) fn main() {
  buffer = textureDimensions(texture);
}`;

const pipeline = myDevice.createComputePipeline({
  layout: "auto",
  compute: { module: myDevice.createShaderModule({ code }) },
});

const bindGroup = myDevice.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    { binding: 0, resource: texture.createView() }, // Use texture view for an externalTexture binding
    { binding: 1, resource: { buffer: myBuffer } },
  ],
});

Копирование буферов без указания смещений и размера

Новая перегрузка метода GPUCommandEncoder позволяет разработчикам опускать параметры смещения и размера при использовании copyBufferToBuffer(), чтобы упростить копирование целых буферов. Подробнее о намерении реализовать перегрузку copyBufferToBuffer в WebGPU…

const size = 42;
const srcBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
const dstBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});

// Copy entire buffer.
myCommandEncoder.copyBufferToBuffer(srcBuffer, dstBuffer);

// This is the same as the following.
// myCommandEncoder.copyBufferToBuffer(srcBuffer, 0, dstBuffer, 0, size);

WGSL: workgroupUniformLoad с использованием указателя на атомарную переменную

В WGSL добавлен новый вариант перегрузки оператора workgroupUniformLoad(ptr) для удобства разработчиков. Атомарно загружает значение, на которое указывает ptr, и возвращает его всем вызовам в рабочей группе, где ptr – это указатель на атомарную переменную в рабочей группе. Подробнее об ошибке 408241039…

@group(0) @binding(0) var<storage, read_write> buffer : array<u32, 1>;

var<workgroup> wgvar : atomic<u32>;

@compute @workgroup_size(1, 1)
fn main(@builtin(local_invocation_index) lid: u32) {
  if (lid == 0) {
    atomicStore(&(wgvar), 42u);
  }
  buffer[lid] = workgroupUniformLoad(&wgvar);
}

Атрибут powerPreference для GPUAdapterInfo

Нестандартный строковый атрибут powerPreference GPUAdapterInfo теперь доступен, если пользователь включил флаг "Функции разработчика WebGPU" на странице chrome://flags/#enable-webgpu-developer-features. Если поддерживается, значение powerPreference может быть "low-power" или "high-performance" в зависимости от значения GPUPowerPreference, которое использовалось в GPURequestAdapterOptions. Подробнее о CL 6438860…

function checkPowerPreferenceForGpuDevice(device) {
  const powerPreference = device.adapterInfo.powerPreference;
  if (powerPreference === "high-performance") {
    // High-performance GPU detected. Enabling enhanced graphics settings.
  } else if (powerPreference === "low-power") {
    // Low-power GPU detected. Optimizing for battery life.
  }
}

Удаление атрибута compatibilityMode из GPURequestAdapterOptions

Экспериментальный атрибут GPURequestAdapterOptions compatibilityMode был удален. Вместо него теперь используется стандартизированный атрибут featureLevel, добавленный в Chrome 133. Подробнее о проблеме 366151404…

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

Разработчики могут создавать проекты WebGPU на таких языках, как C++, используя webgpu.h для таргетинга как на WebAssembly, так и на определенные платформы. В недавно выпущенной библиотеке Dawn "emdawnwebgpu" ("Emscripten Dawn WebGPU") реализован новейший стандартизированный файл webgpu.h через API браузера.

Emdawnwebgpu – это поддерживаемая ветвь встроенных привязок Emscripten (USE_WEBGPU), которые больше не поддерживаются. Все новые разработки ведутся в emdawnwebgpu, а встроенные привязки Emscripten будут удалены по мере перехода разработчиков на emdawnwebgpu. Заголовок C Emdawnwebgpu очень похож на заголовок Dawn, а встроенные привязки значительно устарели.

Скачайте emdawnwebgpu со страницы релизов Dawn на GitHub и прочитайте README.md, чтобы узнать, как его использовать. Исходные файлы можно найти в репозитории Dawn.

Полное руководство можно найти в обновленной документации Как создать приложение с помощью WebGPU.

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

Что нового в 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