Novidades da WebGPU (Chrome 115)

François Beaufort
François Beaufort

Extensões de idiomas da WGSL com suporte

O membro wgslLanguageFeatures do objeto GPU lista os nomes das extensões de idioma da WGSL compatíveis. As extensões de idioma WGSL aceitas são ativadas automaticamente, então você não precisa solicitá-las explicitamente. Essa lista está vazia, mas talvez você encontre mais opções no futuro (por exemplo, do-while loops). Consulte o problema dawn:1777.

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Suporte experimental para Direct3D 11

A equipe do Chromium está trabalhando para adicionar suporte à WebGPU para Direct3D 11. Agora é possível testar esse recurso localmente, executando o Chrome no Windows com as sinalizações de linha de comando --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Consulte o problema dawn:1705.

Usar uma GPU discreta por padrão com alimentação CA

Em dispositivos macOS com duas GPUs, se requestAdapter() for chamado sem uma opção powerPreference, a GPU discreta vai ser retornada quando o dispositivo do usuário estiver conectado a energia CA. Caso contrário, a GPU integrada será retornada. Consulte a mudança 4499307.

Como melhorar a experiência do desenvolvedor

Novos avisos do DevTools

Se a chave depth for usada em um GPUExtend3DDict, um aviso será mostrado no Console do DevTools, já que a chave correta é depthOrArrayLayers. Consulte problema chromium:1440900.

Um aviso também será gerado se uma GPUBlendComponent tiver uma combinação de membros explícitos e padronizados. Consulte o problema dawn:1785 (link em inglês).

Embora os despachos e desenhos de tamanho zero sejam válidos, um aviso incentiva os desenvolvedores a evitá-los quando possível. Consulte o problema dawn:1786 (link em inglês).

Melhores mensagens de erro

Uma mensagem de erro aprimorada agora é fornecida ao usar um GPUCommandEncoder se finish() já tiver sido chamado. Consulte problema dawn:1736.

Ao enviar buffers de comando com objetos destruídos, os rótulos dos buffers de comando que foram usados em submit() agora ficam visíveis na mensagem de erro. Consulte o problema dawn:1747.

A parte inválida do estado do estêncil de profundidade agora é especificada na mensagem de erro ao validar depthStencil. Consulte o problema dawn:1735.

A mensagem de erro de validação minBindingSize agora informa o grupo e o número da vinculação que falhou na validação, além do buffer. Consulte o problema dawn:1604.

As mensagens de erro retornadas pelo método mapAsync() em um objeto GPUBuffer foram aprimoradas para ajudar os desenvolvedores durante a depuração. Veja um exemplo abaixo e o problema chromium:1431622.

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

Rótulos nas ferramentas de depuração do macOS

A alternância de depuração use_user_defined_labels_in_backend permite que você encaminhe rótulos de objetos ao back-end para que eles possam ser vistos em ferramentas de depuração específicas da plataforma, como RenderDoc, PIX ou Instruments. A partir de agora, uma experiência de depuração melhor será oferecida no macOS quando você a ativar para depuração. Consulte o problema dawn:1784.

Captura de tela do app Instruments no macOS com rótulos personalizados provenientes da WebGPU.
Rótulos definidos pelo usuário no app Instruments no macOS.

Registrar HLSL se a compilação falhar

A alternância de depuração dump_shaders permite registrar sombreadores de entrada WGSL e sombreadores de back-end traduzidos. A partir de agora, quando você ativar a depuração (link em inglês), o HLSL será despejado em caso de falha na compilação. Consulte o problema dawn:1681.

Atualizações do amanhecer

Cancelar buffer de vértice

Transmitir nullptr em vez de wgpu::Buffer para SetVertexBuffer() em wgpu::RenderPassEncoder ou wgpu::RenderBundleEncoder permite cancelar a definição de um buffer de vértice definido anteriormente em um determinado slot. Consulte o problema dawn:1675.

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

Anexos temporários

É possível criar anexos que permitem que as operações de passagem de renderização permaneçam na memória do bloco, evitando o tráfego da VRAM e, possivelmente, a alocação de VRAM para as texturas, definindo o uso de wgpu::TextureUsage::TransientAttachment. Esse recurso tem suporte apenas para Metal e Vulkan. Consulte o início do problema: 1695 (link em inglês).

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

Edifício sem depot_tools

Uma nova opção DAWN_FETCH_DEPENDENCIES do CMake permite buscar dependências do Dawn usando um script Python que lê arquivos DEPS em vez de exigir a instalação de depot_tools para todos os projetos que dependem dele. Consulte a mudança 131750.

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