Publié le 8 janvier 2025
Utilisation de la vue Texture
Les vues de texture GPU héritent actuellement de tous les indicateurs d'utilisation de leur texture GPU source. Cela peut poser problème, car certains formats de vue ne sont pas compatibles avec certains usages. Pour résoudre ce problème, appeler createView()
avec le membre facultatif usage
vous permet de spécifier explicitement un sous-ensemble des indicateurs d'utilisation de la texture source compatibles avec le format de vue choisi.
Cette modification permet une validation préalable et un contrôle plus précis de l'utilisation de la vue. Elle s'aligne également sur d'autres API graphiques, où les indicateurs d'utilisation sont des paramètres courants dans la création de vues, ce qui offre des possibilités d'optimisation.
Consultez l'extrait de code suivant, l'entrée chromestatus et l'problème 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.
});
Mélange de textures à virgule flottante 32 bits
Les textures à virgule flottante 32 bits sont essentielles pour le rendu HDR afin de préserver une large plage de valeurs de couleur et d'éviter les artefacts de bandes de couleur. Par exemple, dans la visualisation scientifique.
La nouvelle fonctionnalité GPU "float32-blendable"
permet de mélanger les textures GPU avec les formats "r32float"
, "rg32float"
et "rgba32float"
. Il est désormais possible de créer un pipeline de rendu qui utilise le mélange avec n'importe quel élément joint au format float32 lorsque vous demandez un appareil GPU avec cette fonctionnalité.
Consultez l'extrait suivant, l'entrée chromestatus et l'problème 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...
Attribut adapterInfo
de GPUDevice
Il est important que les bibliothèques qui utilisent des objets GPUDevice
fournis par l'utilisateur accèdent aux informations sur le GPU physique, car elles peuvent avoir besoin d'optimiser ou d'implémenter des solutions de contournement en fonction de l'architecture du GPU. Bien qu'il soit possible d'accéder à ces informations via l'objet GPUAdapter
, il n'existe aucun moyen direct de les obtenir à partir d'un GPUDevice
seul. Cela peut être gênant, car les utilisateurs peuvent être amenés à fournir des informations supplémentaires en plus de l'GPUDevice
.
Pour résoudre ce problème, GPUAdapterInfo
est désormais exposé via l'attribut GPUDevice
adapterInfo
. Ils sont semblables à l'attribut GPUAdapter
info
existant.
Consultez l'extrait de code suivant, l'entrée chromestatus et le problème 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 configuration du contexte du canevas avec un format non valide génère une erreur JavaScript
Auparavant, l'utilisation d'un format de texture non valide avec la méthode configure()
du contexte de canevas GPU entraînait une erreur de validation du GPU. Cette valeur a été modifiée pour générer une exception JavaScript TypeError
. Cela évite les scénarios où getCurrentTexture()
renvoie une texture GPU valide malgré une configuration incorrecte du contexte de canevas GPU. Pour en savoir plus, consultez le problème 372837859.
Filtrage des restrictions d'échantillonneur sur les textures
L'utilisation de textures au format "sint"
, "uint"
et depth"
avec des échantillons de filtrage était auparavant autorisée. Il interdit désormais correctement l'utilisation d'une texture au format "sint"
ou "uint"
avec un échantillonneur de filtrage. Notez qu'un avertissement s'affiche actuellement si vous utilisez une texture depth"
avec un échantillonneur de filtrage, car cette pratique ne sera plus autorisée à l'avenir. Consultez le problème 376497143.
Ces restrictions signifient que l'utilisation d'une texture de profondeur avec un échantillonneur sans filtrage nécessite la création manuelle de mises en page de groupes de liaison. En effet, les mises en page de groupe de liaison générées automatiquement ne sont pas encore compatibles avec cette combinaison. La problématique de spécification 4952 contient une proposition en cours d'examen pour résoudre cette limitation à l'avenir.
Test étendu des sous-groupes
L'expérimentation des sous-groupes, qui devait initialement se terminer dans Chrome 131, a été étendue jusqu'à Chrome 133 et se terminera le 16 avril 2025. Bien que le premier test d'origine se soit concentré sur les performances, il manquait de garanties de portabilité essentielles. Ces mesures de protection seront désormais ajoutées, ce qui peut entraîner des erreurs dans le code existant.
Améliorer l'expérience des développeurs
Un avertissement s'affiche désormais dans DevTools lorsque l'option powerPreference
est utilisée avec requestAdapter()
sous Windows. Cet avertissement sera supprimé lorsque Chrome saura utiliser deux GPU différents et composer les résultats entre eux. Voir le problème 369219127.
La taille du tampon GPU est désormais indiquée dans le message d'erreur lorsque vous créez un tampon GPU trop volumineux. Consultez le problème 374167798.
Compatibilité expérimentale avec les formats de texture normalisés 16 bits
Les formats de texture normalisés signés et non signés 16 bits sont désormais disponibles à titre expérimental respectivement derrière les fonctionnalités de GPU "chromium-experimental-snorm16-texture-formats"
et "chromium-experimental-unorm16-texture-formats"
, tandis qu'ils sont en cours de discussion pour leur normalisation.
Ces fonctionnalités permettent de prendre en charge les formats de texture normalisés 16 bits avec les utilisations COPY_SRC
, COPY_DST
, TEXTURE_BINDING
et RENDER_ATTACHMENT
, le multiéchantillonnage et les fonctionnalités de résolution. Les formats supplémentaires sont "r16unorm"
, "rg16unorm"
, "rgba16unorm"
, "r16snorm"
, "rg16snorm"
et "rgba16snorm"
.
Tant que ces fonctionnalités expérimentales ne sont pas standardisées, activez l'indicateur "Unsafe WebGPU Support" (Compatibilité avec WebGPU non sécurisé) à chrome://flags/#enable-unsafe-webgpu
pour les rendre disponibles dans Chrome.
Consultez l'extrait de code suivant et le problème 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...
Informations Dawn
Les méthodes EnumerateFeatures(FeatureName * features)
de wgpu::Adapter
et wgpu::Device
sont obsolètes et remplacées par GetFeatures(SupportedFeatures * features)
. Consultez le problème 368672123.
L'API C webgpu.h a remplacé tous les char const *
par une structure WGPUStringView
qui définit une vue dans une chaîne encodée en UTF-8. Il agit comme un pointeur vers les données de la chaîne, associé à une longueur. Vous pouvez ainsi travailler avec des parties d'une chaîne sans avoir à la copier. Consultez le problème 42241188.
Il ne s'agit là que de quelques-uns des points clés. Consultez la liste exhaustive des commits.
Nouveautés de WebGPU
Liste de tous les éléments abordés dans la série Nouveautés de WebGPU.
Chrome 132
- Utilisation de la vue Texture
- Mélange de textures à virgule flottante 32 bits
- Attribut adapterInfo de GPUDevice
- Configurer le contexte de canevas avec un format non valide génère une erreur JavaScript
- Filtrer les restrictions d'échantillonneur sur les textures
- Tests étendus sur les sous-groupes
- Améliorer l'expérience des développeurs
- Compatibilité expérimentale avec les formats de texture normalisés 16 bits
- Informations sur Dawn
Chrome 131
- Couper les distances en WGSL
- GPUCanvasContext getConfiguration()
- Les primitives de point et de ligne ne doivent pas comporter de biais de profondeur.
- Fonctions intégrées d'analyse inclusive pour les sous-groupes
- Compatibilité expérimentale avec le multi-dessin indirect
- Option de compilation du module de nuanceur "math strict"
- Suppression de la méthode requestAdapterInfo() de GPUAdapter
- Informations sur Dawn
Chrome 130
- Mélange de deux sources
- Améliorations du temps de compilation des nuanceurs sur Metal
- Obsolete de la méthode requestAdapterInfo() de GPUAdapter
- Informations sur Dawn
Chrome 129
- Compatibilité HDR avec le mode de mappage des tons du canevas
- Prise en charge des sous-groupes étendus
- Informations sur Dawn
Chrome 128
- Tester les sous-groupes
- Abandon du paramètre de biais de profondeur pour les lignes et les points
- Masquer l'avertissement DevTools d'erreur non capturée si preventDefault
- WGSL effectue d'abord l'interpolation de l'échantillonnage, puis
- Informations sur Dawn
Chrome 127
- Compatibilité expérimentale d'OpenGL ES sur Android
- Attribut info de GPUAdapter
- Améliorations de l'interopérabilité WebAssembly
- Amélioration des erreurs de l'encodeur de commandes
- Informations sur Dawn
Chrome 126
- Augmentation de la limite maxTextureArrayLayers
- Optimisation de l'importation de tampons pour le backend Vulkan
- Améliorations du temps de compilation des nuanceurs
- Les tampons de commande envoyés doivent être uniques
- Informations sur Dawn
Chrome 125
- Sous-groupes (fonctionnalité en cours de développement)
- Affichage d'une tranche de texture 3D
- Informations sur Dawn
Chrome 124
- Textures de stockage en lecture seule et en lecture/écriture
- Compatibilité avec les service workers et les workers partagés
- Nouveaux attributs d'informations sur l'adaptateur
- Corrections de bugs
- Informations sur Dawn
Chrome 123
- Compatibilité des fonctions intégrées DP4a avec WGSL
- Paramètres de pointeur non restreints dans WGSL
- Syntaxe simplifiée pour le déréférencement des composites en WGSL
- État en lecture seule distinct pour les aspects du pochoir et de la profondeur
- Informations sur Dawn
Chrome 122
- Élargir la couverture avec le mode de compatibilité (fonctionnalité en cours de développement)
- Augmentation de la limite maxVertexAttributes
- Informations sur Dawn
Chrome 121
- Compatibilité avec WebGPU sur Android
- Utiliser DXC au lieu de FXC pour la compilation de nuanceurs sous Windows
- Requêtes de code temporel dans les passes de calcul et de rendu
- Points d'entrée par défaut vers les modules de nuanceurs
- Compatibilité avec display-p3 en tant qu'espace de couleurs GPUExternalTexture
- Informations sur les tas de mémoire
- Informations sur Dawn
Chrome 120
- Compatibilité avec les valeurs à virgule flottante 16 bits dans WGSL
- Repousser les limites
- Modifications apportées à l'état du tampon de profondeur
- Modifications des informations sur les adaptateurs
- Quantification des requêtes d'horodatage
- Fonctionnalités de nettoyage de printemps
Chrome 119
- Textures à virgule flottante 32 bits filtrables
- Format de sommet unorm10-10-10-2
- Format de texture rgb10a2uint
- Informations sur Dawn
Chrome 118
- Compatibilité avec HTMLImageElement et ImageData dans
copyExternalImageToTexture()
- Compatibilité expérimentale avec la texture de stockage en lecture-écriture et en lecture seule
- Informations sur Dawn
Chrome 117
- Désactiver le tampon de sommets
- Désactiver le groupe de liaisons
- Ignorer les erreurs de création de pipeline asynchrone en cas de perte de l'appareil
- Mise à jour de la création de modules de nuanceurs SPIR-V
- Améliorer l'expérience des développeurs
- Mise en cache des pipelines avec une mise en page générée automatiquement
- Informations sur Dawn
Chrome 116
- Intégration de WebCodecs
- Appareil égaré renvoyé par GPUAdapter
requestDevice()
- Maintenir la fluidité de la lecture vidéo si
importExternalTexture()
est appelé - Conformité aux spécifications
- Améliorer l'expérience des développeurs
- Informations sur Dawn
Chrome 115
- Extensions de langage WGSL prises en charge
- Compatibilité expérimentale avec Direct3D 11
- Obtenir un GPU distinct par défaut sur l'alimentation secteur
- Améliorer l'expérience des développeurs
- Informations sur Dawn
Chrome 114
- Optimiser JavaScript
- getCurrentTexture() sur un canevas non configuré génère une erreur InvalidStateError
- Mises à jour de WGSL
- Informations sur Dawn