Published: June 3, 2025
Реализация API WebGPU в Chrome включает функции, предназначенные исключительно для разработки и тестирования. Эти функции выходят за рамки стандартной спецификации WebGPU. Не используйте эти функции в производственной среде.
В этом документе подробно описано, как включить функции WebGPU для разработчиков, и приведен исчерпывающий список.
Предварительное условие
Чтобы включить функции разработчика WebGPU в Chrome, выполните следующие действия:
- Включите флаг "WebGPU Developer Features" по адресу
chrome://flags/#enable-webgpu-developer-features. - 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');
}