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

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

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

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

Представления текстур графического процессора в настоящее время наследуют все флаги использования из исходной текстуры графического процессора. Это может быть проблематично, поскольку некоторые форматы представления несовместимы с определенными вариантами использования. Чтобы решить эту проблему, вызов 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-рендеринга, поскольку они позволяют сохранить широкий диапазон значений цвета и предотвратить появление артефактов цветовых полос. Например, в научной визуализации.

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

См. следующий фрагмент, запись 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...

Атрибут adapterInfo GPUDeviceInfo

Это важно для библиотек, которые используют предоставленные пользователем объекты GPUDevice для доступа к информации о физическом графическом процессоре, поскольку им может потребоваться оптимизировать или реализовать обходные пути на основе архитектуры графического процессора. Хотя доступ к этой информации можно получить через объект 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() контекста холста графического процессора приводило к ошибке проверки графического процессора. Это было изменено, чтобы выдавать TypeError JavaScript. Это предотвращает сценарии, в которых getCurrentTexture() возвращает действительную текстуру графического процессора, несмотря на то, что контекст холста графического процессора настроен неправильно. Более подробную информацию можно найти в выпуске 372837859 .

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

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

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

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

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

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

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

Размер буфера графического процессора теперь отображается в сообщении об ошибке при создании слишком большого буфера графического процессора. См. выпуск 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" .

Пока эти экспериментальные функции не будут стандартизированы, включите флаг «Поддержка Unsafe 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) . См. выпуск 368672123 .

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

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

Что нового в WebGPU

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

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113