Novità di WebGPU (Chrome 144)

François Beaufort
François Beaufort

Data di pubblicazione: 7 gennaio 2026

Estensione subgroup_id WGSL

L'estensione del linguaggio WGSL subgroup_id ti consente di utilizzare i seguenti nuovi valori integrati nei gruppi di lavoro quando l'estensione subgroups è abilitata:

  • subgroup_id: fornisce l'ID del sottogruppo di una chiamata all'interno del gruppo di lavoro corrente.
  • num_subgroups: indica il numero di sottogruppi presenti nel gruppo di lavoro.

In precedenza, per indicizzare la memoria utilizzando gli ID di invocazione dei sottogruppi, era necessario ricostruire un ID sottogruppo (in genere tramite operazioni atomiche) per evitare accessi alla memoria sovrapposti. Ora puoi utilizzare subgroup_id per completare l'altra metà dell'equazione. Poiché questa funzionalità non è ancora disponibile nel backend D3D, viene emulata. Dovrebbe essere sicuro creare un'equivalenza con local_invocation_index come subgroup_invocation_id + subgroup_size * subgroup_id. Tieni presente che potrebbero esserci casi in cui i sottogruppi non sono completi.

Questa estensione della lingua può essere rilevata tramite navigator.gpu.wgslLanguageFeatures. È consigliabile utilizzare una direttiva requires per segnalare la potenziale non portabilità con requires subgroup_id; nella parte superiore del codice dello shader WGSL. Vedi l'esempio seguente e l'intent to ship.

if (!navigator.gpu.wgslLanguageFeatures.has("subgroup_id")) {
  throw new Error(`WGSL subgroup_id and num_subgroups built-in values are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
const device = await adapter.requestDevice({ requiredFeatures: ["subgroups"] });

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;
  requires subgroup_id;

  @compute @workgroup_size(64, 1, 1)
  fn main(@builtin(subgroup_id) subgroup_id : u32,
          @builtin(num_subgroups) num_subgroups : u32) {
    // TODO: Use subgroup_id and num_subgroups values.
  }`,
});

Estensione uniform_buffer_standard_layout di WGSL

L'estensione del linguaggio WGSL uniform_buffer_standard_layout consente ai buffer uniformi di utilizzare gli stessi vincoli di layout di memoria dei buffer di archiviazione, il che semplifica la condivisione delle strutture di dati in entrambi i tipi di buffer. Ciò significa che i buffer uniformi non devono più avere un allineamento di 16 byte sugli elementi dell'array né riempire gli offset della struttura nidificata con un multiplo di 16 byte.

Questa estensione della lingua può essere rilevata tramite navigator.gpu.wgslLanguageFeatures. È consigliabile utilizzare una direttiva requires per segnalare la potenziale non portabilità con requires uniform_buffer_standard_layout; nella parte superiore del codice dello shader WGSL. Vedi l'esempio seguente e l'intent to ship.

if (!navigator.gpu.wgslLanguageFeatures.has("uniform_buffer_standard_layout")) {
  throw new Error(`WGSL uniform buffer standard layout is not available`);
}

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

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

  struct S {
      x: f32
  }
  struct Uniforms {
      a: S,
      b: f32
      // b is at offset 4. Without standard layout, alignment rules would
      // force b to be at offset 16 (or a multiple of 16), and you would have
      // to add extra fields or use an @align attribute.
  }

  @group(0) @binding(0) var<uniform> u: Uniforms;

  @fragment fn fs_main() -> @location(0) vec4<f32> {
      return vec4<f32>(u.a.x);
  }`,
});

WebGPU su Linux

Il team di Chrome sta implementando con attenzione WebGPU per Linux, a partire dal supporto per le GPU Intel Gen12+, ma con un piano provvisorio per estenderlo ad altri dispositivi (AMD, NVIDIA). Questa implementazione utilizza un'architettura in cui WebGPU utilizza Vulkan e il resto di Chromium rimane su OpenGL, esercitando percorsi di codice noti e validi. Vedi problema 442791440.

writeBuffer e writeTexture più veloci

writeBuffer() e writeTexture() sono stati ottimizzati in Chrome, con conseguenti miglioramenti delle prestazioni fino a due volte superiori rispetto alla versione precedente, a seconda delle dimensioni dei dati trasferiti. Questa modifica interessa anche tutti gli utenti dell'implementazione di Dawn Wire. Vedi problema 441900745.

Aggiornamenti di Dawn

Il team GPU Android ha pubblicato la prima release alpha dei binding Kotlin per WebGPU su Android, disponibile tramite Jetpack. Il pacchetto androidx.webgpu offre agli sviluppatori Android l'accesso a una moderna API GPU utilizzando Kotlin, aggirando i problemi legacy di OpenGL o la complessità di Vulkan. Si tratta di uno sviluppo entusiasmante per l'ecosistema.

Questi sono solo alcuni dei punti salienti. Consulta l'elenco completo dei commit.

Novità di WebGPU

Un elenco di tutti gli argomenti trattati nella serie Novità di WebGPU.

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