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 il layout del gruppo di binding nullo

In precedenza, la creazione di un layout di gruppo di binding vuoto richiedeva l'aggiunta di un gruppo di binding con zero binding, il che era scomodo. Non è più necessario perché ora i layout dei gruppi di binding 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 binding 0 e 2. Potresti assegnare il layout del gruppo di binding 1 ai dati dei frammenti e il layout del gruppo di binding 2 ai dati dei vertici, quindi eseguire il rendering senza uno shader di frammenti. Vedi 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 alle finestre di visualizzazione di estendersi oltre i limiti delle destinazioni di rendering

I requisiti per la convalida dell'area visibile sono stati resi meno rigidi per consentire alle aree visibili di andare oltre i limiti della destinazione di rendering. Ciò è particolarmente utile per disegnare elementi 2D come l'interfaccia utente che potrebbe estendersi al di fuori dell'area visibile corrente. Vedi 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ù semplice alla modalità di compatibilità sperimentale su Android

Il flag chrome://flags/#enable-unsafe-webgpu ora attiva da solo 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. Vedi l'esempio e il problema dawn:389876644 riportati di seguito.

// 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à su un dispositivo Android.
Informazioni sull'adattatore della modalità di compatibilità in webgpureport.org.

Rimuovi il limite maxInterStageShaderComponents

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

  • Ridondanza con maxInterStageShaderVariables: questo limite ha già uno scopo simile, ovvero controllare la quantità di dati trasferiti tra le fasi dello shader.
  • Discrepanze minori: sebbene ci siano lievi differenze nel modo in cui vengono calcolati i due limiti, queste differenze sono minime 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 separati con differenze sottili, possono concentrarsi sul limite più appropriato e completo maxInterStageShaderVariables.

Consulta Intenzione di rimozione e problema 364338810.

Aggiornamenti all'alba

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

Le strutture WGPURequiredLimits e WGPUSupportedLimits sono state compresse in WGPULimits. Vedi problema 374263404.

Le seguenti struct sono state rinominate. Vedi problema 42240793.

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

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

Ora è possibile tracciare 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 relativa al debug di Dawn.

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