Что нового в WebGPU (Chrome 153–154)

François Beaufort
François Beaufort

Дата публикации: 15 сентября 2026 г.

Расширение buffer_view для WGSL

Расширение языка WGSL buffer_view позволяет интерпретировать данные единообразной переменной, переменной хранилища или рабочей группы как несколько разных типов. Это позволяет использовать его в самых разных целях, от обычного преобразования типов до разделения переменной на несколько логических переменных.

В целях безопасности и простоты реализации доступ к переинтерпретированным типам можно получить только с помощью следующих встроенных функций:

  • bufferView<T>() интерпретирует память по определенному смещению байтов как указатель на тип T.
  • bufferArrayView<T>() создает указатель на ограниченный массив с явным количеством элементов.
  • bufferLength() возвращает размер буфера в байтах.

Расширение языка можно обнаружить в JavaScript с помощью navigator.gpu.wgslLanguageFeatures. Рекомендуется использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью requires buffer_view в начале кода шейдера WGSL. Ознакомьтесь с примером кода WGSL и намерением реализовать функцию.

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

Вы также можете ознакомиться с предложением по буферизации и примером Wireframe WebGPU.

Расширение WGSL swizzle_assignment

В ответ на многочисленные запросы сообщества мы добавили в расширение WGSL swizzle_assignment возможность напрямую обращаться к перестановкам векторных компонентов, чтобы обновлять несколько компонентов в одном операторе. Это значительно сокращает количество стандартного кода и улучшает читаемость шейдеров, а также приводит WGSL в соответствие с другими языками шейдеров.

Расширение языка можно обнаружить в JavaScript с помощью navigator.gpu.wgslLanguageFeatures. Рекомендуется использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью requires swizzle_assignment в начале кода шейдера WGSL. Ознакомьтесь с примером кода WGSL и намерением реализовать функцию.

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires swizzle_assignment;

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

Изменения в расширении WGSL

Расширение языка texture-formats-tier1, хотя и поддерживается в коде WGSL, ранее неправильно сопоставлялось с navigator.gpu.wgslLanguageFeatures (как texture_formats_tier1) в JavaScript. Проблема с сопоставлением уже устранена. Подробнее о Chromium CL 8159562…

Расширение языка subgroups теперь автоматически включается, когда в WGSL включена функция subgroup_size_control. См. проблему dawn:545285663.

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

Новая экспериментальная функция wgpu::FeatureName::BufferMapWriteExtendedUsages позволяет создать буфер с wgpu::BufferUsage::MapWrite в сочетании с любым другим wgpu::BufferUsage, кроме wgpu::BufferUsage::MapRead, чтобы записывать данные непосредственно в буфер, доступный для графического процессора, устраняя промежуточный буфер и дополнительное копирование на серверах Vulkan и D3D12. Подробную информацию можно найти в разделе Расширенное использование буфера записи карты и в описании проблемы dawn:386255678.

Теперь вы можете использовать привязки webgpu_cpp.h поверх любой реализации webgpu.h, а не только в Dawn, с помощью нового webgpu_upstream_cpp_headers. Подробнее об ошибке 596 в webgpu-headers…

Для Dawn теперь требуется macOS 13.0 или более поздней версии. Подробнее о Dawn CL 334415…

Это лишь некоторые из основных изменений. Подробную информацию можно найти в списке изменений.

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