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