Novidades da WebGPU (Chrome'116)

François Beaufort
François Beaufort

Integração com o WebCodecs

A WebGPU expõe uma API para criar objetos de "textura externa" opacos de HTMLVideoElement a importExternalTexture(). É possível usar esses objetos para extrair uma amostra dos frames do vídeo de maneira eficiente, possivelmente de maneira não direta nos dados do modelo de cores YUV de origem.

No entanto, a especificação inicial da WebGPU não permitia a criação de objetos GPUExternalTexture a partir de objetos VideoFrame do WebCodecs. Esse recurso é importante para aplicativos avançados de processamento de vídeo que já usam o WebCodecs e gostariam de integrar a WebGPU ao pipeline de processamento de vídeo. A integração com o WebCodecs adiciona suporte ao uso de um VideoFrame como origem para chamadas de GPUExternalTexture e copyExternalImageToTexture(). Veja o exemplo a seguir e a entrada 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.

Confira o exemplo experimental Upload de vídeo com o WebCodecs para brincar.

Dispositivo perdido retornado por requestDevice() do GPUAdapter

Se o método requestDevice() em GPUAdapter falhar porque já foi usado para criar um GPUDevice, ele será atendido com um GPUDevice imediatamente marcado como perdido, em vez de retornar uma promessa que será rejeitada com null. Consulte o problema 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;

Manter a reprodução do vídeo sem problemas se o método importExternalTexture() for chamado.

Quando importExternalTexture() é chamado com um HTMLVideoElement, a reprodução do vídeo associado não é mais limitada quando o vídeo não está visível na janela de visualização. Consulte o problema chromium:1425252.

Conformidade com especificações

O argumento message no construtor GPUPipelineError() é opcional. Consulte alterar chromium:4613967.

Um erro será disparado ao chamar createShaderModule() se o code de origem da WGSL contiver \0. Consulte problema dawn:1345.

O nível máximo de detalhes (lodMaxClamp) padrão usado ao criar uma amostra de uma textura com createSampler() é 32. Consulte alterar chromium:4608063.

Aprimoramento da experiência do desenvolvedor

Uma mensagem é exibida no console JavaScript do DevTools para lembrar os desenvolvedores quando eles estão usando a WebGPU em uma plataforma sem suporte. Consulte alterar chromium:4589369.

As mensagens de erro de validação do buffer são mostradas instantaneamente no console JavaScript do DevTools quando a getMappedRange() falha sem forçar os desenvolvedores a enviar comandos para a fila. Consulte alterar chromium:4597950.

Captura de tela do console JavaScript do DevTools com a mensagem de erro de validação do buffer.
Mensagem de erro de validação de buffer no console JavaScript do DevTools.

Atualizações ao amanhecer

O botão de alternância de depuração disallow_unsafe_apis foi renomeado como allow_unsafe_apis e definido como desativado por padrão. Essa opção suprime erros de validação em pontos de entrada da API ou combinações de parâmetros que ainda não são consideradas seguras. Pode ser útil para depuração. Consulte problema dawn:1685.

O atributo source descontinuado do wgpu::ShaderModuleWGSLDescriptor foi removido e substituído por code Consulte mudar amanhecer:130321.

O método wgpu::RenderBundle::SetLabel() ausente foi implementado. Consulte Mudar amanhecer:134502.

Os aplicativos podem solicitar um back-end específico ao receber um adaptador com a opção wgpu::RequestAdapterOptionsBackendType. Veja um exemplo abaixo e issue dawn:1875.

wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
backendTypeOptions.backendType = wgpu::BackendType::D3D12;

wgpu::RequestAdapterOptions options = {};
options.nextInChain = &backendTypeOptions;

// Request D3D12 adapter.
myInstance.RequestAdapter(&options, myCallback, myUserData);

Um novo método SwapChain::GetCurrentTexture() foi adicionado com outros usos para texturas de cadeia de troca, para que o wgpu::Texture retornado possa ser usado em cópias. Veja um exemplo abaixo e issue dawn:1551.

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

Esses são apenas alguns dos principais destaques. Confira a lista completa de confirmações (link em inglês).

Novidades da WebGPU

Uma lista de tudo o que foi abordado na série O que há de novo na WebGPU.

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Google Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Google Chrome 113