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

François Beaufort
François Beaufort

Интеграция WebCodecs

WebGPU предоставляет API для создания непрозрачных объектов "внешней текстуры" из HTMLVideoElement через importExternalTexture(). Эти объекты можно использовать для эффективного сэмплирования кадров видео, возможно, без копирования непосредственно из исходных данных цветовой модели YUV.

Однако в исходной спецификации WebGPU не было возможности создавать объекты GPUExternalTexture из объектов VideoFrame WebCodecs. Эта возможность важна для приложений, которые уже используют WebCodecs для обработки видео и хотят интегрировать WebGPU в конвейер обработки видео. Интеграция WebCodecs добавляет поддержку использования VideoFrame в качестве источника для вызова GPUExternalTexture и copyExternalImageToTexture(). Ознакомьтесь с примером ниже и записью в chromestatus.

// Access the GPU device.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create VideoFrame from HTMLVideoElement.
const video = document.querySelector("video");
const videoFrame = new VideoFrame(video);

// Create texture from VideoFrame.
const texture = device.importExternalTexture({ source: videoFrame });
// TODO: Use texture in bind group creation.

Попробуйте экспериментальный образец загрузки видео с помощью WebCodecs.

Устройство, потерянное при вызове GPUAdapter requestDevice()

Если метод requestDevice() на GPUAdapter не работает, потому что он уже использовался для создания GPUDevice, то теперь он возвращает GPUDevice, сразу помеченный как потерянный, а не объект Promise, который отклоняется с null. Подробнее об ошибке chromium:1234617…

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

// New! The promise is not rejected anymore with null.
const device2 = await adapter.requestDevice();
// And the device is immediately marked as lost.
const info = await device2.lost;

Как обеспечить плавное воспроизведение видео при вызове importExternalTexture()

Если функция importExternalTexture() вызывается с параметром HTMLVideoElement, то связанное воспроизведение видео больше не ограничивается, когда видео не видно в области просмотра. Подробнее о проблеме chromium:1425252…

Соответствие спецификациям

Аргумент message в конструкторе GPUPipelineError() является необязательным. Подробнее об изменении chromium:4613967…

При вызове createShaderModule() возникает ошибка, если исходный код WGSL code содержит \0. Подробнее об ошибке dawn:1345…

Максимальный уровень детализации по умолчанию (lodMaxClamp), используемый при выборке текстуры с помощью createSampler(), равен 32. Подробнее об изменении chromium:4608063…

Улучшение работы разработчиков

В консоли JavaScript инструментов разработчика показывается сообщение, напоминающее разработчикам, что они используют WebGPU на неподдерживаемой платформе. Подробнее об изменении chromium:4589369…

Сообщения об ошибках проверки буфера мгновенно показываются в консоли JavaScript инструментов разработчика, когда getMappedRange() завершается с ошибкой, и разработчикам не нужно отправлять команды в очередь. Подробнее об изменении chromium:4597950…

Скриншот консоли JavaScript инструментов разработчика с сообщением об ошибке проверки буфера.
Сообщение об ошибке проверки буфера в консоли JavaScript инструментов разработчика.

Обновления на рассвете

Параметр отладки disallow_unsafe_apis переименован в allow_unsafe_apis и по умолчанию отключен. Этот переключатель позволяет игнорировать ошибки проверки в точках входа API или комбинациях параметров, которые ещё не считаются безопасными. Это может быть полезно для отладки. Подробнее о проблеме dawn:1685…

Удален устаревший атрибут source (wgpu::ShaderModuleWGSLDescriptor) и добавлен атрибут code. См. change dawn:130321.

Реализован отсутствующий метод wgpu::RenderBundle::SetLabel(). См. change dawn:134502.

Приложения могут запрашивать определенный сервер при получении адаптера с помощью параметра wgpu::RequestAdapterOptionsBackendType. Ознакомьтесь с примером ниже и сообщите о проблеме dawn:1875.

wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
backendTypeOptions.backendType = wgpu::BackendType::D3D12;

wgpu::RequestAdapterOptions options = {};
options.nextInChain = &backendTypeOptions;

// Request D3D12 adapter.
myInstance.RequestAdapter(&options, myCallback, myUserData);

Добавлен новый метод SwapChain::GetCurrentTexture() с дополнительными вариантами использования текстур цепочки буферов, чтобы возвращаемое значение wgpu::Texture можно было использовать в копиях. Пример приведен ниже. Проблема dawn:1551.

wgpu::SwapChain swapchain = myDevice.CreateSwapChain(mySurface, &myDesc);
swapchain.GetCurrentTexture();
swapchain.Present();

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

Что нового в 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