Nouveautés de WebGPU (Chrome 155-156)

Extension WGSL fragment_depth

Dans les passes de rendu à forte intensité géométrique, les optimisations Z-early sont les meilleures amies des développeurs. Elles offrent un gain de performances considérable en permettant au GPU de supprimer les pixels masqués avant d'exécuter des nuanceurs de fragments coûteux. Si une profondeur rasterisé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 a rédigé un excellent article sur When Does Early-Z Have to be Disabled? (Quand la fonctionnalité Early-Z doit-elle être désactivée ?).

Bien que la manipulation de la profondeur personnalisée soit utile, elle s'accompagne d'une taxe cachée dans votre nuanceur de fragment. L'écriture dans @builtin(frag_depth) à l'intérieur d'un nuanceur de fragment oblige généralement les pilotes à désactiver ces optimisations Z précoces pour l'ensemble de l'appel de dessin. Cela se produit, car 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 résoudre ce problème 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 Z précoces.

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 d'expédition.

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 de bloc (par exemple, 4x4 pour les formats BC, ETC2 et ASTC). Auparavant, WebGPU exigeait que les tailles de texture soient strictement alignées sur ces limites de blocs. En supprimant la nécessité de remplir ou de mettre à l'échelle les textures pour qu'elles s'adaptent aux alignements de blocs, cette fonctionnalité préserve la fidélité de la compression d'origine sans introduire de distorsion de mise à l'échelle. Consultez l'intention d'expédier.

L'extrait de code suivant vérifie si l'adaptateur est compatible avec la compression de texture non alignée et, si elle est disponible, 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"],
});

Merci beaucoup au contributeur externe Ignacio Castaño pour cette fonctionnalité !

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 de couleurs. Ces espaces colorimétriques maintiennent une relation linéaire entre les valeurs de pixels et la luminance physique. Ils sont donc idéaux 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 d'expédition et l'exemple de requête pull n° 574 (Particules (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",
});

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

Le format de vertex "snorm10-10-10-2" est un format compressé de 32 bits contenant quatre valeurs normalisées signées : trois composants de 10 bits (r, g, b) et un composant de 2 bits (a). Ce format vous permet de stocker efficacement des attributs, comme des vecteurs normaux 3D avec un scalaire de 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écifications 6491.

Compatibilité avec f16 sur Linux pour NVIDIA

La fonctionnalité optionnelle "shader-f16", qui permet la prise en charge 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.

Nouveautés de l'application Aube

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.

Voici quelques-uns des principaux points à retenir. Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tous les sujets abordés 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