Vulkan

La nouvelle bibliothèque de hautes performances pour le GPU

Alexandre Laurent

Découvrez la nouvelle bibliothèque pour le GPU de Khronos. Celle-ci se place comme successeur d'OpenGL.

Commentez ♪

- Titre : Vulkan

- Auteur : Alexandre Laurent

- Parution : 11 mars 2015

- Mise à jour : 23 août 2015

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2015 Alexandre Laurent. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Historique

- I-B. Les problèmes d'OpenGL

- I-C. La naissance d'une nouvelle ère

- I-D. Vulkan

- II. Fonctionnalités

- III. Implémentation

- IV. Démonstrations

- IV-A. Imagination Technologies

- IV-A-1. Un CPU moins sollicité

- IV-B. Valve

- V. Conférence GDC 2015

- VI. Conférence SIGGRAPH 2015

- VII. Disponibilité

- VIII. Documentation

I - Introduction

Vulkan est le nom de la nouvelle bibliothèque de hautes performances pour le GPU. D'abord, intéressons-nous à l'histoire pour mieux comprendre les raisons qui nous ont apporté Vulkan.

I-A - Historique

OpenGL, pour Open Graphics Library, a été conçue par Silicon Graphics Inc. en 1991 et la première version publiée date de janvier 1992. OpenGL est une bibliothèque visant à exposer de manière unifiée les fonctionnalités des cartes graphiques. Un de ses grands avantages est d'être indépendante du langage et du système d'exploitation.

En 1995, Microsoft publie Direct3D qui deviendra la principale concurrente d'OpenGL.

En 2004 arrive la version 2.0 d'OpenGL, apportant le support des shaders et implémentant le GLSL (OpenGL Shading Language). Les shaders ont révolutionné le rendu qui, jusqu'à présent, était préprogrammé statiquement dans les cartes graphiques. Avec les shaders, le programmeur a la possibilité de programmer lui-même une partie du rendu effectué par la carte graphique et ainsi créer ses propres effets et optimiser le résultat.

En plus de l'intégration des shaders, OpenGL a mis à disposition les tampons de sommets (vertex buffer) et des alternatives au mode immédiat (le fait de donner des ordres un par un pour décrire les géométries, notamment avec les blocs glBegin()/glEnd()).

En 2006, le contrôle du standard est transféré à Khronos, un consortium regroupant les acteurs du monde 3D (NVIDIA, AMD, Intel, Apple, Imagination Technologies…). Depuis, OpenGL n'a cessé de progresser et de rattraper un retard par rapport aux possibilités des cartes graphiques.

Avec OpenGL 3.0 publiée en 2008, un mécanisme de dépréciation a été mis en place. L'intégralité du pipeline fixe, le mode immédiat, les listes d'affichage (display list) et le support des couleurs indexées ont été retirés. Malgré cette dépréciation, les fonctions sont toujours présentes et implémentées dans les pilotes.

En 2010, OpenGL 3.3 et OpenGL 4.0 sont publiées. La première vise le même niveau de fonctionnalités que Direct3D 10, alors que la seconde vise les fonctionnalités de Direct3D 11. La version 4 d'OpenGL apporte la tesselation. Depuis, chaque année une nouvelle version mineure d'OpenGL voit le jour, apportant les dernières nouveautés disponibles sur les cartes graphiques.

Vous pouvez suivre toutes ces évolutions en allant sur le portail de la rubrique 2D/3D/Jeux. Pour plus de facilité, n'hésitez pas à vous abonner au flux RSS, Twitter, Facebook de la rubrique.

I-B - Les problèmes d'OpenGL

OpenGL a plus de vingt ans et depuis 1992, les cartes graphiques ont énormément évolué. Une des évolutions les plus marquantes est l'apparition des shaders.
Bien qu'OpenGL 4.X intègre toutes les dernières nouveautés, le support d'OpenGL 1.0 est toujours inclus dans les pilotes graphiques. De plus, l'architecture intrinsèque d'OpenGL n'a pas changé depuis 1992 (machine à états) causant des soucis d'évolutions. En 2014, un développeur avait listé les problèmes de la bibliothèque. On peut citer :

- les vingt ans d'héritage ont rendu la bibliothèque complexe ;

- la bibliothèque ne gère pas le multithreading ;

- la compilation des shaders dépend de l'implémentation du constructeur ;

- l'absence d'outils standards/officiels pour OpenGL ;

- …

I-C - La naissance d'une nouvelle ère

Fin 2013, AMD a dévoilé une nouvelle bibliothèque graphique : Mantle. Celle-ci possède la particularité de donner aux développeurs un meilleur contrôle sur le GPU. En effet, avec les bibliothèques comme OpenGL ou encore Direct3D 11, le pilote n'a aucun moyen de savoir exactement ce que veut le développeur, et donc il n'a aucun moyen d'optimiser le processus. En donnant un accès plus bas niveau au GPU, les développeurs peuvent réaliser exactement ce qu'ils veulent. De plus, le pilote accorde une plus grande confiance aux développeurs, allégeant ainsi la complexité de l'implémentation et son utilisation CPU. Finalement, Mantle supporte le multithreading.
Peu de temps après, Microsoft présente Direct3D 12, reprenant les mêmes concepts, puis c'est au tour d'Apple avec Metal. Finalement, Khronos a aussi annoncé une évolution de la bibliothèque OpenGL, nommée OpenGL Next. Pour celle-ci, AMD a annoncé apporter tout son support et son expérience acquise avec Mantle.

I-D - Vulkan

Finalement, Khronos a dévoilé Vulkan, le successeur d'OpenGL, au cours de la Game Developers Conference 2015. Voyons ce qu'il en est vraiment.

II - Fonctionnalités

L'objectif de Vulkan est de créer une toute nouvelle bibliothèque (sans avoir à supporter d'anciennes fonctionnalités) pour les cartes récentes et ayant l'objectif de combler les lacunes d'OpenGL.

Ainsi, Vulkan apporte :

- un contrôle direct du GPU avec un impact minimal sur les performances par le pilote. Un exemple de cela est l'écriture des données directement sur le GPU au lieu de passer par des appels tels que glUniform(). Ainsi les applications peuvent implémenter leur propre stratégie d'allocation ;

- les passes de rendu (render pass) permettant de contrôler le chargement des cibles de rendu au début et à la fin du rendu ;

- une architecture compatible avec le multithread. Les tampons de commandes peuvent être remplis par plusieurs threads à la fois et même être envoyés au GPU par un thread séparé ;

- une bibliothèque unifiée pour les PC, les mobiles et les plateformes embarquées. Il n'est plus question d'avoir une version pour les PC (OpenGL) et une autre pour les mobiles (OpenGL ES). Vulkan est une seule bibliothèque pour toutes les plateformes ;

- un code intermédiaire pour les shaders. Ces derniers peuvent être maintenant envoyés au pilote au format bytecode SPIR-V. Khronos fournit un compilateur GLSL vers SPIR-V. Il sera possible à tout un chacun de faire son propre compilateur.

La finalité de Vulkan est de simplifier les pilotes, d'avoir des performances plus stables, un meilleur contrôle sur le GPU et moins de différences entre les implémentations des constructeurs.

III - Implémentation

Toutes cartes graphiques supportant OpenGL 4.3/OpenGL ES 3.1 ou supérieur pourront supporter Vulkan.

Voici un exemple de code avec Vulkan :

vkCmdBindDescriptorSet(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, textureDescriptorSet[0], 0);
vkQueueSubmit(graphicsQueue, 1, &cmdBuffer, 0, 0, fence);
vkMapMemory(staticUniformBufferMemory, 0, (void **)&data);
// ...
vkUnmapMemory(staticUniformBufferMemory);

IV - Démonstrations

IV-A - Imagination Technologies

Imagination Technologies a porté une de leurs démonstrations OpenGL ES 3.0 vers Vulkan :

Animation en format "youtube" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://www.youtube.com/watch?v=KdnRI0nquKc

La démonstration possède quelques effets graphiques en moins comparée à la version OpenGL ES 3.0 à cause de la contrainte de temps. Toutefois, dans celle-ci, vous pouvez voir :

- un rendu graphique basé sur la physique (physically-based shading) ;

- un rendu High Dynamic Range (HDR) ;

- vingt textures 2048 x 2048 au format propriétaire PVRTC ;

- deux gigaoctets de données compressées dans 266 mégaoctets grâce au format PVRTC ;

- 4 x Mutil-sample antialiasing (MSAA) ;

- un filtrage anisotropique 16x ;

- une utilisation basse du CPU et une utilisation efficace du GPU ;

- plus de 250 000 triangles ;

- des effets de posttraitements : saturation, exposition et tone mapping.

IV-A-1 - Un CPU moins sollicité

Avec Vulkan, le CPU est moins sollicité. En effet, lorsque vous faisiez un glUniform*() avec OpenGL, le pilote graphique devait allouer de la mémoire sur le GPU pour accueillir les données. Avec Vulkan, vous récupérez simplement un pointeur sur cette mémoire et vous y copiez les données. Une seule et unique allocation est nécessaire, car vous savez exactement l'espace requis pour vos données et une seule copie est effectuée.

Voici la différence en termes d'utilisation CPU entre OpenGL ES et Vulkan :

IV-B - Valve

Valve, grâce au pilote Linux open source d'Intel, a pu montrer une démonstration du moteur Source 2 utilisant Vulkan :

Animation en format "youtube" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://www.youtube.com/watch?v=0Hth4u65zfc

V - Conférence GDC 2015

Vulkan a été présentée durant la conférence Game Developers Conference 2015. Au cours de celle-ci, vous pourrez découvrir comment s'architecture la bibliothèque et comment l'utiliser. Vous y trouverez aussi une description détaillée de SPIR-V.

Voir le compte-rendu de la conférence sur Vulkan.

VI - Conférence SIGGRAPH 2015

De nouvelles informations ont été diffusées durant la conférence SIGGRAPH 2015. On peut y découvrir les avancées réalisées entre la GDC 2015 et SIGGRAPH 2015 ainsi que des détails supplémentaires sur SPIR-V et les réalisations de la communauté liées à cette spécification.

Voir le diaporama pour la presse .

Graham Sellers (AMD) est rentré dans les détails de la bibliothèque Vulkan.

Voir la présentation de Graham Sellers .

Dan Ginsburg (Valve) a discuté du portage du moteur de jeux Source 2 pour Vulkan.

Voir la présentation de Dan Ginsburg .

Finalement Tim Foley s'est penché sur les similitudes et les différences des bibliothèques de nouvelle génération.

Voir la présentation de Tim Foley .

VII - Disponibilité

La spécification finale devrait être publiée au cours de l'année 2015. La plupart des constructeurs de pilotes ont d'ores et déjà annoncé que leurs pilotes seront prêts à ce moment-là.

VIII - Documentation

Site officiel

Présentation de Khronos à la GDC 2015

Présentation de Valve à la GDC 2015

Spécification du langage intermédiaire SPIR-V

Introduction au langage intermédiaire SPIR-V