Novità di WebGPU (Chrome 135)

François Beaufort
François Beaufort

Data di pubblicazione: 26 marzo 2025

Consenti la creazione del layout della pipeline con layout del gruppo di associazione null

In precedenza, la creazione di un layout del gruppo di associazioni vuoto richiedeva l'aggiunta di un gruppo di associazioni con zero associazioni, il che era sconveniente. Questo non è più necessario perché ora i layout dei gruppi di associazioni null sono consentiti e ignorati durante la creazione di un layout della pipeline. In questo modo, lo sviluppo dovrebbe essere più semplice.

Ad esempio, potresti voler creare una pipeline che utilizzi solo i layout dei gruppi di unione 0 e 2. Puoi assegnare il layout del gruppo di binding 1 ai dati del frammento e il layout del gruppo di binding 2 ai dati del vertice, quindi eseguire il rendering senza uno shader di frammento. Vedi il problema 377836524.

const bgl0 = myDevice.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = myDevice.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = myDevice.createBindGroupLayout({ entries: myVertexEntries });

// Create a pipeline layout that will be used to render without a fragment shader.
const myPipelineLayout = myDevice.createPipelineLayout({
  bindGroupLayouts: [bgl0, null, bgl2],
});

Consenti ai viewport di estendersi oltre i limiti dei target di rendering

I requisiti per la convalida dell'area visibile sono stati allentati per consentire alle aree visibili di superare i confini del target di rendering. Questo è particolarmente utile per disegnare elementi 2D come l'interfaccia utente che può estendersi oltre l'area visibile corrente. Consulta il problema 390162929.

const passEncoder = myCommandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: myColorTexture.createView(),
      loadOp: "clear",
      storeOp: "store",
    },
  ],
});

// Set a viewport that extends past the render target's bounds by 8 pixels
// in all directions.
passEncoder.setViewport(
  /*x=*/ -8,
  /*y=*/ -8,
  /*width=*/ myColorTexture.width + 16,
  /*height=*/ myColorTexture.height + 16,
  /*minDepth=*/ 0,
  /*maxDepth=*/ 1,
);

// Draw geometry and complete the render pass as usual.

Accesso più facile alla modalità di compatibilità sperimentale su Android

Ora il flag chrome://flags/#enable-unsafe-webgpu da solo attiva tutte le funzionalità richieste per la modalità di compatibilità WebGPU sperimentale su Android. In questo modo, puoi richiedere un GPUAdapter in modalità di compatibilità con l'opzione featureLevel: "compatibility" e persino accedere al backend OpenGL ES sui dispositivi che non supportano Vulkan. Consulta l'esempio seguente e il problema dawn:389876644.

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
La pagina del report WebGPU mostra un GPUAdapter in modalità di compatibilità sul dispositivo Android.
Informazioni sull'adattatore della modalità di compatibilità in webgpureport.org.

Rimuovere il limite maxInterStageShaderComponents

Come annunciato in precedenza, il limite maxInterStageShaderComponents è stato rimosso a causa di una combinazione di fattori:

  • Redundanza con maxInterStageShaderVariables: questo limite ha già uno scopo simile, controllando la quantità di dati trasmessi tra le fasi dello shader.
  • Discrepanze minori: anche se esistono lievi differenze nel calcolo dei due limiti, queste differenze sono minori e possono essere gestite efficacemente entro il limite di maxInterStageShaderVariables.
  • Semplificazione: la rimozione di maxInterStageShaderComponents semplifica l'interfaccia dello shader e riduce la complessità per gli sviluppatori. Invece di gestire due limiti distinti con differenze sottili, possono concentrarsi sul maxInterStageShaderVariables, più appropriato e completo.

Consulta l'intenzione di rimuovere e il problema 364338810.

Aggiornamenti di Dawn

Non è più possibile utilizzare un campionatore con filtro per campionare una texture di profondità. Ti ricordiamo che una texture di profondità può essere utilizzata solo con un campionatore senza filtro o di confronto. Consulta il problema 379788112.

Le strutture WGPURequiredLimits e WGPUSupportedLimits sono state appiattite in WGPULimits. Vedi issue 374263404.

Le seguenti strutture sono state rinominate. Consulta il problema 42240793.

  • WGPUImageCopyBuffer ora è WGPUTexelCopyBufferInfo
  • WGPUImageCopyTexture ora è WGPUTexelCopyTextureInfo
  • WGPUTextureDataLayout ora è WGPUTexelCopyBufferLayout

I membri subgroupMinSize e subgroupMaxSize sono stati aggiunti alla struttura WGPUAdapterInfo. Consulta il PR webgpu-headers.

Ora è possibile monitorare l'utilizzo dell'API Dawn in Metal quando esegui il programma con la variabile di ambiente DAWN_TRACE_FILE_BASE, che salva un file .gputrace che può essere caricato in un secondo momento nel debugger Metal di Xcode. Consulta la documentazione di Debugging Dawn.

Sono riportati solo alcuni punti salienti. Consulta l'elenco completo dei commit.

Novità di WebGPU

Un elenco di tutto ciò che è stato trattato nella serie Novità di WebGPU.

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