Novidades da WebGPU (Chrome'116)

François Beaufort
François Beaufort

Integração do WebCodecs

A WebGPU expõe uma API para criar objetos opacos de "textura externa" de HTMLVideoElement usando importExternalTexture(). Você pode usar esses objetos para fazer amostragem 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 de objetos VideoFrame do WebCodecs. Esse recurso é importante para apps avançados de processamento de vídeo que já usam WebCodecs e querem integrar o WebGPU ao pipeline de processamento de vídeo. A integração do WebCodecs adiciona suporte para usar um VideoFrame como origem de uma chamada GPUExternalTexture e copyExternalImageToTexture(). Confira o exemplo a seguir 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() em GPUAdapter falhar porque já foi usado para criar um GPUDevice, ele agora será concluído com um GPUDevice imediatamente marcado como perdido, em vez de retornar uma promessa que é 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 chamado

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 janela de visualização. Consulte o problema chromium:1425252.

Conformidade com a especificação

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

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

O nível máximo de detalhe (lodMaxClamp) padrão usado ao fazer amostragem de uma textura com createSampler() é 32. Consulte change chromium:4608063 (link em inglês).

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 change 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 change chromium:4597950.

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

Atualizações do amanhecer

A opção de ativar/desativar depuração disallow_unsafe_apis foi renomeada como allow_unsafe_apis e desativada por padrão. Essa chave desativa 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 issue 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. Consulte change dawn:134502.

Os aplicativos podem solicitar um back-end específico ao receber um adaptador com a opção wgpu::RequestAdapterOptionsBackendType. Confira um exemplo abaixo e emita 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 usos extras para texturas de cadeia de troca, para que o retorno wgpu::Texture possa ser usado em cópias. Confira um exemplo abaixo e emita 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 commits.

Novidades no WebGPU

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

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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