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

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

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

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

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

Это упрощает логику шейдеров в конвейерах видеоэффектов, где должны обрабатываться как GPUExternalTexture (для исходного видео), так и GPUTextureView (для промежуточной обработки). Это также снижает необходимость в динамической компиляции шейдеров в зависимости от того, откуда берется текстура. См. Intent to Ship: 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() для упрощения копирования целых буферов. См. 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 workgroupUniformLoad с использованием указателя на атомарный

Для удобства разработчиков в WGSL добавлена ​​новая перегрузка workgroupUniformLoad(ptr) . Она атомарно загружает значение, на которое указывает ptr , и возвращает его всем вызовам в рабочей группе, где ptr — это указатель на атомарную переменную внутри рабочей группы. См. issue 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.
  }
}

Удалить атрибут совместимости 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's GitHub и прочтите файл README.md пакета для получения информации о том, как его использовать. Исходные файлы можно найти в репозитории Dawn .

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

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

Что нового в WebGPU

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

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