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

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

Опубликовано: 26 мая 2025 г.

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

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

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

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() для упрощения копирования целых буферов. См. Intent to Ship: WebGPU: copyBufferToBuffer overload .

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 UniformLoad с использованием указателя на атомарную функцию

В 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 Developer Features" по адресу 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.

Экспериментальный атрибут compatibilityMode в GPURequestAdapterOptions был удален в пользу стандартизированного атрибута 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» .

Хром 144

Хром 143

Хром 142

Хром 141

Хром 140

Хром 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