Navigation

Tutoriel précédent : Les cartes accélératrices 3D   Sommaire   Tutoriel suivant : Pipeline de sommets

II. 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.

III. 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 machines 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'exploitations et de cartes graphiques ont inventés 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.

IV. 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émoires : 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.

Tampon circulaire

À 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.

Tampon circulaire

Si jamais ce tampon circulaire est totalement remplit, 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.

V. 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.

V-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ération3D, 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 à partie 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é

V-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.

V-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