Les cartes graphiques/L'historique des premières cartes d'affichage

Dans le chapitre précédent, nous avons vu ce qu'il y a dans une carte d'affichage et comment elle fonctionne dans les grandes lignes. Nous avons abordé beaucoup de concepts théoriques utiles pour la suite du cours, ainsi que les bases théoriques pour parler des cartes d'affichage. Maintenant, nous allons faire un rapide aperçu de l'histoire des cartes d'affichage. Nous allons voir les toutes premières cartes d'affichage et voir comment elles ont évoluées dans le temps. Les toutes premières cartes d'affichage portaient le nom de cartes d'affichage en mode texte. Elles ont été suivies par les cartes d'affichage en mode graphique. Paradoxalement, les cartes d'affichage en mode texte sont de loin les moins intuitives et elles sont plus complexes que les cartes d'affichage en mode graphique. Les limitations de la technologie de l'époque rendaient plus adaptées les cartes en mode texte, notamment les limitations en terme de mémoire vidéo. La faible taille de la mémoire rendait impossible l'usage d'un framebuffer proprement dit, ce qui fait que les ingénieurs ont utilisé un moyen de contournement, qui a donné naissance aux cartes graphiques en mode texte. Par la suite, avec l'amélioration de la technologie des mémoires, les cartes d'affichage avec un framebuffer sont apparues et ont remplacé les complexes cartes d'affichage en mode texte.

Les cartes d'affichage en mode texteModifier

 
Illustration du mode texte.

Les premières cartes graphiques fonctionnaient en mode texte, c'est à dire qu'elles traitaient des caractères et non des pixels. L'écran était découpé en carré ou en rectangles de taille fixe, contenant chacun un caractère. Les caractères affichables sont des lettres, des chiffres, ou des symboles courants, même si des caractères spéciaux sont disponibles. La carte d'affichage traitait les caractère comme un tout et il était impossible de modifier des pixels individuellement. Ceux-ci sont encodés dans un jeu de caractère spécifique (ASCII, ISO-8859, etc.), qui est généralement l'ASCII.

Ce mode texte est toujours présent dans nos cartes graphiques actuelles et est encore utilisé par le BIOS, ce qui lui donne cet aspect désuet et moche des plus inimitable.

Tous les caractères sont des images de taille fixe, que ce soit en largeur ou en hauteur. Par exemple, un caractère peut faire 8 pixels de haut et 8 pixels de large, sur les écrans cathodiques. Sur les écrans LCD, les pixels sont carrés et les caractères font 16 pixels de haut par 8 de large pour avoir un aspect rectangulaire. Les images de chaque caractère sont mémorisées dans une mémoire : la table des caractères. Certaines cartes graphiques permettent à l'utilisateur de créer ses propres caractères en modifiant cette table. La mémoire de caractères est une mémoire ROM/EEPROM. Dans cette mémoire, chaque caractère est représenté par une matrice de pixels, avec un bit par pixel. On pourrait croire que la table des caractère telle que si l'on envoie le code ASCII sur l'entrée d'adresse, on récupère en sortie l'image du caractère associé. Mais cette solution simple est irréaliste : un simple caractère monochrome de 8 pixels de large et de 8 pixels de haut demanderait près de 64 bits en sortie, ce qui est impraticable, surtout pour les mémoires de l'époque. En réalité, la mémoire de caractère a une sortie de 1 bit, le bit en question étant pris dans l'image du caractère sélectionné. L'entrée d'adresse s'obtient alors en concaténant trois informations : le code ASCII pour sélectionner le caractère, le numéro de la ligne et le numéro de la colonne pour sélectionner le bit dans l'image du caractère.

 
Représentation d'un caractère à l'écran et dans la table de caractère.

Le tampon de texte (text buffer) est une mémoire dans laquelle les caractères à afficher sont placés les uns à la suite des autres. Le processeur envoie les caractères à afficher un par un, ceux-ci étant accumulés dans le tampon de texte au fur et à mesure de leur arrivée. Chaque caractère est stocké en mémoire avec deux octets : un octet pour le code ASCII, suivi d'un octet pour les attributs. Les attributs des caractères sont des informations qui indiquent si le caractère clignote, sa couleur, sa luminosité, si le caractère doit être souligné, etc. Une gestion minimale de la couleur est parfois présente. Le tout est mémorisé dan un octet, à la suite de leur code ASCII. L'avantage du mode texte est qu'il utilise très peu de mémoire vidéo : on ne code que les caractères et non des pixels indépendants, et un caractère correspond à beaucoup de pixels. La carte graphique contient un circuit chargé de gérer ces attributs des caractères : l'ATC (Attribute Controller), aussi appelé le contrôleur d'attributs. Il est situé juste en aval du tampon de texte

Vient ensuite le CRTC (Cathod Ray Tube Controller) ou contrôleur de tube cathodique, qui gère l'affichage sur l'écran proprement dit. Sur les vieux écrans CRT, les pixels sont affichés les uns après les autres, ligne par ligne, en commençant par le pixel en haut à gauche. Pour cela, il se souvient du prochain pixel à afficher grâce à deux registres : un registre Y pour la ligne, et un registre X pour la colonne. Évidemment, les deux registres sont incrémentés régulièrement afin de passer au pixel suivant et repassent à zéro quand on les incrémente au-delà de leur valeur maximale.

Mais sur une carte en mode texte, on n'a pas accès directement aux pixels en mémoire vidéo. À la place, on doit sélectionner le caractère à afficher, puis sélectionner le pixel dans celui-ci, ce qui demande la collaboration de la mémoire de caractères et le tampon de texte. Le CRTC va déduire à quel caractère correspond le pixel choisit, et le récupérer dans le tampon de texte. Là, le code du caractère est envoyé à la mémoire de caractère, avec quelques informations pour sélectionner le numéro de ligne et le numéro de colonne. le pixel récupéré dans la mémoire de caractère est alors envoyé à l'écran. Concrètement, les calcul à faire pour déterminer le caractère et pour trouver les numéros de ligne/colonne sont très simples, sans compter que les deux sont liés. Prenons par exemple un écran dont les caractère font tous 12 pixels de large et 8 pixels de haut. Le pixel de coordonnées X (largeur) et Y (hauteur) correspond au caractère de position X/12 et Y/8. Le reste de la première division donne la position de la colonne pour la mémoire de caractère, alors que le reste de la seconde division donne le numéro de ligne.

Si les caractères ont une largeur et une hauteur qui sont des puissances de deux, les divisions se simplifient : la position du caractère dans la mémoire se calcule alors à partir des bits de poids forts des compteurs X et Y, alors que les bits de poids faible permettent de donner le numéro de ligne et de colonne pour la mémoire de caractère. Dans le diagramme ci-dessus, les 3 bits de poids faible des registres X et Y de balayage des pixels servent à adresser le pixel parmi les 8x8 du bloc correspondant au caractère à afficher. L'index de ce caractère est lu dans le tampon de texte, adressé par les bits restant des registres X et Y.

 
Balayage des pixels par le CRTC pour un mode texte avec des caractères de 8x8 pixels.

Enfin, le pixel à afficher est envoyé à l'écran. Les écrans assez anciens fonctionnent en analogiques et non en numérique, ce qui fait que les cartes d'affichage de l'époque contenaient un DAC (Digital-Analogic Converter) pour convertir les données binaires en données analogiques (courant appliqué à chaque canon à électron pour le bleu, le vert et le rouge).

 
Architecture interne d'une carte d'affichage en mode texte

Les cartes d'affichage en mode graphiqueModifier

Les cartes en mode texte ont rapidement été remplacées par des cartes graphiques capables de colorier chaque pixel de l'écran individuellement. Il s'agit d'une avancée énorme, qui permet beaucoup plus de flexibilité dans l'affichage. Ces cartes graphiques étaient conçues avec des composants similaires aux composants des cartes graphiques à mode texte, mais avec quelques simplifications. Premièrement, la mémoire de caractères disparait (ou n'est pas utilisée en mode graphique). Ensuite, la mémoire vidéo est remplacée par un framebuffer, qui mémorise des pixels et non des caractères. Ensuite, le CRTC est modifié pour balayer le framebuffer ligne par ligne, pixel par pixel. Il peut gérer différentes résolutions, quelques registres permettant de configurer la résolution voulue.

La couleur fait son apparition, grâce à la technique de la palette indicée. Les couleurs étaient codées sur 4 bits, 8 bits, à la rigueur 16, alors que les couleurs acceptées par l'écran étaient au format RGB. La table de correspondance utilisée pour traduire les couleurs au format RGB s'appelait la Color Look-up Table. Dans les cas plus simples, il s'agissait d'une ROM qui mémorisait la couleur RGB pour chaque numéro envoyé en adresse. Dans les cas les plus courants, cette mémoire était une RAM, ce qui permettait de changer la palette d'une application à l'autre sans aucun problème, comme on l'a vu plus haut. La Color Look-up Table était parfois fusionnée avec le DAC, et formait ce qu'on appelait le RAMDAC.

Le cas le plus simple est celui des premiers modes CGA où 4 bits étaient utilisés pour indiquer la couleur : 1 bit pour chaque composante rouge, verte et bleue et 1 bit pour indiquer l'intensité (sombre / clair).

 
Architecture interne d'une carte d'affichage en mode graphique