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

Франсуа Бофор
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 сразу же помечается как потерянный, а не возвращается обещание, отклоняющее запрос с null . См. issue 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 воспроизведение соответствующего видео больше не ограничивается, когда видео не отображается в области просмотра. См. issue chromium:1425252 .

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

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

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

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

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

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

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

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

Обновления Dawn

Отладочный переключатель disallow_unsafe_apis переименован в allow_unsafe_apis и теперь отключен по умолчанию. Этот переключатель подавляет ошибки валидации в точках входа API или комбинациях параметров, которые пока не считаются безопасными. Он может быть полезен для отладки . См. issue 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» .

Хром 139

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113