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

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

Интеграция веб-кодеков

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

Однако первоначальная спецификация WebGPU не позволяла создавать объекты GPUExternalTexture из объектов WebCodecs VideoFrame . Эта возможность важна для расширенных приложений обработки видео, которые уже используют 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, чтобы поиграть с ним.

Потерянное устройство, возвращенное запросом GPUAdapterDevice()

Если метод requestDevice() в GPUAdapter завершается сбоем, поскольку он уже использовался для создания GPUDevice , теперь он выполняется с GPUDevice , немедленно помеченным как потерянный, вместо того, чтобы возвращать обещание, которое отклоняется с 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() если исходный code WGSL содержит \0 . См. выпуск Dawn:1345 .

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

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

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

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

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

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

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

Устаревший source атрибут wgpu::ShaderModuleWGSLDescriptor удален в пользу code . См. изменение Dawn:130321 .

Реализован отсутствующий wgpu::RenderBundle::SetLabel() . См. изменение 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» .

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113