Novità di WebGPU (Chrome 153-154)

François Beaufort
François Beaufort

Data di pubblicazione: 15 settembre 2026

Estensione buffer_view WGSL

L'estensione del linguaggio WGSL buffer_view consente di interpretare i dati di una variabile uniforme, di archiviazione o di gruppo di lavoro come più tipi diversi. Ciò ha un'ampia gamma di utilità, dagli usi convenzionali di tipo punning alla suddivisione di una variabile in più variabili logiche.

Per motivi di sicurezza e semplicità di implementazione, è possibile accedere ai tipi reinterpretati solo utilizzando le seguenti funzioni integrate:

  • bufferView<T>() interpreta la memoria a un offset di byte specifico come un puntatore al tipo T.
  • bufferArrayView<T>() crea un puntatore di array delimitato con un conteggio esplicito degli elementi.
  • bufferLength() restituisce la dimensione in byte del buffer.

Questa estensione della lingua può essere rilevata in JavaScript utilizzando navigator.gpu.wgslLanguageFeatures. È consigliabile utilizzare una direttiva requires per segnalare la potenziale non portabilità con requires buffer_view nella parte superiore del codice dello shader WGSL. Vedi l'esempio di WGSL riportato di seguito e l'intent to ship.

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

Puoi anche consultare la proposta di visualizzazione del buffer per ulteriori dettagli e provare l'esempio di wireframe WebGPU.

Estensione WGSL swizzle_assignment

In risposta a una delle funzionalità della community più richieste, l'estensione WGSL swizzle_assignment ti consente di scrivere direttamente negli swizzle vettoriali, permettendoti di aggiornare più componenti in un'unica istruzione. Riduce drasticamente il boilerplate e migliora la leggibilità degli shader, allineando WGSL ad altri linguaggi di shading.

Questa estensione della lingua può essere rilevata in JavaScript utilizzando navigator.gpu.wgslLanguageFeatures. È consigliabile utilizzare una direttiva requires per segnalare la potenziale non portabilità con requires swizzle_assignment nella parte superiore del codice dello shader WGSL. Vedi l'esempio di WGSL riportato di seguito e l'intent to ship.

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

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

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

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

Aggiornamenti delle estensioni WGSL

L'estensione del linguaggio texture-formats-tier1, sebbene supportata nel codice WGSL, in precedenza non era mappata correttamente a navigator.gpu.wgslLanguageFeatures (come texture_formats_tier1) in JavaScript. Il problema di mappatura è stato risolto. Vedi Chromium CL 8159562.

L'estensione del linguaggio subgroups ora viene attivata automaticamente quando subgroup_size_control è abilitato in WGSL. Vedi il problema dawn:545285663.

Aggiornamenti di Dawn

La nuova funzionalità sperimentale wgpu::FeatureName::BufferMapWriteExtendedUsages ti consente di creare un buffer con wgpu::BufferUsage::MapWrite combinato con qualsiasi altro wgpu::BufferUsage, tranne wgpu::BufferUsage::MapRead, per scrivere direttamente in un buffer mappabile utilizzabile anche dalla GPU, eliminando il buffer di staging e la copia aggiuntiva sui backend Vulkan e D3D12. Per ulteriori informazioni, vedi Buffer Map Write Extended Usages e il problema dawn:386255678.

Ora puoi utilizzare i binding webgpu_cpp.h su qualsiasi implementazione webgpu.h anziché essere vincolato alla variante di Dawn utilizzando il nuovo webgpu_upstream_cpp_headers. Vedi webgpu-headers issue #596.

Dawn ora richiede macOS 13.0 o versioni successive. Consulta Dawn CL 334415.

Questi sono solo alcuni dei punti salienti. Per ulteriori dettagli, consulta l'elenco esaustivo dei commit.

Novità di WebGPU

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

Chrome 153-154

Chrome 151-152

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