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

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

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

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

В настоящее время представления текстур GPU наследуют все флаги использования из исходной текстуры GPU. Это может быть проблематично, поскольку некоторые форматы представления несовместимы с определенными использованиями. Чтобы решить эту проблему, вызов createView() с необязательным членом usage позволяет явно указать подмножество флагов использования исходной текстуры, совместимых с выбранным форматом представления.

Это изменение позволяет проводить предварительную проверку и более детальный контроль над тем, как используется представление. Оно также соответствует другим графическим API, где флаги использования являются общими параметрами при создании представления, предлагая возможности оптимизации.

См. следующий фрагмент, запись chromestatus и проблему 363903526 .

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

Смешивание 32-битных плавающих текстур

32-битные текстуры с плавающей точкой необходимы для HDR-рендеринга, чтобы сохранить широкий диапазон цветовых значений и предотвратить артефакты цветовых полос. Например, в научной визуализации.

Новая функция GPU "float32-blendable" делает текстуры GPU с форматами "r32float" , "rg32float" и "rgba32float" смешиваемыми. Создание конвейера рендеринга, использующего смешивание с любым вложением формата float32, теперь возможно при запросе устройства GPU с этой функцией.

См. следующий фрагмент, запись chromestatus и проблему 369649348 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

Атрибут GPUDevice adapterInfo

Для библиотек, которые принимают предоставленные пользователем объекты GPUDevice важно получить доступ к информации о физическом GPU, поскольку им может потребоваться оптимизировать или реализовать обходные пути на основе архитектуры GPU. Хотя можно получить доступ к этой информации через объект GPUAdapter , нет прямого способа получить ее только из GPUDevice . Это может быть неудобно, поскольку может потребоваться, чтобы пользователи предоставляли дополнительную информацию вместе с GPUDevice .

Для решения этой проблемы GPUAdapterInfo теперь отображается через атрибут GPUDevice adapterInfo . Они похожи на существующий атрибут info GPUAdapter .

См. следующий фрагмент, запись chromestatus и проблему 376600838 .

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

Настройка контекста холста с недопустимым форматом приводит к ошибке JavaScript

Ранее использование недопустимого формата текстуры с методом configure() контекста холста GPU приводило к ошибке проверки GPU. Это было изменено для вызова JavaScript TypeError . Это предотвращает сценарии, в которых getCurrentTexture() возвращает допустимую текстуру GPU, несмотря на то, что контекст холста GPU был настроен неправильно. Более подробную информацию можно найти в issue 372837859 .

Фильтрация ограничений сэмплера на текстуры

Использование текстур формата "sint" , "uint" и " depth" с фильтрующими образцами ранее было разрешено. Теперь он корректно запрещает использование текстур формата "sint" или "uint" с фильтрующим сэмплером. Обратите внимание, что в настоящее время он выдает предупреждение, если вы используете текстуру " depth" с фильтрующим сэмплером, так как в будущем это будет запрещено. См. проблему 376497143 .

Эти ограничения означают, что использование текстуры глубины с нефильтрующим сэмплером требует ручного создания макетов групп привязок. Это связано с тем, что "автоматически" сгенерированные макеты групп привязок пока не поддерживают эту комбинацию. В спецификации 4952 содержится предложение, находящееся на рассмотрении, по устранению этого ограничения в будущем.

Расширенные эксперименты с подгруппами

Эксперимент подгрупп , изначально запланированный на Chrome 131, был продлен до Chrome 133, завершившись 16 апреля 2025 года. Хотя первый пробный запуск Origin был сосредоточен на производительности, в нем отсутствовали важные гарантии переносимости . Теперь эти гарантии будут добавлены, что может привести к ошибкам в существующем коде.

Улучшение опыта разработчиков

Предупреждение теперь отображается в DevTools, когда опция powerPreference используется с requestAdapter() в Windows. Это предупреждение будет удалено, когда Chrome узнает, как использовать два разных GPU и объединить результаты между ними. См. issue 369219127 .

Размер буфера GPU теперь присутствует в сообщении об ошибке при создании буфера GPU слишком большого размера. См. проблему 374167798 .

Экспериментальная поддержка 16-битных нормализованных форматов текстур

16-битные нормализованные со знаком и нормализованные без знака форматы текстур теперь доступны экспериментально в рамках функций графического процессора "chromium-experimental-snorm16-texture-formats" и "chromium-experimental-unorm16-texture-formats" соответственно, пока они обсуждаются для стандартизации .

Эти функции добавляют поддержку 16-битных нормализованных форматов текстур с использованием COPY_SRC , COPY_DST , TEXTURE_BINDING , RENDER_ATTACHMENT , мультисэмплингом и возможностями разрешения. Дополнительные форматы: "r16unorm" , "rg16unorm" , " "rgba16unorm" , "r16snorm" , "rg16snorm" и "rgba16snorm" .

Пока эти экспериментальные функции не будут стандартизированы, включите флаг «Поддержка небезопасного WebGPU» на chrome://flags/#enable-unsafe-webgpu чтобы сделать их доступными в Chrome.

См. следующий фрагмент и проблему 374790898 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

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

Методы EnumerateFeatures(FeatureName * features) из wgpu::Adapter и wgpu::Device устарели в пользу использования GetFeatures(SupportedFeatures * features) . См. issue 368672123 .

API webgpu.h C изменил все char const * на структуру WGPUStringView , которая определяет представление в строке в кодировке UTF-8. Она действует как указатель на данные строки, связанные с длиной. Это позволяет работать с частями строки без необходимости ее копирования. См. issue 42241188 .

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

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