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

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

Для решения этой проблемы GPUAdapterInfo теперь доступна через атрибут adapterInfo GPUDevice . Они аналогичны существующему атрибуту 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. Дополнительную информацию можно найти в проблеме 372837859 .

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

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

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

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

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

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

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

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

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

В настоящее время экспериментально доступны 16-битные форматы текстур с нормализованным знаком и без знака, которые являются частью функций GPU "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 Support" по адресу 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 .

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

Здесь описаны лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком изменений .

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

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

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