L'histoire du premier GPU: Rendition Vérité 1000

image

Il y a beaucoup de bonne littérature sur le moteur Quake: livres, innombrables articles sur Internet, blogs et wikis. Parmi eux, mes favoris sont le Graphics Programming Black Book de Michael Abrash, publié en 1997, et Rocket Jump: Quake and the Golden Age of First-Person Shooters de David L.Craddock (2018).

Malheureusement, vous pouvez trouver très peu d'informations sur les équipements développés autour de 1996, qui ont permis d'améliorer le rendu 3D et notamment les graphismes du révolutionnaire Game ID Software. À l'intérieur de l'architecture et du design de ces morceaux de silicium se trouve l'histoire d'un duel technologique entre la Rendition V1000 et le 3dfx Interactive Voodoo.

Après la sortie de vQuake début décembre 1996, il semblait que Rendition avait pris le relais. La V1000 était une carte rapide capable de lancer Quake avec une accélération matérielle qui, selon le développeur, fournit un taux de remplissage de 25 mégapixels / s [1] . Juste avant Noël, Rendition a conquis le marché, permettant aux joueurs de lancer le jeu avec une haute résolution, une fréquence d'images et des couleurs 16 bits [2] . Mais, comme l'histoire l'a montré, la faille dans la conception de la Vérité 1000 s'est avérée fatale pour l'entreprise innovante.

Temps et applications tueuses correctement sélectionnés


L'idée d'un équipement spécialisé pour l'accélération graphique n'est pas apparue subitement. En 1954, United Airlines avait des simulateurs de vol pour former les pilotes. Le plus grand acteur dans le domaine, Silicon Graphics, Inc. (SGI), est apparu en 1982 et offrait à l'époque des postes de travail puissants tels que Indy, O2 et Indigo². Cependant, les prix de ces machines ne permettaient pas leur achat par les consommateurs ordinaires (la SGI Infinite Reality 1993 pourrait être vendue pour 100000 $, ce qui équivaut à 177262 $ en 2019). La raison de la situation survenue à la fin des années 90 était la combinaison de trois facteurs.


Premièrement, le prix de la RAM a considérablement diminué. Même s'il y avait une énorme pénurie de RAM en 1995 (principalement parce que 8 Mo de mémoire étaient recommandés pour Microsoft Windows 95), au cours de l'année, le prix de la RAM a chuté de près de 90%. Cela a ouvert des perspectives pour les cartes avec des tampons de cadre incroyablement énormes (640x480 avec une couleur RVB 16 bits) qui peuvent stocker des textures localement.

Deuxièmement, des performances RAM accrues. La RAM FastPage était un pas en avant par rapport à la DRAM, mais après la sortie de la RAM EDO, les retards ont diminué de 30% et le temps d'accès à la RAM était de 50 ns [3] .

La troisième et dernière pièce du puzzle était les applications tueuses. Le PC dispose de puissants processeurs, par exemple, Intel Pentium avec une fréquence de 166 MHz, que les développeurs utilisaient pour créer des jeux 3D de haute qualité. En 1996, tout le monde parlait de deux jeux: Tomb Raider de Core Design et Quake d'id Software.



Rendu et V1000


Rendition Inc a été fondée en 1993. Deux ans plus tard, en 1995, la société a annoncé la création de l'architecture V1000, qui a rapidement été concédée sous licence par quatre OEM. Creative Labs 3D Blaster PCI, Sierra Screamin '3D, Canopus Total 3D et Intergraph Reactor ont été les premiers à apparaître sur le marché, et bientôt MiRO a pris le relais.


Réacteur Intergraph. Image de vgamuseum.ru.


Creative Labs 3D Blaster. Image du club «Cartes graphiques rétro».

Notez que la première puce V1000-E a ensuite été remplacée par une V1000L-P avec une consommation d'énergie inférieure et 20% plus rapide [4] .


MiroCrystal VRX. Image de vgamuseum.info.


Canopus Total3D. Image de vgamuseum.ru.


Le nom des cartes a changé, mais les puces utilisées étaient les mêmes. Le seul paramètre par lequel les fabricants devaient équilibrer le prix et les performances était la qualité installée sur la carte RAM.

  1. Port VGA pour la connexion à un moniteur CRT.
  2. Ramdac, généralement de Bt, mais parfois une puce AT&T.
  3. Le cœur de la carte est une puce V1000-E, V1000-P ou v1000-L.
  4. Huit puces DRAM / EDO de 512 kioctets (4 mégaoctets au total) pour stocker les tampons de trame et les textures.
  5. 64 ko d'EEPROM contenant le BIOS.

Le V1000 avait deux propriétés inhérentes qu'il est important de noter car 3dfx Voodoo (dont je parlerai plus tard) a utilisé une approche radicalement différente.

Premièrement, la carte devait remplacer celle qui était déjà installée chez l'acheteur. La puce supportait le rendu 2D et 3D en VGA, et grâce aux changements de contexte, elle avait un impressionnant mode «3D en fenêtre». Par conséquent, la carte avait un port VGA à sortie unique.

La deuxième caractéristique est l'architecture «Big Iron», basée sur un seul processeur Mips qui a accès aux 4 octets de mémoire. Le bus de données 64 bits entre eux n'avait pas de propriétés spéciales. Cette conception standardisée a facilité la programmation de la carte à l'aide du microcode de démarrage (cela a fait de la carte le premier GPU pour PC, bien avant que Nvidia ne propose cette définition.)

Programmation V1000


Le SDK [5] était fourni avec un ensemble de fichiers d'en-tête pour interagir avec le langage C (RRedline sous Windows et Speedy3D sous DOS). Le rendu du triangle texturé ressemblait à ce que Vulkan avec VRAM manuelle offre aujourd'hui. L'API, capable de rendre des triangles texturés basés sur l'angle, a également pris en charge les tests alpha, le mélange alpha et le brouillard.

#include <string.h> #include <windows.h> #include <redline.h> WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdShow){ int WIDTH=640, HEIGHT = 480; HWND hWndMain = ... ; // Setup Verite board and resolution/refresh rate v_handle verite; VL_OpenVerite(hWndMain, &verite); V_SetDisplayType(verite, V_FULLSCREEN_APP); V_SetDisplayMode(verite, WIDTH, HEIGHT, 16, 75); // Copy texture to VRAM bmp_info bmp = loadBMP("data\\rlogo.bmp"); v_memory memObj = V_AllocLockedMem(verite, bmp.linebytes*bmp.height); memcpy(V_GetMemoryObjectAddress(memObj), bmp.addr, bmp.linebytes*bmp.height); v_surface *display, *texture; VL_CreateSurface(verite, &display, V_SURFACE_PRIMARY, 2, V_PIXFMT_565, WIDTH, HEIGHT); VL_CreateSurface(verite, &texture, 0, 1, V_PIXFMT_565, bmp.width, bmp.height); v_cmdbuffer cmdbuffer = V_CreateCmdBuffer(verite, 0, 0); VL_LoadBuffer(&cmdbuffer, texture, 0, bmp.linebytes, bmp.width, bmp.height, memObj, 0); VL_InstallDstBuffer(&cmdbuffer, display); VL_InstallTextureMap(&cmdbuffer, texture); VL_SetSrcFunc(&cmdbuffer, V_SRCFUNC_REPLACE) // Clear screen to black VL_FillBuffer(&cmdbuffer, display, 1, 0, 0, display->width, display->height,0); // Populate cmd with triangle coo and textCoo v_kaxyzuvq vertex[3] = ... ; VL_Triangle(&cmdbuffer, V_FIFO_KAXYZUVQ, &vertex[0], &vertex[1], &vertex[2]); V_IssueCmdBuffer(verite, cmdbuffer); VL_SwapDisplaySurface(&cmdbuffer, display); } 

RRedline a chargé 128 Ko de microcode dans Vérité et traduit les appels C en appels de fonction assembleur V1000.

Un fait intéressant: le nom de l'API "RRedline" a battu la phrase "Rendition Ready" et a probablement été choisi collectivement. Cependant, le nom Speedy3D était l'idée de Walt Donovan.

En fait, le v1000 n'était qu'un processeur lent (25 MHz), ayant une multiplication à cycle unique 32 * 32 (occupant une partie substantielle de la puce!), Une instruction à cycle unique pour calculer la valeur inverse approximative (c'est-à-dire une division entière approximative à deux cycles), et l'ensemble habituel d'instructions RISC. Oh, et aussi l'instruction de «chargement bilinéaire», qui lit un bloc de mémoire linéaire 2x2 et effectue un filtrage bilinéaire basé sur les valeurs fractionnaires de u et v passées à l'instruction. Il y avait une petite cache sur la carte, semble-t-il, à seulement 4 pixels. Par conséquent, si un bloc 2x2 parfaitement adapté apparaissait, nous avons reçu une réduction de la charge sur la bande passante mémoire.

Il n'y avait pas de support matériel pour les Z-buffers. Par conséquent, le logiciel fonctionnant dans la v1000 devait lire Z, effectuer une comparaison, puis décider d'écrire ou non.

- Walt Donovan (architecte d'algorithmes)

Pour envoyer des textures et un microcode à la carte, le pilote a utilisé DMA pour transférer des données via PCI sans intervention du processeur. Dans la pratique, de nombreuses cartes mères ne disposaient pas d'un contrôle de bus correct, les jeux ont donc dû revenir au mode PCI FIFO, ce qui a nui aux performances [6] . À l'intérieur de la carte, toutes les opérations ont été effectuées en nombres entiers à virgule fixe 32 bits.

Les développeurs ont décidé que Rendition serait entièrement programmable, mais n'ont pas utilisé de pipeline intelligent ni de synchronisation rapide. Par conséquent, si 25 instructions étaient nécessaires pour enregistrer un pixel, nous obtenons seulement 1 mégapixel / s. Si vous utilisez un équipement à fonctionnalité fixe, vous pouvez créer un convoyeur équivalent à ces 25 instructions et atteindre 25 mégapixels / s. Les employés de 3dfx venaient de SGI, ils ont donc choisi l'approche qui s'est avérée être la bonne décision - créer un moteur de traitement triangulaire avec des fonctionnalités fixes et un sous-ensemble de fonctions OpenGL pour la gestion de l'équipement. Les développeurs de V1000 ont eu une expérience complètement différente, ils ne connaissaient pas OpenGL, et ont donc décidé qu'il serait plus correct de créer un CPU.

- Walt Donovan (architecte d'algorithmes)

En plus de tout cet ensemble de fonctions, la carte avait également un système anti-aliasing innovant, qui avait un effet secondaire amusant.

L'algorithme d'anticrénelage utilisé dans vQuake a été breveté (numéro de brevet 6005580). Il y avait une drôle de blague sur cet algorithme. Cela ne fonctionnait qu'avec des triangles, mais pas avec des intervalles. Quake a utilisé le concept de «parfait z-buffering», dans lequel les graphiques étaient divisés en intervalles et triés visuellement à l'aide de BSP / PVS (partitionnement d'espace binaire / un ensemble d'éléments potentiellement visibles). Par conséquent, le moteur a créé un ensemble d'intervalles qui couvraient idéalement l'écran sans superpositions et pixels manquants, et pour le rendu, une seule opération d'écriture (sans z-tampon!) Dans la mémoire d'affichage était nécessaire. Cependant, les données initiales pour ces intervalles étaient des triangles. L'algorithme d'anticrénelage a recherché les bords des silhouettes et les a lissés. (Pour plus d'informations sur cette idée, voir humus.name, Entrée d'anticrénelage post-processus géométrique de mars 2011 - l'auteur a de nouveau inventé cette technologie!) Mais comme l'anticrénelage a été effectué après le rendu de l'écran (tous les intervalles ont déjà été dessinés), l'algorithme conceptuel avait, apparemment, une côte ou non. Il l'a quand même peint. (Si un tampon z était utilisé, seuls les bords visibles seraient redessinés!) En pratique, ce n'était pas un gros problème, car BSP coupait généralement très bien les triangles invisibles.

Mais pas avec les modèles de personnages! Par conséquent, vquake a permis au joueur de voir les gens se cacher derrière les portes et les murs, créant une petite distorsion mouvante dans les textures!

- Walt Donovan (architecte d'algorithmes)

vQuake


Au moment de la sortie des cartes, ils supportaient de bons jeux. Oui, Descent II, Grand Prix Legends, IndyCar Racing II, Myst, Nascar Racing, EF2000 et Tomb Raider étaient de bons jeux, mais Quake était le véritable diamant de la couronne, la vente la plus exigeante et la plus prometteuse. Le jeu id Software a reçu son propre port sous Vérité appelé vQuake, sorti le 2 décembre 1996. Il a été écrit par Walt Donovan et Stefan Share de Vérité en collaboration avec id Abrash Michael.

Le travail a été assez laborieux, mais le port a fonctionné. Le Pentium 166Mhz, capable de rendre Quake à une résolution de 320x200 à 26 images par seconde, pourrait passer à 640x480 avec un filtrage bilinéaire et toujours rendre à 22 images par seconde [8] . En pratique, les joueurs ont choisi une résolution de 512x384, qui avait l'air belle et permettait de fournir 32 images par seconde sur le P166. Pendant une courte période, vQuake a indéniablement été le meilleur moyen de jouer à Quake.

image

Rendu logiciel

image

Vérité V1000

Un grand merci à l'utilisateur @swaaye du forum vogons.org pour les captures d'écran de V1000 et Fruit Of the Dojo pour son port Quake de haute qualité et facile à pirater sur MacOSX [9] .

image

Rendu logiciel

image

Vérité V1000

Défaut de tampon Z


Ce qui manquait au V1000 (et indirectement à son successeur V2200), c'était l'accélération matérielle du z-buffer. Dès que le développeur a inclus un test de profondeur, le taux de remplissage est tombé à 12,5 mégapixels / s et la fréquence d'images a été divisée par deux. Comme Stefan Podell l'a expliqué plus tard [10] , vQuake (et tous les autres jeux) ont été portés sur le V1000 de manière à minimiser la lecture du z-buffer.

Les développeurs ont constaté que la seule façon d'assurer la vitesse nécessaire était de transférer la partie principale du travail vers le CPU. Dans le cas de vQuake, cela signifiait que la carte serait utilisée comme un rendu d'intervalle horizontal ultrarapide qui écrit toujours dans le tampon z, mais z est lu et comparé uniquement lors du rendu des ennemis. Et bien que les développeurs aient réussi à créer de bons produits, les conséquences d'un tel choix d'architecture ont longtemps plané.

3dfx et drop Rendition


id Software a publié GLQuake le 22 janvier 1997. Il a été implémenté sur la base de miniGL (un sous-ensemble de la norme OpenGL 1.0, qui manquait entre autres de GL_LIGHT et GL_FOG). Ce binaire a ouvert la porte à toutes les cartes PC à accélération matérielle. À cet égard, les cartes Voodoo de 3dfx Interactive étaient particulièrement distinguées, leurs performances étonnantes (41 images par seconde en résolution 512x384 avec des couleurs 16 bits sur P166 [11] ) sont devenues la norme de facto pour les accélérateurs 3D. Le taux de remplissage du V1000 de 25 mégapixels / s, qui se comparait autrefois favorablement au rendu logiciel du Pentium, semblait maintenant médiocre sur un fond de 50 mégapixels / s de la carte Voodoo, qui n'était même pas affecté par les tests z.

La réponse de Rendition était le V2x00 plus puissant, ce qui a paradoxalement aggravé la situation. Il a été annoncé que, grâce au matériel z-buffer, le V2x00 était deux fois plus rapide, cependant, il n'était pas en mesure d'améliorer même la fréquence d'images dans vQuake. Cette anomalie a sapé la confiance des clients et a affecté négativement le développeur de vQuake Stefan Sharele, qui a estimé qu'il devait expliquer pourquoi les performances de vQuake étaient limitées par le CPU plutôt que par le GPU [12] .

... ma réputation s'est avérée entachée par le fait que VQuake et VHexen2 ne fonctionnaient pas plus rapidement sur V2x00, donc je dois expliquer pourquoi cela s'est produit.

[...]

Walt et Michael ont décidé que, comme le Verite 1000 ne fonctionnait pas très bien en pixels avec la mise en mémoire tampon Z, laisser Pentium faire ce tri d'intervalles réduirait le nombre de pixels que Verite doit dessiner. De plus, nous pourrions désactiver la fonction de comparaison Z dans Verite.

[...]

... quelle que soit la puce Verite, le processeur a eu beaucoup de travail.

- Stefan Podell

De plus, il y avait des problèmes importants dans l'architecture matérielle, ce qui a initialement conduit à la panne de [13] V2x00. Il a fallu plusieurs mois pour résoudre le problème, et même après cela, la carte fonctionnait toujours à une fréquence de 50 MHz, tandis que NVidia NV3 et Voodoo2 atteignaient déjà 100 MHz.

La troisième génération, basée sur le V3300, pourrait changer le cours de l'histoire, mais elle est sortie trop tard. Le projet a été annulé en 1998, après l'acquisition de Rendition par Micron Technology.

En travaillant chez Rendition, nous avons fait beaucoup d'erreurs. Il était possible de sortir la v1000 quelques mois plus tôt (et de n'avoir aucun concurrent au cours de ces mois) si nous développions nous-mêmes le schéma et ne le transférions pas à la fab. De plus, le contrôle qualité de la puce a soulevé des questions. Un gars de notre entreprise a passé plusieurs mois à implémenter la décompression mpeg dans le langage assembleur V1000, mais n'a pas pu le faire fonctionner en raison de bogues de puce imprévisibles.

vQuake a bien fonctionné simplement parce que le v1000 n'a pas fait beaucoup de travail. "Rendre cette liste d'intervalles", "lisser ce bord" - c'est presque tout ce qu'il a fait. Mike Abrash et moi avons passé trop de temps à rendre Quake compatible avec le V1000, donc ce modèle n'était pas adapté à long terme.

- Walt Donovan (architecte d'algorithmes)

Après l'effondrement de Rendition, 3dfx a redoublé d'efforts pour promouvoir Voodoo2, dont les caractéristiques exceptionnelles ont permis de balayer tous les concurrents. Le roi du graphisme 3D sur PC domine le marché depuis un certain temps. Ensuite, le jeu a continué, de nouveaux concurrents sont apparus sur la scène, parmi lesquels le canadien ATI et une société presque inconnue à l'époque appelée Nvidia.

Les références


[1] Source: VGA Museum, V1000 Texel Fillrate (MTexel / s) rapporté comme 25

[2] Source: John Carmack .plan 22 août 1996 "à 512 * 384 c'est presque deux fois plus vite"

[3] Source: 3dfx VOODOO1 Reference Rev. 1.0

[4] Source: Revue du V1000

[5] Source: SDK Rendition Verite V1000

[6] Source: l'immaturité du bus PCI [...] causée par des bogues DMA à la surface

[7] Source: Guide de programmation RRedline

[8] Source: Benchmarks pour comparer les Rendition Vérité V1000-E et V1000L-P

[9] Source: code source du port MacOSX X Quake sur github.com

[10] Source: Stephan Podell BSS post

[11] Source: Comparaison des taux d'images dans GLQuake utilisant Voodoo1

[12] Source: Stephan Podell BSS post

[13] Source: wikipedia.com, section Chute

Source: https://habr.com/ru/post/fr446570/


All Articles