Novità di WebGPU (Chrome 155-156)

Estensione WGSL fragment_depth

Nei pass di rendering intensivi di geometria, le ottimizzazioni Z iniziali sono i migliori amici degli sviluppatori. Offrono un enorme aumento delle prestazioni consentendo alla GPU di eliminare i pixel nascosti prima di eseguire costosi shader di framenti. Se una profondità rasterizzata non supera il test di profondità, la GPU salta completamente lo shader di frammento, a condizione che lo shader non abbia altri effetti collaterali.

Se vuoi approfondire il modo in cui l'hardware gestisce questo problema, MJP ha scritto un ottimo articolo su When Does Early-Z Have to be Disabled?.

Sebbene la manipolazione della profondità personalizzata sia utile, eseguirla nello shader dei frammenti comporta un costo nascosto. La scrittura in @builtin(frag_depth) all'interno di uno shader di framenti in genere costringe i driver a disattivare queste ottimizzazioni Z iniziali per l'intera chiamata di disegno. Ciò si verifica perché l'euristica del driver non può garantire che la profondità di output calcolata dello shader corrisponda alla profondità interpolata dal rasterizzatore.

Per risolvere questo problema di prestazioni, l'estensione WGSL fragment_depth consente di specificare un nome di modalità di profondità less o greater su @builtin(frag_depth) per indicare esplicitamente il confronto tra la profondità scritta e quella interpolata, consentendo alla GPU di applicare in modo sicuro le ottimizzazioni Z iniziali.

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

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

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

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

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

Compressione delle texture non allineata

La funzionalità GPU "texture-compression-unaligned" consente la creazione di texture compresse con dimensioni che non sono multipli interi della dimensione del blocco (ad esempio 4x4 per i formati BC, ETC2 e ASTC). In precedenza, WebGPU richiedeva rigorosamente che le dimensioni delle texture fossero allineate a questi limiti dei blocchi. Eliminando la necessità di riempire o scalare le texture per adattarle agli allineamenti dei blocchi, questa funzionalità preserva la fedeltà della compressione originale senza introdurre distorsioni di scalabilità. Vedi la dichiarazione di intenzione di spedizione.

Il seguente snippet di codice controlla se l'adattatore supporta la compressione delle texture non allineata e, se disponibile, richiede un dispositivo che la supporti.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
  throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
  requiredFeatures: ["texture-compression-unaligned"],
});

Un ringraziamento speciale al collaboratore esterno Ignacio Castaño per aver reso possibile questa funzionalità.

Spazi colore srgb-linear e display-p3-linear

Con l'aggiunta degli spazi colore predefiniti "srgb-linear" e "display-p3-linear", il contesto canvas WebGPU ora può eseguire il rendering direttamente negli spazi colore lineari a gamma estesa per supportare i display a gamma cromatica estesa. Questi spazi colore mantengono una relazione lineare tra i valori dei pixel e la luminanza fisica. Ciò li rende ideali per il rendering della luce fisica nei giochi, nonché per attività di elaborazione spaziale come l'anti-aliasing, l'interpolazione e la decimazione. Consulta la dichiarazione di intenzione di spedizione e la PR di esempio n. 574 (particelle HDR).

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

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

context.configure({
  device,
  format: "rgba16float",
  colorSpace: "display-p3-linear",
});

Formato del vertice snorm10-10-10-2 aggiuntivo

Il formato dei vertici "snorm10-10-10-2" è un formato compresso a 32 bit che contiene quattro valori normalizzati con segno: tre componenti a 10 bit (r, g, b) e un componente a 2 bit (a). Con questo formato, puoi archiviare in modo efficiente attributi come i vettori normali 3D con uno scalare aggiuntivo a 2 bit o un flag di allineamento, risparmiando larghezza di banda della memoria. Consulta la richiesta di modifica delle specifiche 6491.

Supporto di f16 su Linux per NVIDIA

La funzionalità facoltativa "shader-f16", che fornisce il supporto per i valori in rappresentazione in virgola mobile a 16 bit in WGSL, è ora supportata su Linux per i driver GPU NVIDIA recenti. Vedi issue chromium:42251215.

Aggiornamenti di Dawn

Ora puoi eseguire query sul LUID dell'DXGIAdapter sottostante per un determinato adattatore GPU utilizzando lo struct WGPUAdapterPropertiesD3D. Vedi issue chromium:562849566.

Questi sono 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 155-156

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