Novidades da WebGPU (Chrome 115)

François Beaufort
François Beaufort

Extensões de linguagem WGSL compatíveis

O membro wgslLanguageFeatures do objeto GPU lista os nomes das extensões de linguagem da WGSL compatíveis. As extensões de linguagem WGSL compatíveis são ativadas automaticamente. Portanto, não é necessário solicitar uma explicitamente. No momento, essa lista está vazia, mas você pode esperar muitos deles no futuro (por exemplo, do-while loops). Consulte issue 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 ao WebGPU para Direct3D 11. Agora você pode testar localmente executando o Chrome no Windows com as flags de linha de comando --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Consulte issue dawn:1705.

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

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

Melhorar a experiência do desenvolvedor

Novos alertas do DevTools

Se a chave depth for usada em um GPUExtend3DDict, um aviso vai aparecer no console do DevTools porque a chave correta é depthOrArrayLayers. Consulte o problema chromium:1440900.

Um aviso também é gerado se um GPUBlendComponent tiver uma mistura de membros explícitos e padrão. Consulte issue dawn:1785.

Embora os envios e desenhos de tamanho zero sejam válidos, um aviso incentiva os desenvolvedores a evitá-los sempre que possível. Consulte issue dawn:1786.

Melhores mensagens de erro

Agora, uma mensagem de erro aprimorada é fornecida ao usar um GPUCommandEncoder se finish() já tiver sido chamado. Consulte issue dawn:1736.

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

A parte inválida do estado de 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 não passou na validação, bem como o 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. Confira um exemplo abaixo e emita 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 em ferramentas de depuração do macOS

A opção de ativar/desativar a depuração use_user_defined_labels_in_backend permite encaminhar rótulos de objetos para o back-end para que eles possam ser vistos em ferramentas de depuração específicas da plataforma, como RenderDoc, PIX ou Instruments. Agora, uma experiência de depuração melhor é fornecida no macOS quando você a ativa para depuração. Consulte issue dawn:1784

Captura de tela do app Instruments no macOS com rótulos personalizados do 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 WGSL de entrada e sombreadores de back-end traduzidos. A partir de agora, quando você ativar a depuração, a HLSL será despejada se a compilação falhar. Consulte o problema dawn:1681.

Atualizações do amanhecer

Buffer de vértice não definido

Transmitir nullptr em vez de um 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 issue 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 transmissão de renderização permaneçam na memória de bloco, evitando o tráfego de VRAM e, possivelmente, a alocação de VRAM para as texturas definindo o uso de wgpu::TextureUsage::TransientAttachment. Esse recurso só é compatível com Metal e Vulkan. Consulte issue dawn: 1695.

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.

Como criar sem depot_tools

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

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