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

François Beaufort
François Beaufort

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

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

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

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

Ознакомьтесь со следующим фрагментом кода, записью на сайте chromestatus.com и проблемой 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". Теперь при запросе устройства GPU с этой функцией можно создавать конвейер отрисовки, в котором используется смешивание с любым прикрепленным объектом в формате 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.
  }
}

При настройке контекста элемента canvas с недопустимым форматом возникает ошибка 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.

Теперь в сообщении об ошибке, возникающей при создании слишком большого буфера 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). Подробнее о проблеме 368672123…

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

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

Что нового в WebGPU

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

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113