Novidades da WebGPU (Chrome'116)

François Beaufort
François Beaufort

Integração com WebCodecs

A WebGPU expõe uma API para criar "textura externa" opaca Objetos de HTMLVideoElement a importExternalTexture(). É possível usar esses objetos para criar amostras dos frames de vídeo de maneira eficiente, possivelmente sem cópia, diretamente dos dados do modelo de cores YUV de origem.

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

Dispositivo perdido retornado por GPUAdapter requestDevice().

Se o método requestDevice() no 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 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;

Manter a reprodução de vídeo suave se importExternalTexture() for chamada

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

Conformidade com as especificações

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

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

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

Como melhorar a experiência do desenvolvedor

Uma mensagem é exibida no console JavaScript do DevTools para lembrar os desenvolvedores quando eles estiverem 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 o 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 mostrando a mensagem de erro de validação do buffer.
Mensagem de erro de validação do buffer no console JavaScript do DevTools.

Atualizações do amanhecer

O botão de alternância de depuração disallow_unsafe_apis foi renomeado como allow_unsafe_apis e 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 considerados seguros. Isso pode ser útil para a depuração. Consulte o problema dawn:1685.

O atributo source descontinuado por wgpu::ShaderModuleWGSLDescriptor foi removido e substituído por code Veja alterar dawn:130321.

O método wgpu::RenderBundle::SetLabel() ausente foi implementado. Veja alterar dawn: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 o problema dawn:1875 (link em inglês).

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 o problema dawn:1551 (link em inglês).

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

Isso cobre 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 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113