Geschichte von 3dfx Voodoo1

Bild

Dies ist der zweite Artikel in der Reihe „3D-Karten des Bebens der späten 90er Jahre“. Im ersten Teil haben wir die Rendition Vérité 1000 von Ende 1996 und einen speziellen Game-Port dafür namens vQuake untersucht. Rendition hat es geschafft, alle auf dem Quake-Markt zu besiegen. Für kurze Zeit blieb es das einzige Board, das den id Software-Blockbuster mit Hardwarebeschleunigung starten konnte.

Dies änderte sich jedoch im Januar 1997, als id Software eine neue Version von Quake namens GLQuake veröffentlichte. Da der Port mit miniGL (einer Teilmenge des OpenGL 1.1-Standards) erstellt wurde, konnte jeder Hersteller von Hardwarebeschleunigern miniGL-Treiber schreiben und am 3D-Kartenrennen teilnehmen. Von diesem Moment an stand die Möglichkeit des Wettbewerbs allen offen. Ziel war es, möglichst viele Frames pro Sekunde zu generieren. Die Belohnung war der Ruhm und das Geld der Kunden. Wenn man kurz die Geschichte studiert hat, kann man verstehen, dass die beiden damaligen Autoritäten zweifellos die Könige der beiden Bergproduzenten betrachteten.

Bisher besteht kein Zweifel: Die Welt von Quake wird von Voodoo regiert. Und da Quake die Welt der Spiele regiert, ist der Kauf von 3Dfx Voodoo für Gamer fast unvermeidlich.

- Tom's Hardware, 30. November 1997

3DFX Voodoo 1
- Der Standard, an dem alle anderen Karten gemessen werden.

- John Carmack .plan Datei. 12. Februar 1998 [2]

Wenn ich mir nur die Spezifikationen [3] ansehe , in denen eine Füllrate von 50 Megapixeln / s angegeben ist, wollte ich diese Karte sofort studieren und verstehen, was 3dfx getan hat, um ein so leistungsstarkes Produkt zu entwickeln.

3dfx Interaktiv


Ross Smith, Scott Sellers und Gary Tarolli trafen sich, als sie bei SGI zusammenarbeiteten [4] . Nachdem sie ein wenig bei Pellucid gearbeitet hatten, wo sie versuchten, IrisVision-Boards für PCs zu verkaufen (1994 kosteten solche Boards 4000 USD pro Stück), gründeten Kollegen mit Unterstützung von Gordy Campbell TechFarm eine eigene Firma. 3dfx Interactive mit Hauptsitz in San Jose, Kalifornien, wurde 1994 gegründet.

Ursprünglich beabsichtigte das Unternehmen, leistungsstarke Hardwaresysteme für Arcade-Automaten zu entwickeln, änderte jedoch seinen Kurs durch die Entwicklung von PC-Karten. Dafür gab es drei Gründe.

  1. Ziemlich niedriger RAM-Preis.
  2. Beginnend mit FastPage RAM und dann EDO RAM hat sich die Latenz im RAM um 30% verringert. Jetzt kann der Speicher mit einer Frequenz von bis zu 50 MHz arbeiten.
  3. Spiele in 3D (oder in Pseudo-3D) sind immer beliebter geworden. Der Erfolg von Spielen wie DOOM, Descent und Wing Commander III hat gezeigt, dass ein Markt für 3D-Beschleuniger im Entstehen begriffen ist.

Die Gründer des Unternehmens erkannten, dass sie etwas Mächtiges schaffen mussten, das für Spiele konzipiert war und einen Verkaufspreis im Bereich von 300 bis 400 Dollar hatte. 1996 gab das Unternehmen die Schaffung der SST1-Architektur (benannt nach den Gründern - Sellers-Smith-Tarolli-1) bekannt, die bald von mehreren OEMs wie Diamond, Canopus, Innovision und ColorMAX lizenziert wurde. Für ihre Kreation kam der Marketingname "Voodoo1", der seine magische Leistung betont.

Wie beim V1000 konnten die Hersteller beim Erstellen von Karten nur den ausgewählten RAM-Typ (EDO oder DRAM), die Farbe der Karten und die physische Anordnung der Chips ändern. Fast alles andere war standardisiert.


Diamond Monster 3D, Bild aus vgamuseum.info.


Canopus Pure3D, Bild aus vgamuseum.info.


BIOSTAR Venus 3D, Bild aus vgamuseum.info.


ORCHID Righteous 3D, Bild aus vgamuseum.info.


Beim Blick auf das SST1-Board fiel auf, wie unterschiedlich es sich von seinen Konkurrenten - Rendition Verite 1000 und NVidia NV1 - unterschied.

Erstens hat 3dfx einen mutigen Schritt getan und die Unterstützung des 2D-Renderings aufgegeben. Voodoo1 hatte zwei VGA-Anschlüsse, einen als Ausgang und einen als Eingang. Die Karte wurde als Ergänzung entwickelt, sie nahm als Eingabe die Ausgabe einer zweidimensionalen VGA-Karte, die bereits im Computer installiert war. Wenn der Benutzer mit dem Betriebssystem (DOS oder Windows) arbeitete, leitete Voodoo1 das Signal einfach von seinem VGA-Eingang zum VGA-Ausgang um. Beim Umschalten in den 3D-Modus übernahm Voodoo1 die Kontrolle über den VGA-Ausgang und ignorierte das Signal von seinem VGA-Eingang. Einige Boards hatten einen mechanischen Schalter, der beim Umschalten zwischen 2D- und 3D-Modus klickte. Diese Entscheidung bedeutete, dass die Karte nur für das Rendern im Vollbildmodus verwendet werden kann. Es gab keinen „Fenstermodus“.

Der zweite bemerkenswerte Aspekt von SST1 war, dass es nicht aus einer CPU, sondern aus zwei nicht programmierbaren ASICs (Application-Specific Integrated Circuit, Special Purpose Integrated Circuits) hergestellt wurde. Wenn Sie die Reifenspuren entlang gehen, können Sie sehen, dass jeder der mit „TMU“ und „FBI“ gekennzeichneten Chips über einen eigenen RAM verfügt. Auf der Speicherkarte wurden 4 Mebibyte RAM gleichmäßig aufgeteilt: 2 Mebibyte TMU für die Texturspeicherung und 2 Mebibyte FBI für die Speicherung des Farbpuffers und des Z-Puffers, während die Werte jeweils als 16-Bit-RGBA bzw. 16-Bit-Ganzzahl / Halb-Float gespeichert wurden. Eine Speicherkarte mit 4 Mebibyte unterstützt eine Auflösung von bis zu 640 x 480 (2 Farbpuffer (640 x 480 x 2) für doppelte Pufferung + 1 Tiefenpuffer (640 x 480 x 2) = 1 843 200). Spätere Modelle mit 4 Mebibyte FBI-RAM können Auflösungen von bis zu 800 x 600 (2 x 800 x 600 x 2 + 800 x 600 x 2 = 2.880.000) verwenden.

SST1-Rendering-Pipeline


Der Förderer ist in den Spezifikationen nicht detailliert beschrieben. Nach meiner Interpretation bestand das Leben eines Dreiecks aus fünf Stufen.


  1. Im Hauptprozessor des Computers (normalerweise Pentium) wird ein Dreieck erstellt und transformiert. Solche Operationen umfassen die Multiplikation mit der Matrix des Modell- / Projektionsraums, das Abschneiden, die Scheitelpunktperspektiventeilung, das Abschneiden homogener Koordinaten und das Transformieren des Sichtfelds. Am Ende dieses Vorgangs bleiben nur sichtbare Dreiecke des Bildschirmbereichs übrig (aufgrund von Übersteuerungen kann sich herausstellen, dass ein Dreieck zwei sind).
  2. Mit dem Befehl triangleCMD werden die Dreiecke über den PCI-Bus an das Frame Buffer Interface (FBI) übertragen. Sie werden in Rasterzeichenfolgenabfragen konvertiert, die von der Texture Mapping Unit erstellt wurden. Für jedes Element der Rasterzeile (als Fragment bezeichnet) führt die TMU bis zu vier Suchabfragen pro Pixel durch, wenn der Entwickler eine bilineare Filterung benötigt. Eine fragmentierte Perspektiventeilung wird auch in TMU durchgeführt.
  3. Die TMU sendet Fragmente als strukturierten 16-Bit-RGBA-Farbwert + 16-Bit-Z-Wert an das FBI.
  4. Das FBI führt Fragmenttests im Z-Puffer durch und vergleicht sie mit dem zugewiesenen RAM, in dem die RGBA-Werte und die Z-Werte des Bildpuffers gespeichert sind.
  5. Schließlich wird das Fragment anhand seines Farbattributs und einer Suche in der Nebeltabelle mit 64 Elementen beleuchtet. Wenn ein Mischen erforderlich ist, kombiniert das FBI das resultierende Fragment mit dem, was sich bereits im Farbpuffer befindet.

Interessante Tatsache: Wenn Sie ein 3D-Enthusiast sind, kennen Sie wahrscheinlich den schnellen Quadratwurzelcode, der dank des ursprünglichen Quake 3-Codes berühmt wurde:

float Q_rsqrt(float number) { long i; float x2, y; const float threehalfs = 1.5f; x2 = number * 0.5f; y = number; i = * (long*) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration return y; } 

Auf der Suche nach [5] kontaktierte die Quelle Q_rsqrt Rys for Software Gary Tarolli, der sagte, dass er diesen Code verwendet habe, während er noch in SGI arbeitete. Man kann also davon ausgehen, dass es auch in der SST1-Pipeline verwendet wurde.

Etwas passt nicht zusammen


Nachdem wir uns mit dem Förderer vertraut gemacht haben und wissen, dass jede Komponente (TMU, FBI, EDO RAM) mit einer Frequenz von 50 MHz arbeitet, können wir verstehen, dass die Berechnungen fehlerhaft sind und die Karte keine Geschwindigkeit von 50 Megapixeln / s erreichen kann. Hier mussten zwei Probleme gelöst werden.

Zunächst musste die TMU vier Texel lesen, um eine bilineare Texturfilterung durchzuführen. Dies bedeutet, dass vier Zyklen für den Zugriff auf RAM erforderlich sind, was zu einem Mangel an Daten für TMU und einer Füllrate von 50/4 = 12,5 Megapixeln / s führen würde.

Auf FBI-Ebene gibt es einen weiteren Engpass. Wenn die Z-Puffer-Überprüfung aktiviert ist, sollte vor dem Schreiben oder Verwerfen der eingehende Z-Wert des Fragments mit dem verglichen werden, was sich bereits im Z-Puffer befindet. Wenn der Test erfolgreich war, muss der Wert aufgezeichnet werden. Dies sind zwei Operationen mit RAM, die zu einer Verringerung der Füllrate um die Hälfte führten: 50/2 = 25 Megapixel / s.

Vier-Wege-Interleaving-TMU


Die Lösung des Vier-Proben-Problems im TMU-Stadium wird in der SST1-Spezifikation erwähnt.

Die vollständige Verschachtelung ist im Texturspeicher-Datenpfad implementiert, wodurch eine einzelne Bank unabhängig von der Adresse, die für den Zugriff auf Daten in anderen Banken verwendet wird, auf Daten zugreifen kann.

- Spezifikation SST1

Es wird nicht angezeigt, ob der Bus Adressmultiplex oder gemeinsame Daten- und Adressbusse verwendet. Es ist einfacher herauszufinden, ob Sie sie ohne Multiplexing und ohne Trennung zeichnen.


Unabhängig von den Details konnte die TMU-Architektur 4 x 16-Bit-Texel pro Zyklus empfangen. Wenn die Eingabedaten mit der richtigen Frequenz ankommen, kann die TMU eine fragmentweise Division durch w durchführen und dann den z-Wert des Fragments (16 Bit) und die Farbe des Fragments (16 Bit) erzeugen, die an das FBI übertragen wurden.

Zwei-Wege-Interleaving-FBI


Die Lösung des Problems von zwei RAM-Zugriffsoperationen in der FBI-Phase ist in der Spezifikation ebenfalls nicht beschrieben. In dem Dokument wird jedoch eine Füllrate von 100 Megapixeln / s erwähnt, die mit glClear erreicht wird, da zwei Pixel pro Zyklus aufgezeichnet werden können. Dies macht uns verständlich, dass hier Zwei-Wege-Interlacing verwendet wurde.


Das FBI hat zwei Pixel gleichzeitig gelesen und geschrieben (2 x 1 Pixel, bestehend aus 16-Bit-Farbe und 16-Bit-z = 64 Bit). Zu diesem Zweck generiert die 21-Bit-Adresse zwei 20-Bit-Adressen, bei denen das niedrigstwertige Bit zum Lesen / Schreiben von zwei Pixeln der Reihe nach verworfen wird. Da sich der zum Schreiben / Lesen in horizontalen Linien erforderliche Rasterlinienalgorithmus von links nach rechts bewegt, hat das gleichzeitige Lesen von zwei Ordnungspixeln sehr gut funktioniert.

64-Bit-Bus TMU-> FBI


Das letzte Puzzleteil ist der 64-Bit-FBI-TMU-Bus. In der Spezifikation ist fast nichts darüber geschrieben, aber sein Verhalten kann anhand der Daten verstanden werden, die das FBI verbraucht. Da das FBI zwei Pixel gleichzeitig verarbeitet, ist davon auszugehen, dass die TMU Texel nicht so schnell wie möglich sendet, sondern zwei als zwei 16-Bit-Farben + 16-Bit-Z-Wert kombiniert.

Programmieren von Voodoo1


Auf der untersten Ebene wurde die Voodoo1-Programmierung unter Verwendung von speicherabgebildeten Registern durchgeführt. Die API besteht aus einer überraschend kleinen Anzahl von Befehlen, von denen es nur fünf gibt: TRIANGLECMD (mit einem festen Punkt), FTRIANGLECMD (mit einem Gleitkomma), NOPCMD (no-op), FASTFILLCMD (Pufferlöschung) und SWAPBUFFERCMD in Bezug auf das Laden von Datenregistern zum Mischen von Einstellungen, Z-Test, Nebelfarben-Downloads und mehr. Das Laden der Textur in VRAM wurde über 8 MBibyte Nur-Schreib-PCI-RAM mit Speicherzuordnung durchgeführt.

(Real) Voodoo1-Programmierung


Die Entwickler programmierten Voodoo1 über die Glide-API [6] . Die API-Entwurfslogik wurde von IRIS GL / OpenGL inspiriert. Sie verwendete eine Zustandsmaschine und Präfixe für alles (nur "gr" wurde anstelle von "gl" verwendet, und Programmierer mussten VRAM steuern, wie dies jetzt in Vulkan geschieht.)

 #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(); } 

"Standard" MiniGL


Obwohl MiniGL eine Teilmenge des OpenGL 1.1-Standards war, wurde nie eine Spezifikation dafür veröffentlicht. MiniGL war "genau die Funktionen, die Quake verwendet". Durch Ausführen von objdump für die Binärdatei quake.exe ist es einfach, eine "offizielle" Liste zu erstellen.

  $ 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 


Wenn Sie kürzlich mit dem Erlernen von OpenGL begonnen haben, sollten Sie von Funktionsnamen wie glColor3f, glTexCoord2f, glVertex3f, glTranslatef, glBegin und glEnd fasziniert sein. Sie wurden für einen Modus namens "Sofortmodus" verwendet, in dem die Scheitelpunktkoordinate, Texturkoordinate, Matrixmanipulation und Farbe durch jeweils einen Funktionsaufruf angezeigt wurden.

So wurde „damals“ ein vom Gouraud-Dreieck strukturiertes und schattiertes gezeichnet.

 void Render { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glBindTexture(GL_TEXTURE_2D, 1); // Assume a texture was loaded in textureId=1 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glBegin(GL_TRIANGLES); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-0.25f,0.0f); glColor3f(0.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f,-0.25f,0.0f); glColor3f(0.5f, 0.5f, 0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.75f,0.25f,0.0f); glEnd(); 

GLQuake


Die theoretische maximale Füllrate von 50 Megapixeln / s sollte fast 50 Bilder pro Sekunde bei einer Auflösung von 640 x 480 liefern. Da Quake jedoch zwei Texturebenen pro Oberfläche kombinierte (eine für Farbe, die andere für die Lichtkarte), musste SST1 jeden Frame zweimal mit zusätzlicher Überblendung im zweiten Durchgang zeichnen. Infolgedessen lief Quake auf dem P166Mhz mit 26 fps.

Durch Reduzieren der Auflösung auf 512 x 384 auf demselben Computer konnten glatte 41 fps [7] erzielt werden, die zu diesem Zeitpunkt von keinem Konkurrenten bereitgestellt werden konnten.

Bild

Software-Rendering

Bild

GLQUAKE VOODOO1



Interessante Tatsache: SST1 war nicht jedermanns Sache. Einige Leute mochten die Pixel und fanden die bilineare Filterung "verschwommen". Andere ärgerten sich über den Verlust der Gammakorrektur.

Glquake sieht beschissen aus. Ich denke, jemand kann damit streiten, aber lassen Sie uns zugeben - es sieht schrecklich aus, besonders auf NVidia-Karten. Auf 3dfx-Boards ist nicht alles so schlecht ... aber die Farben sind immer noch verschwommen. Auf TNT2 ist das Bild ekelhaft; Sie ist zu dunkel und düster.

- @Frib, Inoffizieller Glquake & QW Guide [8]

3fdx Voodoo 2



Wenn ich sagen würde, dass 3dfx von 1996 bis 1998 auf dem Markt ist, wäre dies eine Untertreibung. Nach SST1 hat die Voodoo 2- Technologie die Messlatte dank 100-MHz-EDO-RAM, ASIC mit einer Frequenz von 90 MHz und nicht nur einer, sondern zwei TMUs, die das Rendern eines mehrstrukturierten Quake-Frames (Farbe + Beleuchtung) in einem Durchgang ermöglichen, noch höher gelegt [9] . Diese Technologie war ein echtes Monster, und selbst die Grafikkarten selbst sahen luxuriös aus.

Die Füllgeschwindigkeit in Voodoo 2 verdoppelte sich fast und erreichte 90 Megapixel / s. Die Quake-Benchmarks stiegen auf dem Pentium II 266 MMX auf beeindruckende 80 fps (im Vergleich zu 56 fps mit Voodoo1) und stießen tatsächlich an die Grenzen der Spielelogik und der Monitorfunktionen.

Bild

Super Voodoo 2 12MB, Bild aus vgamuseum.info.

Leider machte die 3dfx-Geschichte nach der Veröffentlichung von Voodoo3 im Jahr 1999 eine scharfe Wendung. Sie begann sich zu bemühen, ihre eigenen Universalkarten zu entwickeln, und hörte angesichts des zunehmenden Wettbewerbs auf, OEM-Technologie zu verkaufen.

Dieser Übergang wurde nicht wie erwartet abgeschlossen, und die Leistung von Voodoo3 war im Vergleich zu NVidias GeForce 256, die Hardware-Tessellation und Beleuchtung bereitstellen kann, enttäuschend (Pentium hat diesen Teil in der Pipeline ausgeführt).

Als Reaktion auf NVidia hat 3dfx die Entwicklung von Voodoo4 abgebrochen, um mit dem Bau von Voodoo5 mit VSA-100-Technologie (Voodoo Scalable Architecture) zu beginnen. Das Ergebnis war unerwartet: Nach der Veröffentlichung von „Napalm“ (dem Codenamen der Karte) stieß sie auf leistungsstärkere NVidia GeForce 2- und ATI Radeon-Karten. Am 28. März 2000 meldete 3dfx Insolvenz an und wurde von NVidia gekauft.

Für diejenigen, die Ende der 90er Jahre lebten und das Vergnügen hatten, Voodoo1 oder Voodoo2 zu spielen, bleibt 3dfx ein Meilenstein für herausragende Leistungen. Sie wurde eine Ode an den verdienten Erfolg, der durch Mut, herausragendes Talent und harte Arbeit erzielt wurde. Danke Jungs!

Referenzen


[1] Quelle: Die Geschichte der Rendition Vérité 1000

[2] Quelle: John Carmack .plan. 12. Februar 1998

[3] Quelle: SST-1, HIGH PERFORMANCE GRAPHICS ENGINE FÜR 3D-SPIELBESCHLEUNIGUNG

[4] Quelle: 3dfx Oral History Panel

[5] Quelle: Ursprung von Quake3s Fast InvSqrt ()

[6] Quelle: Glide-Programmierhandbuch

[7] Quelle: Vergleich der Frameraten in GLQuake mit Voodoo & Voodoo 2 3D-Karten

[8] Quelle: Frib, Inoffizieller Glquake & QW Guide

[9] Quelle: VOODOO2 GRAPHICS HIGH PERFORMANCE GRAPHICS ENGINE FÜR DIE BESCHLEUNIGUNG VON 3D-SPIELEN

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


All Articles