Les cartes graphiques

Chapitre 2.1 : Pilotage par le logiciel

Guy Grave

Maintenant, on sait à peu près ce qu'on trouve dans une carte graphique. Mais nous ne sommes pas au bout de nos surprises.

Notre carte graphique est un périphérique comme un autre, connecté sur notre carte mère (sauf pour certaines cartes graphiques intégrées dans le processeur). Notre processeur doit donc envoyer des informations à notre carte graphique pour que celle-ci fasse son travail. Voyons tout ce qui se passe dans ces transferts.

Commentez

- Titre : Les cartes graphiques

- Auteur : Guy Grave

- Parution : 3 avril 2014

- Mise à jour : 25 novembre 2019

- Licence : Le contenu de cet article est rédigé par Guy Grave et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- Navigation

- I. Introduction

- II. DirectX et OpenGL

- III. Pilotes de carte graphique

- IV. Processeur de commandes

- IV-A. Commandes

- IV-B. Parallélisme

- IV-C. Synchronisation CPU

- Navigation

Navigation

Tutoriel précédent : Les cartes accélératrices 3D

Sommaire

Tutoriel suivant : Pipeline de sommets

I - Introduction

Maintenant, on sait à peu près ce qu'on trouve dans une carte graphique. Mais nous ne sommes pas au bout de nos surprises.

Notre carte graphique est un périphérique comme un autre, connecté sur notre carte mère (sauf pour certaines cartes graphiques intégrées dans le processeur). Notre processeur doit donc envoyer des informations à notre carte graphique pour que celle-ci fasse son travail. Voyons tout ce qui se passe dans ces transferts.

II - DirectX et OpenGL

Généralement, notre carte graphique sert à accélérer les calculs de rendu 3D, le plus souvent rencontrés dans un jeu vidéo. Il arrive aussi que notre carte graphique serve à accélérer des applications de conception assistée par ordinateur (solidworks), ou de calcul d'images 3D (blender, maya, etc.). Dans certains cas, cela peut servir à accélérer le traitement de l'affichage. Si vous ne me croyez pas, essayez d'utiliser Windows sans pilote de carte graphique, vous verrez de quoi je parle. Bref, il y a forcément un programme, ou un logiciel qui utilise notre carte graphique et lui délègue ses calculs.

Pour déléguer ses calculs à la carte 3D, notre application pourrait parfaitement communiquer directement avec la carte graphique. Rien de bien compliqué : il suffit d'aller écrire dans les registres de la carte graphique et dans sa mémoire vidéo. Quelques instructions-machine peuvent suffire pour configurer notre carte graphique et lui faire exécuter quelques actions préprogrammées.

Seul problème : cela ne marchera qu'avec les cartes graphiques d'une marque bien précise, et pour un laps de temps assez court. Car nos cartes graphiques évoluent rapidement. Dans ces conditions, configurer directement la carte graphique est une solution assez limitée. Le programme conçu ainsi pourra communiquer avec un ou deux modèles de cartes, et la compatibilité sera presque inexistante.

Pour résoudre ce problème, les concepteurs de systèmes d'exploitation et de cartes graphiques ont inventé une solution : les bibliothèques 3D. Ces bibliothèques sont des rassemblements de programmes, qu'une application pourra exécuter à sa guise. Elles fournissent des « sous-programmes » de base, des fonctions, que notre application pourra exécuter au besoin. Ces programmes effectueront chacun une tâche bien précise.

Des bibliothèques spécialement dédiées à la conception d'applications 3D existent. De nos jours, les plus connues sont DirectX et OpenGL.

III - Pilotes de carte graphique

Les fonctions de ces bibliothèques vont faire quelques traitements, et vont préparer des données à envoyer à la carte graphique. Généralement, ces données sont des gros paquets de données sur lesquels la carte graphique va devoir effectuer un traitement. Le pilote de la carte graphique va alors prendre ces données, et va s'occuper de les communiquer à la carte graphique.

Dans les faits, un pilote de carte graphique est composé de plusieurs éléments logiciels. Il peut gérer la mémoire de la carte graphique : où placer les textures, les sommets, et les différents tampons de rendu. Le pilote de carte graphique est aussi chargé de traduire les shaders, ces programmes à exécuter sur notre carte graphique. Ces shaders sont écrits dans un langage de programmation comme le HLSL ou le GLSL. Ils doivent être traduits dans le langage machine de la carte graphique avant que celle-ci puisse les exécuter.

Cet envoi des données à la carte graphique ne se fait pas immédiatement. Après tout, notre carte graphique ne fonctionne pas forcément assez rapidement comparé au processeur. Il arrive qu'elle n'ait pas fini de traiter les données de l'envoi précédent. Dans ces conditions, on ne peut pas envoyer les données : on doit attendre que la carte graphique soit libre. Pour faire attendre les données en attendant qu'elle soit libre, les pilotes de la carte graphique vont placer celles-ci dans une portion de la mémoire centrale de l'ordinateur (la RAM). Cette portion s'appelle le tampon circulaire.

Ce tampon circulaire est ce qu'on appelle une file. C'est une zone de mémoire dans laquelle on stocke des données dans un certain ordre. On peut y ajouter de nouvelles données, et en retirer. Quand on retire une donnée, c'est la donnée la plus ancienne qui quitte la file. Ces files sont implémentées avec un tableau, auquel on ajoute deux adresses mémoire : une pour indiquer le début de la file, et l'autre la fin. Le début de la file correspond à l'endroit en mémoire où l'on va insérer les nouvelles données. La fin de la file correspond à la position de la donnée la plus ancienne en mémoire.

À chaque ajout de donnée, l'adresse de la donnée la plus récente est augmentée de la taille de la donnée, afin de réserver la place pour la donnée à ajouter. De même, lors d'une suppression, le pointeur de la donnée la plus ancienne est aussi augmenté, afin de libérer la place qu'il occupait.

Ce tableau a une taille fixe. Si jamais celui-ci se remplit jusqu'à la dernière case, (ici la cinquième), il se peut malgré tout qu'il reste de la place au début du tableau : des retraits ont libéré de la place. L'insertion des données reprend au tout début du tableau.

Si jamais ce tampon circulaire est totalement rempli, le driver n'accepte plus de demande en provenance des applications. Il a le pouvoir de stopper celles-ci, afin de leur faire attendre que de la place se libère. Un tampon circulaire plein est généralement mauvais signe : cela signifie que la carte graphique est trop lente pour traiter les demandes qui lui sont faites.

Par contre, il arrive que le tampon circulaire soit très souvent vide : dans ce cas, c'est simplement que la carte graphique est trop rapide comparé au processeur. Celui-ci n'arrive alors pas à donner assez de commandes à la carte graphique pour l'occuper suffisamment.

IV - Processeur de commandes

Dès que la carte graphique peut accepter une nouvelle commande, celle-ci va être envoyée à la carte graphique. Si la carte graphique ne peut pas lire en mémoire vidéo, cette commande sera envoyée dans la mémoire vidéo. Ces informations seront alors gérées par le processeur de commandes, un gros circuit chargé de piloter les différentes commandes reçues par la carte graphique.

IV-A - Commandes

Depuis tout à l'heure, je parle de commandes. Certaines de ces commandes vont demander à la carte graphique d'effectuer une opération 2D, d'autres une opération 3D, et d'autres une opération concernant l'accélération vidéo. Mais vous vous demandez à quoi celles-ci peuvent bien ressembler. Eh bien je vais donner un exemple. Nous allons prendre les commandes de la carte graphique AMD Radeon X1800.

Voici par exemple à quoi ressemblent les commandes 2D :

Commandes 2D

Fonction

PAINT

peindre des rectangles d'une certaine couleur

PAINT_MULTI

Peindre des rectangles (pas les mêmes paramètres que PAINT)

BITBLT

Copie d'un bloc de mémoire dans un autre

BITBLT_MULTI

Plusieurs copies de blocs de mémoire dans d'autres

TRANS_BITBLT

Copie de blocs de mémoire avec un masque

NEXTCHAR

Afficher un caractère avec une certaine couleur

HOSTDATA_BLT

Écriture d'une chaîne de caractères à l'écran ou copier une série d'images bitmap dans la mémoire vidéo

POLYLINE

Afficher des lignes reliées entre elles

POLYSCANLINES

Afficher des lignes

PLY_NEXTSCAN

Afficher plusieurs lignes simples

SET_SCISSORS

Utiliser des coupes

LOAD_PALETTE

Charger la palette pour affichage 2D.

D'autres commandes servent à synchroniser le processeur et le GPU :

Commandes de synchronisation

Fonction

NOP

ne rien faire

WAIT_SEMAPHORE

Attente de synchronisation avec un sémaphore

WAIT_MEM

Attendre du processeur de commandes que la mémoire vidéo soit disponible et inoccupée par le CPU

D'autres commandes servent pour l'affichage 3D : elles peuvent afficher une image à partir de paquets de sommets, ou préparer le passage d'une image à une autre.

Commandes 3D

3D_DRAW_VBUF

3D_DRAW_IMMD

3D_DRAW_INDX

3D_LOAD_VBPNTR

INDX_BUFFER

3D_DRAW_VBUF_2

3D_DRAW_IMMD_2

3D_DRAW_INDX_2

3D_CLEAR_HIZ

3D_DRAW_128

Et enfin, certaines commandes servent pour l'accélération des vidéos.

Commandes vidéo MPEG

Fonction

MPEG_INDEX

Génération de données pour affichage MPEG accéléré

IV-B - Parallélisme

Le processeur de commandes est toutefois assez intelligent. Sur les cartes graphiques modernes, il est capable d'effectuer plusieurs commandes à la fois. Il peut en effet démarrer une commande avant que les commandes précédentes soient terminées. Cela peut permettre d'utiliser la carte graphique de manière optimale. Par exemple, il est possible d'exécuter une commande ne requérant que des calculs, en même temps qu'une commande qui ne fait que des copies en mémoire.

Toutefois, cette parallélisation du processeur de commandes a un désavantage : celui-ci doit gérer les synchronisations entre commandes.

IV-C - Synchronisation CPU

Ce processeur de commandes sert aussi à synchroniser la carte graphique et le processeur. Cela peut permettre au processeur et à la carte graphique de modifier le tampon circulaire en même temps. Le tampon de commandes contient des registres, qui permettent au processeur de savoir où la carte graphique en est dans l'exécution de la commande. Par exemple, on peut empêcher la carte graphique d'accéder à la mémoire vidéo pendant que le processeur se charge d'écrire des textures dedans.

Navigation

Tutoriel précédent : Les cartes accélératrices 3D

Sommaire

Tutoriel suivant : Pipeline de sommets