Возможности разработчика WebGPU

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

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

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

В этом документе подробно описано, как включить функции разработчика WebGPU, и представлен полный список.

Предпосылки

Чтобы включить функции разработчика WebGPU в Chrome, выполните следующие действия:

  1. Включите флаг «Возможности разработчика WebGPU» по адресу chrome://flags/#enable-webgpu-developer-features .
  2. Перезапустите браузер Chrome.

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

Запросы меток времени позволяют приложениям WebGPU точно (с точностью до наносекунды) измерять время выполнения команд GPU во время вычислений и проходов рендеринга. Эти запросы необходимы для анализа производительности и поведения рабочей нагрузки GPU. Для получения более подробной информации см. Запросы меток времени в проходах вычислений и рендеринга .

Из-за проблем с атаками по времени запросы временных меток квантуются с разрешением 100 микросекунд, что обеспечивает хороший компромисс между точностью и безопасностью. Это квантование автоматически отключается, когда включен флаг "WebGPU Developer Features".

Расширенная информация об адаптере

Чтобы получить более глубокое представление об используемом адаптере, GPUAdapterInfo предоставляет следующие атрибуты:

  • Атрибут device (стандартизированный) — это идентификатор адаптера, специфичный для поставщика.
  • Атрибут description (стандартизированный) представляет собой понятную человеку строку, содержащую сведения об адаптере.
  • Атрибут driver (нестандартизированный) — это понятная человеку строка, описывающая водителя.
  • Атрибут backend (нестандартный) указывает на графический бэкэнд, например "WebGPU" , "D3D11" , "D3D12" , "metal" , "vulkan" , "openGL" , "openGLES" или "null" .
  • Атрибут type (нестандартный) определяет тип графического процессора: "discrete GPU" , "integrated GPU" , "CPU" или "unknown" .
  • Атрибут d3dShaderModel (нестандартизированный) указывает максимальный поддерживаемый номер модели шейдера D3D, например, 62 указывает на поддержку HLSL SM 6.2.
  • Атрибут vkDriverVersion (нестандартный) — это версия драйвера Vulkan, указанная поставщиком.
  • Атрибут powerPreference (нестандартный) может иметь "low-power" или "high-performance" в зависимости от GPUPowerPreference в GPURequestAdapterOptions .

Чтобы предвидеть ограничения памяти при выделении больших объемов во время разработки приложения, GPUAdapterInfo предоставляет memoryHeaps нестандартную информацию, такую ​​как размер и тип куч памяти, доступных на адаптере.

const adapter = await navigator.gpu.requestAdapter();

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

Опция компиляции шейдерного модуля строгая математика

GPUShaderModuleDescriptor включает в себя нестандартизированную булеву опцию strictMath , которая включает или отключает строгую математическую точность во время компиляции шейдерного модуля. Эта опция поддерживается в Metal и Direct3D. Когда strictMath включен, компилятор придерживается точных математических правил. И наоборот, отключение этой опции позволяет компилятору оптимизировать шейдеры следующим образом:

  • Игнорирование возможности значений NaN и Infinity.
  • Рассматриваем -0 как +0.
  • Замена деления более быстрым умножением на обратную величину.
  • Операции перестановки, основанные на ассоциативных и распределительных свойствах.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

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

Нестандартизированный логический атрибут GPUExternalTexture isZeroCopy позволяет узнать, был ли видео, импортированное с помощью importExternalTexture(), напрямую доступно графическому процессору без необходимости промежуточного копирования.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}