Функции WebGPU для разработчиков

François Beaufort
François Beaufort

Published: June 3, 2025

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

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

Предварительное условие

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

  1. Включите флаг "WebGPU Developer Features" по адресу chrome://flags/#enable-webgpu-developer-features .
  2. Restart Chrome browser.

Disable timestamp queries quantization

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

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

Extended adapter information

Для более глубокого понимания используемого адаптера, 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)   { /* ... */ }
}

Shader module compilation option strict math

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

  • Не принимая во внимание возможность значений NaN и Infinity.
  • Treating -0 as +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 });

Import video with zero-copy

Атрибут 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');
}