Nouveautés de WebGPU (Chrome 155-156)

Extension fragment_depth WGSL

Dans les passes de rendu à forte intensité géométrique, les optimisations early-Z sont les meilleures alliées des développeurs. Ils améliorent considérablement les performances en permettant au GPU d'ignorer les pixels masqués avant d'exécuter des nuanceurs de fragments coûteux. Si une profondeur pixélisée échoue au test de profondeur, le GPU ignore complètement le nuanceur de fragment, à condition que le nuanceur n'ait pas d'autres effets secondaires.

Si vous souhaitez en savoir plus sur la façon dont le matériel gère cela, MJP propose un excellent article sur Quand faut-il désactiver Early-Z ?.

Bien que la manipulation de la profondeur personnalisée soit utile, l'effectuer dans votre nuanceur de fragments entraîne un coût caché. L'écriture dans @builtin(frag_depth) à l'intérieur d'un nuanceur de fragments force généralement les pilotes à désactiver ces optimisations early-Z pour l'ensemble de l'appel de dessin. Cela est dû au fait que les heuristiques du pilote ne peuvent pas garantir que la profondeur de sortie calculée du nuanceur correspond à la profondeur interpolée par le rastériseur.

Pour remédier à cette baisse de performances, l'extension WGSL fragment_depth vous permet de spécifier un nom de mode de profondeur less ou greater sur @builtin(frag_depth) pour indiquer explicitement comment la profondeur écrite se compare à la profondeur interpolée, ce qui permet au GPU d'appliquer en toute sécurité les optimisations early-Z.

Cette extension de langage peut être détectée dans JavaScript à l'aide de navigator.gpu.wgslLanguageFeatures. Il est recommandé d'utiliser une directive "requires" pour signaler le risque de non-portabilité avec requires fragment_depth; en haut de votre code de nuanceur WGSL. Consultez l'exemple suivant et l'intention de livraison.

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;
  }`,
});

Compression de texture non alignée

La fonctionnalité GPU "texture-compression-unaligned" permet de créer des textures compressées dont les dimensions ne sont pas des multiples entiers de la taille du bloc (par exemple, 4x4 pour les formats BC, ETC2 et ASTC). Auparavant, WebGPU exigeait strictement que les tailles de texture s'alignent sur ces limites de bloc. En éliminant la nécessité de remplir ou de redimensionner les textures pour les aligner sur les blocs, cette fonctionnalité préserve la fidélité de la compression d'origine sans introduire de distorsion de redimensionnement. Consultez l'intention de livraison.

L'extrait de code suivant vérifie si l'adaptateur est compatible avec la compression de texture non alignée et, si c'est le cas, demande un appareil avec cette fonctionnalité.

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 grand merci à Ignacio Castaño, contributeur externe de spark.js, pour avoir piloté cette fonctionnalité, les spécifications et le travail sur la CTS !

Espaces colorimétriques srgb-linear et display-p3-linear

Avec l'ajout des espaces colorimétriques prédéfinis "srgb-linear" et "display-p3-linear", le contexte du canevas WebGPU peut désormais s'afficher directement dans des espaces colorimétriques linéaires à plage étendue pour prendre en charge les écrans à large gamme. Ces espaces colorimétriques maintiennent une relation linéaire entre les valeurs de pixel et la luminance physique. Elles sont donc idéales pour le rendu de la lumière physique dans les jeux, ainsi que pour les tâches de traitement spatial telles que l'anticrénelage, l'interpolation et la décimation. Consultez l'intention de livraison et l'exemple de RP Particles (HDR) n° 574.

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",
});

Format de sommet snorm10-10-10-2 supplémentaire

Le format de sommet "snorm10-10-10-2" est un format 32 bits compressé contenant quatre valeurs normalisées signées : trois composants 10 bits (r, g, b) et un composant 2 bits (a). Ce format vous permet de stocker efficacement des attributs, tels que des vecteurs normaux 3D avec un scalaire 2 bits supplémentaire, ou un indicateur d'alignement, tout en économisant de la bande passante mémoire. Consultez la demande d'extraction de spécification 6491.

Compatibilité avec f16 sous Linux pour NVIDIA

La fonctionnalité facultative "shader-f16", qui permet d'utiliser des valeurs à virgule flottante de 16 bits dans WGSL, est désormais compatible avec Linux pour les pilotes de GPU NVIDIA récents. Consultez le problème chromium:42251215.

Mises à jour de Dawn

Vous pouvez désormais interroger le LUID du DXGIAdapter sous-jacent pour un adaptateur GPU donné à l'aide de la structure WGPUAdapterPropertiesD3D. Consultez le problème chromium:562849566.

Ce commentaire couvre certains des points essentiels. Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tout ce qui a été abordé dans la série Nouveautés de 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