Novità di WebGPU (Chrome 132)

François Beaufort
François Beaufort

Data di pubblicazione: 8 gennaio 2025

Utilizzo della visualizzazione texture

Attualmente, le visualizzazioni delle texture della GPU ereditano tutti i flag di utilizzo dalla texture della GPU di origine. Questo può essere problematico in quanto alcuni formati di visualizzazione non sono compatibili con determinati utilizzi. Per risolvere questo problema, la chiamata di createView() con il membro facoltativo usage consente di specificare esplicitamente un sottoinsieme dei flag di utilizzo della texture di origine compatibili con il formato di visualizzazione scelto.

Questa modifica consente la convalida anticipata e un controllo più granulare su come viene utilizzata la visualizzazione. Inoltre, è in linea con altre API grafiche in cui i flag di utilizzo sono parametri comuni nella creazione di viste, offrendo opportunità di ottimizzazione.

Vedi il seguente snippet, la voce di Chrome Status 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 in formato a virgola mobile in doppia precisione 32 bit

Le texture in virgola mobile a 32 bit sono essenziali per il rendering HDR per preservare un'ampia 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 combinare le texture della GPU con i formati "r32float", "rg32float" e "rgba32float". Ora è possibile creare una pipeline di rendering che utilizza la fusione con qualsiasi allegato in formato float32 quando si richiede un dispositivo GPU con questa funzionalità.

Consulta lo snippet seguente, la voce di Chrome Status 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 GPUDevice adapterInfo

È importante che le librerie che accettano 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 da un GPUDevice. Ciò può essere scomodo, in quanto potrebbe richiedere agli utenti di fornire informazioni aggiuntive insieme al GPUDevice.

Per risolvere questo problema, GPUAdapterInfo ora viene esposto tramite l'attributo GPUDevice adapterInfo. Questi sono simili all'attributo GPUAdapter info esistente.

Vedi il seguente snippet, la voce di Chrome Status 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 del canvas con un formato non valido genera un errore JavaScript

In precedenza, l'utilizzo di un formato di texture non valido con il metodo configure() del contesto del canvas della GPU generava un errore di convalida della GPU. Questa operazione è stata modificata per generare un errore JavaScript TypeError. In questo modo si evitano scenari in cui getCurrentTexture() restituisce una texture GPU valida nonostante il contesto del canvas della GPU sia configurato in modo errato. Per ulteriori informazioni, consulta il problema 372837859.

Limitazioni del campionamento dei filtri sulle texture

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

Queste limitazioni significano che l'utilizzo di una texture di profondità con un campionatore non filtrante richiede la creazione manuale dei layout dei gruppi di binding. Questo perché i layout dei gruppi di binding generati automaticamente 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 estesa dei sottogruppi

L'esperimento sui sottogruppi, inizialmente previsto per terminare in Chrome 131, è stato esteso a Chrome 133 e si concluderà il 16 aprile 2025. Mentre la prima prova dell'origine si è concentrata sul rendimento, mancavano cruciali salvaguardie di portabilità. Queste misure di sicurezza verranno ora aggiunte, causando potenzialmente 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à come utilizzare due GPU diverse e comporre i risultati tra loro. Vedi problema 369219127.

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

Supporto sperimentale per i formati di texture normalizzati a 16 bit

I formati delle texture normalizzate con segno a 16 bit e normalizzate senza segno 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 fase di discussione per la standardizzazione.

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

Finché queste funzionalità sperimentali non saranno standardizzate, attiva il flag "Unsafe WebGPU Support" (Supporto WebGPU non sicuro) all'indirizzo chrome://flags/#enable-unsafe-webgpu per renderle disponibili in Chrome.

Vedi 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 all'alba

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

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

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