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

Ознакомьтесь с экспериментальным примером загрузки видео с помощью веб-кодеков, чтобы поэкспериментировать.

Функция requestDevice() объекта GPUAdapter возвращает сообщение о потере устройства.

Если метод 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 .

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

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

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

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

Утренние обновления

Переключатель отладки disallow_unsafe_apis был переименован в allow_unsafe_apis и теперь по умолчанию находится в состоянии disabled. Этот переключатель подавляет ошибки проверки в точках входа 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» .

Хром 144

Хром 143

Хром 142

Хром 141

Хром 140

Хром 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