Novidades da WebGPU (Chrome 124)

François Beaufort
François Beaufort

Texturas de armazenamento somente leitura e leitura/gravação

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

Em seguida, o código do sombreador WGSL pode usar read_write e read qualificador de acesso para texturas de armazenamento. As funções integradas textureLoad() e textureStore() se comportam de acordo, e uma nova função integrada textureBarrier() está disponível para sincronizar acessos à memória de textura em um grupo de trabalho.

Recomendamos usar uma diretiva requires para sinalizar o potencial de não portabilidade com requires readonly_and_readwrite_storage_textures; na parte de cima do código do sombreador WGSL. Consulte o exemplo a seguir e o problema 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 service workers e shared workers

O WebGPU no Chrome leva o suporte a web workers para o próximo nível, oferecendo suporte a service workers e shared workers. É possível usar service workers para melhorar as tarefas em segundo plano e os recursos off-line, e shared workers para o compartilhamento eficiente de recursos em scripts. Consulte o problema chromium:41494731.

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

Captura de tela da extensão do Chrome WebLLM.
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 flag "Recursos para desenvolvedores do WebGPU" em chrome://flags/#enable-webgpu-developer-features. Quando compatível:

Captura de tela de https://webgpureport.org mostrando 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 bindgroups correspondentes usando layout: "auto", a criação de um bindgroup 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 agora não é chamado depois que o dispositivo da GPU é perdido. Essa correção alinha o Dawn com a especificação da API JavaScript e a implementação do Blink. Consulte o problema dawn:2459.

Isso abrange apenas alguns dos principais destaques. Confira a lista exaustiva de commits.

Novidades no WebGPU

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

Chrome 149-150

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