Novità di WebGPU (Chrome 132)

François Beaufort
François Beaufort

Data di pubblicazione: 8 gennaio 2025

Utilizzo della visualizzazione delle texture

Al momento le visualizzazioni delle texture GPU ereditano tutti i flag di utilizzo dalla texture GPU di origine. Questo può essere problematico perché alcuni formati di visualizzazione non sono compatibili con determinati utilizzi. Per risolvere il problema, chiamando createView() con il membro facoltativo usage puoi specificare esplicitamente un sottoinsieme degli indicatori di utilizzo della texture di origine compatibili con il formato della visualizzazione scelto.

Questa modifica consente la convalida anticipata e un controllo più granulare sull'utilizzo della visualizzazione. Inoltre, è in linea con altre API di grafica in cui i flag di utilizzo sono parametri comuni nella creazione di visualizzazioni, offrendo opportunità di ottimizzazione.

Consulta lo snippet seguente, la voce di chromestatus e il problema 363903526.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

Fusione di texture con formato a virgola mobile a 32 bit

Le texture a virgola mobile a 32 bit sono essenziali per il rendering HDR al fine di preservare una vasta gamma di valori di colore ed evitare artefatti di banding del colore. Ad esempio nella visualizzazione scientifica.

La nuova funzionalità GPU "float32-blendable" consente di miscelare le texture GPU con i formati "r32float", "rg32float" e "rgba32float". Ora è possibile creare una pipeline di rendering che utilizzi l'unione con qualsiasi allegato in formato float32 quando si richiede un dispositivo GPU con questa funzionalità.

Consulta lo snippet seguente, la voce di chromestatus e il problema 369649348.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

Attributo adapterInfo GPUDevice

È importante che le librerie che utilizzano oggetti GPUDevice forniti dall'utente accedano alle informazioni sulla GPU fisica, in quanto potrebbero dover ottimizzare o implementare soluzioni alternative in base all'architettura della GPU. Sebbene sia possibile accedere a queste informazioni tramite l'oggetto GPUAdapter, non esiste un modo diretto per ottenerle solo da un GPUDevice. Ciò può essere sconveniente, in quanto potrebbe richiedere agli utenti di fornire informazioni aggiuntive oltre a GPUDevice.

Per risolvere il problema, GPUAdapterInfo è ora visibile tramite l'attributo GPUDevice adapterInfo. Sono simili all'attributo GPUAdapter info esistente.

Consulta lo snippet seguente, la voce di chromestatus e il problema 376600838.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

La configurazione del contesto della tela con un formato non valido genera un errore JavaScript

In precedenza, l'utilizzo di un formato texture non valido con il metodo configure() del contesto della tela GPU causava un errore di convalida della GPU. Questa operazione è stata modificata in modo da generare un TypeError JavaScript. In questo modo si evitano scenari in cui getCurrentTexture() restituisce una texture GPU valida nonostante il contesto della tela GPU sia configurato in modo errato. Ulteriori informazioni sono disponibili nel problema 372837859.

Restrizioni del filtro dei sampler sulle texture

In precedenza era consentito l'utilizzo di texture con formato "sint", "uint" e "depth"" con campioni di filtri. Ora non è più consentito utilizzare una texture in formato "sint" o "uint" con un campionatore di filtri. Tieni presente che al momento viene emesso un avviso se utilizzi una texture "depth" con un campionatore di filtri, in quanto non sarà consentita in futuro. Vedi il problema 376497143.

Queste limitazioni significano che l'utilizzo di una texture di profondità con un campionatore senza filtri richiede la creazione manuale dei layout del gruppo di binding. Questo perché i layout dei gruppi di vincoli generati in modo "automatico" non supportano ancora questa combinazione. Il problema relativo alle specifiche 4952 contiene una proposta in fase di valutazione per risolvere questa limitazione in futuro.

Sperimentazione dei sottogruppi estesa

L'sperimentazione sui sottogruppi, inizialmente prevista per terminare in Chrome 131, è stata estesa a Chrome 133 e terminerà il 16 aprile 2025. Sebbene la prima prova dell'origine si sia concentrata sul rendimento, mancava di garanzie di portabilità fondamentali. Ora verranno aggiunte queste misure di salvaguardia, che potrebbero causare errori nel codice esistente.

Migliorare l'esperienza degli sviluppatori

Ora in DevTools è visibile un avviso quando l'opzione powerPreference viene utilizzata con requestAdapter() su Windows. Questo avviso verrà rimosso quando Chrome saprà utilizzare due GPU diverse e comporre i risultati tra loro. Consulta il problema 369219127.

Le dimensioni del buffer della GPU sono ora presenti nel messaggio di errore quando viene creato un buffer della GPU troppo grande. Consulta il problema 374167798.

Supporto sperimentale per i formati delle texture normalizzate a 16 bit

I formati delle texture con normalizzazione con segno e senza segno a 16 bit sono ora disponibili in via sperimentale rispettivamente dietro le funzionalità GPU "chromium-experimental-snorm16-texture-formats" e "chromium-experimental-unorm16-texture-formats", mentre sono in corso discussioni per la standardizzazione.

Queste funzionalità aggiungono il supporto per i formati delle texture normalizzate a 16 bit con utilizzi COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT, multisampling e funzionalità di risoluzione. I formati aggiuntivi sono "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" e "rgba16snorm".

Fino a quando queste funzionalità sperimentali non saranno standardizzate, attiva il flag "Supporto WebGPU non sicuro" in chrome://flags/#enable-unsafe-webgpu per renderle disponibili in Chrome.

Consulta lo snippet seguente e il problema 374790898.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Aggiornamenti di Dawn

I metodi EnumerateFeatures(FeatureName * features) di wgpu::Adapter e wgpu::Device sono deprecati a favore dell'utilizzo di GetFeatures(SupportedFeatures * features). Consulta il problema 368672123.

L'API C webgpu.h ha modificato tutti i char const * in una struttura WGPUStringView che definisce una visualizzazione in una stringa con codifica UTF-8. Agisce come un puntatore ai dati della stringa, accoppiato a una lunghezza. In questo modo puoi lavorare con parti di una stringa senza doverla copiare. Consulta il problema 42241188.

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