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 opacos de "textura externa" 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 inicial da WebGPU 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 WebCodecs e gostariam de integrar o WebGPU no pipeline de processamento de vídeo. A integração com o WebCodecs adiciona suporte para usar um VideoFrame como a origem de uma chamada GPUExternalTexture e copyExternalImageToTexture(). Confira 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 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 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 de vídeo suave se importExternalTexture() for chamada

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

Conformidade com a especificação

O argumento message no construtor GPUPipelineError() é opcional. Consulte mudança do Chromium:4613967.

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

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

Melhorar a experiência do desenvolvedor

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

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

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

Atualizações do Dawn

A chave de depuração disallow_unsafe_apis foi renomeada como allow_unsafe_apis e desativada 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 depuração. Consulte o problema dawn:1685.

O atributo source wgpu::ShaderModuleWGSLDescriptor descontinuado foi removido em favor de code. Consulte change 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 de retorno possa ser usado em cópias. Confira um exemplo abaixo e issue dawn:1551.

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

Isso abrange apenas alguns dos principais destaques. Confira a lista completa de confirmações.

Novidades na WebGPU

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

Chrome 131

Chrome 130

Chrome 129

Chrome 128

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