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

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113