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

Новая функция графического процессора "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...

Атрибут GPUDevice adapterInfo

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

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

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

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

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

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

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

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

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

Теперь в DevTools отображается предупреждение при использовании параметра powerPreference с requestAdapter() в Windows. Это предупреждение будет удалено, когда Chrome будет знать, как использовать два разных графических процессора и объединять результаты между ними. См. issue 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" .

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

Обновления Dawn

Методы 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» .

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