Novidades da WebGPU (Chrome'116)

François Beaufort
François Beaufort

Integração do WebCodecs

A WebGPU expõe uma API para criar objetos "textura externa" opacos do HTMLVideoElement usando importExternalTexture(). É possível usar esses objetos para amostrar os frames de vídeo com eficiência, possivelmente de uma maneira sem cópia diretamente dos dados do modelo de cor YUV de origem.

No entanto, a especificação inicial da WebGPU não permitia a criação de GPUExternalTexture objetos de objetos VideoFrame do WebCodecs. Essa capacidade é importante para apps 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 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 de upload de vídeo com WebCodecs para testar.

Dispositivo perdido retornado por requestDevice() do GPUAdapter

Se o método requestDevice() no GPUAdapter falhar porque já foi usado para criar um GPUDevice, ele será preenchido com um GPUDevice imediatamente marcado como perdido, em vez de retornar uma promessa que é rejeitada com null. Consulte o problema chromium:1234617 (link em inglês).

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 (link em inglês).

Conformidade com a especificação

O argumento message no construtor GPUPipelineError() é opcional. Consulte a mudança chromium:4613967 (link em inglês).

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

O nível máximo de detalhes padrão (lodMaxClamp) usado ao amostrar uma textura com createSampler() é 32. Consulte a mudança 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 a WebGPU em uma plataforma não compatível. Consulte a mudança chromium:4589369 (link em inglês).

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 a mudança chromium:4597950 (link em inglês).

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

Atualizações do Dawn

A opção de depuração disallow_unsafe_apis foi renomeada como allow_unsafe_apis e definida como 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. Ela pode ser útil para depuração. Consulte o problema dawn:1685 (link em inglês).

O atributo wgpu::ShaderModuleWGSLDescriptor descontinuado source foi removido em favor de code. Consulte a mudança dawn:130321 (link em inglês).

O método wgpu::RenderBundle::SetLabel() ausente foi implementado. Consulte a mudança dawn:134502 (link em inglês).

Os aplicativos podem solicitar um back-end específico ao receber um adaptador com a opção wgpu::RequestAdapterOptionsBackendType. Confira 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 swapchain para que o wgpu::Texture retornado possa ser usado em cópias. Confira um exemplo abaixo e o problema dawn:1551 (link em inglês).

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

Isso abrange apenas alguns dos principais destaques. Confira a lista exaustiva de commits (link em inglês).

Novidades na WebGPU

Uma lista de tudo o que foi abordado na série Novidades na WebGPU.

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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