Novidades da WebGPU (Chrome 124)

François Beaufort
François Beaufort

Texturas de armazenamento de leitura e leitura-gravação

O tipo de vinculação de textura de armazenamento permite que os shaders leiam de texturas de armazenamento sem adicionar o uso de TEXTURE_BINDING e realizem leituras e gravações mistas em determinados formatos. Quando a extensão de linguagem WGSL "readonly_and_readwrite_storage_textures" estiver presente em navigator.gpu.wgslLanguageFeatures, será possível definir o acesso GPUStorageTexture para "read-write" ou "read-only" ao criar um layout de grupo de vinculação. Antes, isso era restrito a "write-only".

Assim, o código de shader da WGSL pode usar os qualificadores de acesso read_write e read para texturas de armazenamento, as funções integradas textureLoad() e textureStore() se comportarão de maneira adequada e uma nova função integrada textureBarrier() estará disponível para sincronizar acessos à memória de textura em um grupo de trabalho.

É recomendável usar uma diretiva requires para indicar o potencial de não portabilidade com requires readonly_and_readwrite_storage_textures; na parte de cima do código do sombreador WGSL. Confira o exemplo a seguir e issue dawn:1972.

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

const shaderModule = device.createShaderModule({ code: `
  requires readonly_and_readwrite_storage_textures;

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

Suporte a workers compartilhados e workers de serviço

A WebGPU no Chrome oferece suporte a trabalhadores da Web no próximo nível, agora oferecendo suporte a trabalhadores de serviço e trabalhadores compartilhados. É possível usar service workers para aprimorar tarefas em segundo plano e recursos off-line, e workers compartilhados para compartilhamento eficiente de recursos entre scripts. Consulte o problema chromium:41494731.

Confira o exemplo de extensão do Chrome e a extensão WebLLM do Chrome para saber como usar a WebGPU em um service worker de extensão.

Captura de tela da extensão do WebLLM para o Chrome.
Extensão do Chrome WebLLM.

Novos atributos de informações do adaptador

Os atributos de informações do adaptador d3dShaderModel e vkDriverVersion não padrão agora estão disponíveis ao chamar requestAdapterInfo() se o usuário tiver ativado a sinalização "Recursos do desenvolvedor WebGPU" em chrome://flags/#enable-webgpu-developer-features. Quando houver suporte:

  • O d3dShaderModel é o número máximo de modelo de sombreador D3D aceito. Por exemplo, o valor 62 indica que o driver atual é compatível com HLSL SM 6.2. Consulte a documentação e o issue dawn:1254.

  • O vkDriverVersion é o número da versão especificado pelo fornecedor do driver Vulkan. Consulte a documentação e o problema chromium:327457605.

Captura de tela de https://webgpureport.org com vkDriverVersion nas informações do adaptador.
Informações do adaptador vkDriverVersion mostradas em https://webgpureport.org.

Correções de bugs

A criação de dois pipelines com grupos de vinculação correspondentes usando layout: "auto", a criação de um grupo de vinculação com o primeiro pipeline e o uso dele no segundo pipeline agora gera um GPUValidationError. Permitir isso era um bug de implementação que agora foi corrigido com testes adequados. Consulte o problema dawn:2402.

Atualizações do Dawn

Na API Dawn, o callback de erro não capturado definido com wgpuDeviceSetUncapturedErrorCallback não é mais chamado depois que o dispositivo de GPU é perdido. Essa correção alinha o Dawn à especificação da API JavaScript e à implementação do Blink. Consulte o problema dawn:2459.

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 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