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

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

Интеграция WebCodecs

WebGPU предоставляет API для создания непрозрачных объектов «внешней текстуры» из HTMLVideoElement через importExternalTexture() . Вы можете использовать эти объекты для эффективной выборки видеокадров, потенциально способом 0-копий непосредственно из исходных данных цветовой модели 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», чтобы поэкспериментировать с ним.

Потерянное устройство, возвращенное 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 содержит contains \0 . См. issue dawn:1345 .

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

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

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

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

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

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

Переключатель отладки 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() с дополнительными использованиями для текстур swapchain, чтобы возвращаемый wgpu::Texture можно было использовать в копиях. Смотрите пример ниже и выдайте dawn:1551 .

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

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

Что нового в WebGPU

Список всего, что было рассмотрено в серии « Что нового в WebGPU» .

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

,

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

Интеграция WebCodecs

WebGPU предоставляет API для создания непрозрачных объектов «внешней текстуры» из HTMLVideoElement через importExternalTexture() . Вы можете использовать эти объекты для эффективной выборки видеокадров, потенциально способом 0-копий непосредственно из исходных данных цветовой модели 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», чтобы поэкспериментировать с ним.

Потерянное устройство, возвращенное 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 содержит contains \0 . См. issue dawn:1345 .

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

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

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

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

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

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

Переключатель отладки 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() с дополнительными использованиями для текстур swapchain, чтобы возвращаемый wgpu::Texture можно было использовать в копиях. Смотрите пример ниже и выдайте dawn:1551 .

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

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

Что нового в WebGPU

Список всего, что было рассмотрено в серии « Что нового в WebGPU» .

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