Il s'agit du deuxième article de la série "Cartes 3D du séisme de la fin des années 90". Dans la première partie, nous avons examiné la
Rendition Vérité 1000 de fin 1996 et un port de jeu spécial pour cela appelé vQuake. Rendition a réussi à vaincre tout le monde sur le marché Quake. Pendant une courte période, il est resté la seule carte capable de lancer le blockbuster id Software avec une accélération matérielle.
Mais tout a changé en janvier 1997, lorsque id Software a publié une nouvelle version de Quake appelée GLQuake. Étant donné que le port a été créé à l'aide de miniGL (un sous-ensemble de la norme OpenGL 1.1), tout fabricant d'accélérateurs matériels pourrait écrire des pilotes miniGL et participer à la course aux cartes 3D. A partir de ce moment, la possibilité de compétition était ouverte à tous. L'objectif était de générer autant d'images par seconde que possible. La récompense était la renommée et l'argent des clients. Après avoir brièvement étudié l'histoire, on peut comprendre que les deux autorités de l'époque considéraient sans doute les rois des deux producteurs de montagne.
Jusqu'à présent, cela ne fait aucun doute: le monde de Quake est dirigé par Voodoo. Et puisque Quake règne sur le monde des jeux, acheter 3Dfx Voodoo est presque inévitable pour les joueurs.
- Tom's Hardware, 30 novembre 1997
3DFX Voodoo 1
- La norme par laquelle toutes les autres cartes sont mesurées.
- Fichier John Carmack .plan. 12 février 1998 [2]
Juste en regardant les spécifications
[3] , qui indiquaient un taux de remplissage de 50 mégapixels / s, j'ai immédiatement voulu étudier cette carte et comprendre ce que 3dfx a fait pour créer un produit aussi puissant.
3dfx Interactive
Ross Smith, Scott Sellers et Gary Tarolli se sont rencontrés lorsqu'ils ont travaillé ensemble chez SGI
[4] . Après avoir travaillé un peu chez Pellucid, où ils ont essayé de vendre des cartes IrisVision pour PC (en 1994, ces cartes coûtaient 4000 $ chacune), des collègues ont fondé leur propre entreprise avec le soutien de Gordy Campbell TechFarm. 3dfx Interactive, dont le siège est à San Jose, en Californie, a été fondée en 1994.
Initialement, la société avait l'intention de créer des systèmes matériels puissants pour les machines d'arcade, mais a changé de cap en développant des cartes PC. Il y avait trois raisons à cela.
- Prix assez bas de la RAM.
- En commençant par FastPage RAM puis EDO RAM, la latence en RAM a diminué de 30%. Maintenant, la mémoire peut fonctionner avec une fréquence allant jusqu'à 50 MHz.
- Les jeux en 3D (ou en pseudo-3D) sont devenus de plus en plus populaires. Le succès de jeux tels que DOOM, Descent et Wing Commander III a montré qu'un marché des accélérateurs 3D est sur le point d'émerger.
Les fondateurs de la société ont réalisé qu'ils devaient créer quelque chose de puissant, conçu pour les jeux et avec un prix de détail compris entre 300 et 400 dollars. En 1996, la société a annoncé la création de l'architecture SST1 (du nom des fondateurs - Sellers-Smith-Tarolli-1), qui a rapidement été concédée sous licence par plusieurs OEM tels que Diamond, Canopus, Innovision et ColorMAX. Pour leur création est venu le nom marketing "Voodoo1", mettant l'accent sur ses performances magiques.
Comme avec le V1000, lors de la création de cartes, les fabricants ne pouvaient changer que le type de RAM sélectionné (EDO ou DRAM), la couleur des cartes et la disposition physique des puces. Presque tout le reste était standardisé.
Diamond Monster 3D, image tirée de vgamuseum.info.Canopus Pure3D, image tirée de vgamuseum.info.BIOSTAR Venus 3D, image tirée de vgamuseum.info.ORCHID Righteous 3D, image tirée de vgamuseum.info.En regardant la carte SST1, il était frappant de voir à quel point elle était différente de ses concurrents - Rendition Verite 1000 et NVidia NV1.
Premièrement, 3dfx a franchi une étape audacieuse, abandonnant le support du rendu 2D. Voodoo1 avait deux ports VGA, l'un utilisé comme sortie et l'autre comme entrée. La carte a été développée en complément, elle a pris en entrée la sortie d'une carte VGA bidimensionnelle, déjà installée dans l'ordinateur. Lorsque l'utilisateur a travaillé avec le système d'exploitation (DOS ou Windows), Voodoo1 a simplement redirigé le signal de son entrée VGA vers la sortie VGA. Lors du passage en mode 3D, Voodoo1 a pris le contrôle de la sortie VGA et ignoré le signal de son entrée VGA. Certaines cartes avaient un interrupteur mécanique qui cliquait lors du basculement entre les modes 2D et 3D. Cette décision signifiait que la carte ne pouvait être utilisée que pour le rendu plein écran, il n'y avait pas de mode «fenêtre».
Le deuxième aspect remarquable de SST1 était qu'il n'était pas fabriqué à partir d'un seul processeur, mais de deux ASIC non programmables (circuit intégré spécifique à l'application, circuits intégrés à usage spécial). Si vous marchez le long des traces de pneus, vous pouvez voir que chacune des puces étiquetées «TMU» et «FBI» a sa propre RAM. Sur la carte mémoire, 4 mégaoctets de RAM ont été répartis également: 2 mégaoctets TMU pour le stockage des textures et 2 mégaoctets FBI pour le stockage du tampon de couleur et du tampon z, tandis que les valeurs étaient stockées respectivement sous forme de RGBA 16 bits et d'entier / demi-flottant 16 bits. Une carte mémoire avec une résolution prise en charge de 4 mégaoctets jusqu'à 640x480 (2 tampons de couleur (640x480x2) pour la double mise en mémoire tampon + 1 tampon de profondeur (640x480x2) = 1 843 200). Les modèles ultérieurs avec 4 mégaoctets de RAM FBI ont permis d'utiliser des résolutions jusqu'à 800x600 (2x800x600x2 + 800x600x2 = 2880000).
Pipeline de rendu SST1
Le convoyeur n'est pas décrit en détail dans les spécifications. Selon mon interprétation, la vie d'un triangle se composait de cinq étapes.

- Un triangle est créé et transformé dans le processeur principal de l'ordinateur (généralement Pentium). Ces opérations comprennent la multiplication par la matrice de l'espace modèle / projection, la troncature, la division en perspective des sommets, la coupure des coordonnées homogènes et la transformation du champ de vision. À la fin de ce processus, il ne reste que des triangles visibles de l'espace d'écran (en raison de l'écrêtage, un triangle peut se révéler être deux).
- À l'aide de la commande triangleCMD, les triangles sont transférés via le bus PCI à l'interface Frame Buffer (FBI). Ils sont convertis en requêtes de chaîne raster créées par l'unité de mappage de texture. Pour chaque élément de la ligne raster (appelé fragment), le TMU effectue jusqu'à quatre requêtes de recherche par pixel si le développeur nécessite un filtrage bilinéaire. La division en perspective fragmentée est également effectuée dans TMU.
- Le TMU envoie des fragments au FBI sous la forme d'une valeur de couleur RVB 16 bits texturée + d'une valeur z 16 bits.
- Le FBI effectue des tests de fragments dans le z-buffer, en les comparant à la RAM dédiée, qui stocke les valeurs RGBA et les valeurs z du buffer de trame.
- Enfin, l'éclairage est appliqué au fragment en fonction de son attribut de couleur et d'une recherche dans la table de brouillard de 64 éléments. Si un mélange est nécessaire, le FBI combine le fragment résultant avec ce qui est déjà dans le tampon de couleur.
Fait intéressant: si vous êtes un passionné de 3D, vous connaissez probablement le code racine carrée à retour rapide, qui est devenu célèbre grâce au code Quake 3 original:
float Q_rsqrt(float number) { long i; float x2, y; const float threehalfs = 1.5f; x2 = number * 0.5f; y = number; i = * (long*) &y;
À la recherche de
[5], la source Q_rsqrt Rys for Software a contacté Gary Tarolli, qui a déclaré avoir utilisé ce code tout en travaillant dans SGI. Il est donc juste de supposer qu'il a également été utilisé dans le pipeline SST1.
Quelque chose ne correspond pas
Après avoir pris connaissance du convoyeur et savoir que chaque composant (TMU, FBI, EDO RAM) fonctionne à une fréquence de 50 MHz, nous pouvons comprendre qu'il y a une sorte d'erreur dans les calculs et que la carte ne peut pas atteindre une vitesse de 50 mégapixels / s. Deux problèmes devaient être résolus ici.
Tout d'abord, le TMU a dû lire quatre texels pour effectuer un filtrage de texture bilinéaire. Cela signifie que quatre cycles d'accès à la RAM sont nécessaires, ce qui entraînerait un manque de données pour TMU et un taux de remplissage de 50/4 = 12,5 mégapixels / s.
Il y a un autre goulot d'étranglement au niveau du FBI. Si la vérification du tampon z est activée, avant d'écrire ou de supprimer la valeur z entrante du fragment doit être comparée à ce qui est déjà dans le tampon z. Si le test a réussi, la valeur doit être enregistrée. Ce sont deux opérations avec RAM, qui ont conduit à une diminution de moitié du taux de remplissage: 50/2 = 25 mégapixels / s.
TMU entrelacé à quatre voies
La solution au problème à quatre échantillons au stade TMU est mentionnée dans la spécification SST1.
L'entrelacement complet est implémenté dans le chemin de données de la mémoire de texture, ce qui permet à une seule banque d'accéder aux données quelle que soit l'adresse utilisée pour accéder aux données des autres banques.
- Spécification SST1
Il n'indique pas si le bus utilise le multiplexage d'adresses ou des bus de données et d'adresses communs. Il est plus facile de le comprendre si vous les dessinez sans multiplexage et sans séparation.
Indépendamment des détails, l'architecture TMU permettait de recevoir 4 x 16 bits texels par cycle. Si les données d'entrée arrivent à la bonne fréquence, le TMU peut effectuer une division fragmentaire par w, puis générer la valeur z du fragment (16 bits) et la couleur du fragment (16 bits), qui ont été transmises au FBI.
FBI à entrelacement bidirectionnel
La solution au problème de deux opérations d'accès RAM au stade FBI n'est pas non plus décrite dans la spécification. Cependant, le document mentionne un taux de remplissage de 100 mégapixels / s atteint avec glClear en raison de la possibilité d'enregistrer deux pixels par cycle, et cela nous fait comprendre que l'entrelacement bidirectionnel a été utilisé ici.
Le FBI a lu et écrit deux pixels à la fois (2 x 1 pixels constitués de couleurs 16 bits et z 16 bits = 64 bits). Pour ce faire, l'adresse 21 bits génère deux adresses 20 bits, dans lesquelles le bit le moins significatif est rejeté pour lire / écrire deux pixels dans l'ordre. Étant donné que l'algorithme de ligne raster nécessaire pour écrire / lire sur les lignes horizontales se déplace de gauche à droite, la lecture de deux pixels ordinaux fonctionnait très bien.
Bus 64 bits TMU-> FBI
La dernière pièce du puzzle est le bus FBI-TMU 64 bits. Presque rien n'est écrit à ce sujet dans la spécification, mais son comportement peut être compris par les données consommées par le FBI. Étant donné que le FBI traite deux pixels à la fois, il est raisonnable de supposer que le TMU n'envoie pas les texels aussi rapidement que possible, mais les combine deux en deux couleurs 16 bits + valeur z 16 bits.
Programmation Voodoo1
Au niveau le plus bas, la programmation Voodoo1 a été effectuée à l'aide de registres mappés en mémoire. L'API se compose d'un nombre étonnamment petit de commandes, il n'y en a que cinq: TRIANGLECMD (avec un point fixe), FTRIANGLECMD (avec un point flottant), NOPCMD (sans op), FASTFILLCMD (effacement de la mémoire tampon) et SWAPBUFFERCMD concernant le chargement des registres de données pour les paramètres de mixage, z-test, téléchargements de couleurs de brouillard et plus encore. Le chargement de texture en VRAM a été effectué via une mémoire RAM PCI en écriture de 8 mégaoctets uniquement avec mappage de la mémoire.
(Réel) Programmation Voodoo1
Les développeurs ont programmé Voodoo1 via l'API Glide
[6] . La logique de conception de l'API a été inspirée par IRIS GL / OpenGL, elle a utilisé une machine d'état et des préfixes pour tout (seul «gr» a été utilisé au lieu de «gl», et les programmeurs devaient contrôler la VRAM, comme cela se fait maintenant dans Vulkan.)
#include <glide.h> void main( void ) { GrHwConfiguration hwconfig; grGlideInit(void); grSstSelect( 0 ); grSstQueryHardware(&hwconfig); grSstSelect(0); grSstWinOpen(null, GR_RESOLUTION_640x480, GR_REFRESH_60HZ, GR_COLORFORMAT_RGBA, GR_ORIGIN_LOWER_LEFT, 2, 0); grBufferClear(0, 0, 0); GrVertex A, B, C; ... // Init A, B, and C. guColorCombineFunction( GR_COLORCOMBINE_ITRGB ); grDrawTriangle(&A, &B, &C); grBufferSwap( 1 ); grGlideShutdown(); }
MiniGL "standard"
Bien que MiniGL soit un sous-ensemble de la norme OpenGL 1.1, aucune spécification n'a été publiée pour cela. MiniGL était "juste ces fonctionnalités que Quake utilise." En exécutant objdump pour le binaire quake.exe, il est facile de créer une liste «officielle».
$ objdump -p glquake.exe | grep "gl"
glAlphaFunc glDepthMask glLoadIdentity glShadeModel
glBegin glDepthRange glLoadMatrixf glTexCoord2f
glBlendFunc glDisable glMatrixMode glTexEnvf
glClear glDrawBuffer glOrtho glTexImage2D
glClearColor glEnable glPolygonMode glTexParameterf
glColor3f glEnd glPopMatrix glTexSubImage2D
glColor3ubv glFinish glPushMatrix glTranslatef
glColor4f glFrustum glReadBuffer glVertex2f
glColor4fv glGetFloatv glReadPixels glVertex3f
glCullFace glGetString glRotatef glVertex3fv
glDepthFunc glHint glScalef glViewport
Si vous avez récemment commencé à apprendre OpenGL, vous devriez être intrigué par des noms de fonctions tels que glColor3f, glTexCoord2f, glVertex3f, glTranslatef, glBegin et glEnd. Ils ont été utilisés pour un mode appelé «mode immédiat», dans lequel la coordonnée du sommet, la coordonnée de la texture, la manipulation de la matrice et la couleur étaient indiquées par un appel de fonction à la fois.
C'est ainsi que «à cette époque», un triangle texturé et ombré par Gouraud a été dessiné.
void Render { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glBindTexture(GL_TEXTURE_2D, 1);
GLQuake
Le taux de remplissage maximum théorique de 50 mégapixels / s était censé fournir près de 50 images par seconde dans une résolution de 640x480. Cependant, puisque Quake combinait deux couches de textures par surface (une pour la couleur, l'autre pour la lightmap), SST1 a dû dessiner chaque image deux fois avec un mélange supplémentaire dans la deuxième passe. En conséquence, Quake a fonctionné à 26 images par seconde sur le P166Mhz.
En réduisant la résolution à 512x384 sur la même machine, il était possible d'obtenir une fluidité de 41 images par seconde
[7] , qui à l'époque ne pouvait être fournie par aucun concurrent.
Rendu logiciel
GLQUAKE VOODOO1
Fait intéressant: SST1 n'était pas pour tout le monde. Certaines personnes ont aimé les pixels et ont trouvé le filtrage bilinéaire «flou». D'autres ont été ennuyés par la perte de correction gamma.
Glquake a l'air merdique. Je pense que quelqu'un peut contester cela, mais admettons - cela a l'air horrible, en particulier sur les cartes NVidia. Sur les planches 3dfx, tout n'est pas si mal ... mais les couleurs sont encore floues. Sur TNT2, l'image est dégoûtante; elle est trop sombre et sombre.
- @Frib, Unofficial Glquake & QW Guide [8]
3fdx Voodoo 2
Si je disais que 3dfx règne sur le marché de 1996 à 1998, ce serait un euphémisme. Après SST1, la technologie Voodoo
2 a élevé la barre encore plus haut grâce à 100 MHz EDO RAM, ASIC avec une fréquence de 90 MHz, et pas seulement une, mais deux TMU, qui permettent de rendre un cadre Quake multi-texturé (couleur + éclairage) en un seul passage
[9] . Cette technologie était un véritable monstre, et même les cartes graphiques elles-mêmes avaient l'air luxueuses.
La vitesse de remplissage dans Voodoo
2 a presque doublé, atteignant 90 mégapixels / s. Les benchmarks Quake ont grimpé à 80 fps sur le Pentium II 266 MMX (contre 56 fps avec Voodoo1), atteignant en fait les limites de la logique du jeu et des capacités de surveillance.
Super Voodoo 2 12 Mo, image tirée de vgamuseum.info.Malheureusement, après la sortie de Voodoo3 en 1999, l'histoire de 3dfx a pris un virage serré. Elle a commencé à s'efforcer de développer ses propres cartes universelles et a cessé de vendre la technologie OEM, face à une concurrence croissante.
Cette transition ne s'est pas terminée comme prévu, et les performances de Voodoo3 étaient décevantes par rapport à la GeForce 256 de NVidia, capable de fournir la tessellation matérielle et l'éclairage (Pentium a fait cette partie dans le pipeline).
En réponse à NVidia, 3dfx a annulé le développement de Voodoo4 pour commencer à construire Voodoo5 avec la technologie VSA-100 (Voodoo Scalable Architecture). Le résultat était inattendu: après la sortie de «Napalm» (le nom de code de la carte), elle est tombée sur des cartes NVidia GeForce 2 et ATI Radeon plus puissantes. Finalement, le 28 mars 2000, 3dfx a déposé son bilan et a été acheté par NVidia.
Pour ceux qui ont vécu à la fin des années 90 et qui ont eu le plaisir de jouer à Voodoo1 ou Voodoo2, 3dfx reste une entreprise emblématique symbolisant l'excellence. Elle est devenue une ode au succès mérité obtenu grâce au courage, au talent exceptionnel et au travail acharné. Merci les gars!
Les références
[1] Source:
L'histoire de la Rendition Vérité 1000[2] Source:
John Carmack .plan. 12 févr.1998[3] Source:
SST-1, MOTEUR GRAPHIQUE HAUTE PERFORMANCE POUR L'ACCÉLÉRATION DE JEU 3D[4] Source:
panneau d'histoire orale 3dfx[5] Source:
Origine de l'InvSqrt rapide de Quake3 ()[6] Source:
Guide de programmation Glide[7] Source:
Comparaison des taux de trame dans GLQuake en utilisant les cartes 3D Voodoo et Voodoo 2[8] Source:
Frib, Unofficial Glquake & QW Guide[9] Source:
VOODOO2 GRAPHICS MOTEUR GRAPHIQUE HAUTE PERFORMANCE POUR L'ACCÉLÉRATION DE JEUX 3D