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

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

Опубликовано: 15 сентября 2026 г.

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

Расширение языка 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 позволяет напрямую записывать данные в векторные перестановки (swizzle), что дает возможность обновлять несколько компонентов в одном операторе. Это значительно сокращает количество шаблонного кода и улучшает читаемость шейдеров, приводя 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 . См. проблему webgpu-headers #596 .

Для работы Dawn теперь требуется macOS 13.0 или более поздняя версия. См. Dawn CL 334415 .

Здесь описаны лишь некоторые из ключевых моментов. Для получения более подробной информации ознакомьтесь с полным списком изменений .

Что нового в WebGPU?

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

Хром 153-154

Хром 151-152

Хром 149-150

Хром 147-148

Хром 146

Хром 145

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