Die Geschichte der ersten GPU: Rendition Vérité 1000

Bild

Es gibt viel gute Literatur über die Quake-Engine: Bücher, unzählige Artikel im Internet, Blogs und Wikis. Zu meinen Favoriten zählen das 1997 veröffentlichte Black Book Graphics Programming von Michael Abrash und Rocket Jump: Quake und das goldene Zeitalter der Ego-Shooter von David L. Craddock (2018).

Leider finden Sie nur sehr wenige Informationen über die um 1996 entwickelte Ausrüstung, die es ermöglichte, das 3D-Rendering und insbesondere die Grafik der revolutionären Spiel-ID-Software zu verbessern. In der Architektur und dem Design dieser Siliziumteile steckt die Geschichte eines technologischen Duells zwischen der Rendition V1000 und 3dfx Interactive Voodoo.

Nach der Veröffentlichung von vQuake Anfang Dezember 1996 schien Rendition die Macht übernommen zu haben. V1000 war eine schnelle Karte, mit der Quake mit Hardwarebeschleunigung gestartet werden konnte, die laut Entwickler eine Füllrate von 25 Megapixeln / s bietet [1] . Kurz vor Weihnachten übernahm Rendition den Markt und ermöglichte es den Spielern, das Spiel mit hoher Auflösung, Bildrate und 16-Bit-Farbe zu starten [2] . Wie die Geschichte gezeigt hat, erwies sich der Fehler im Design des Vérité 1000 für das innovative Unternehmen als fatal.

Richtig ausgewählte Zeit- und Killeranwendungen


Die Idee einer speziellen Ausrüstung für die Grafikbeschleunigung tauchte nicht plötzlich auf. Bereits 1954 hatte United Airlines Flugsimulatoren für die Ausbildung von Piloten. Der größte Anbieter auf diesem Gebiet, Silicon Graphics, Inc. (SGI) erschien 1982 und bot zu dieser Zeit leistungsstarke Workstations wie Indy, O2 und Indigo². Die Preise dieser Maschinen erlaubten es jedoch nicht, sie von normalen Verbrauchern zu kaufen (der SGI Infinite Reality von 1993 konnte für 100.000 USD verkauft werden, was 177.262 USD im Jahr 2019 entspricht). Der Grund für die Situation, die Ende der 90er Jahre auftrat, war die Kombination von drei Faktoren.


Erstens ist der RAM-Preis erheblich gesunken. Obwohl es 1995 einen enormen RAM-Mangel gab (hauptsächlich, weil 8 MB Speicher für Microsoft Windows 95 empfohlen wurden), sank der RAM-Preis im Laufe des Jahres um fast 90%. Dies eröffnete Perspektiven für Karten mit erstaunlich großen Rahmenpuffern (640 x 480 mit 16-Bit-RGB-Farbe), die Texturen lokal speichern können.

Zweitens erhöhte RAM-Leistung. FastPage RAM war im Vergleich zu DRAM ein Fortschritt, aber nach der Freigabe von EDO RAM verringerten sich die Verzögerungen um 30% und die Zugriffszeit auf RAM betrug 50 ns [3] .

Das dritte und letzte Puzzleteil waren Killer-Apps. Der PC verfügt über leistungsstarke CPUs, beispielsweise Intel Pentium mit einer Frequenz von 166 MHz, mit denen Entwickler hochwertige 3D-Spiele erstellt haben. 1996 sprachen alle über zwei Spiele: Core Design's Tomb Raider und id Software's Quake.



Rendition und V1000


Rendition Inc wurde 1993 gegründet. Zwei Jahre später, 1995, gab das Unternehmen die Schaffung der V1000-Architektur bekannt, die schnell von vier OEMs lizenziert wurde. Creative Labs 3D Blaster PCI, Sierra Screamin '3D, Canopus Total 3D und Intergraph Reactor waren die ersten, die auf den Markt kamen, und bald übernahm MiRO.


Intergraph Reaktor. Bild von vgamuseum.ru.


Creative Labs 3D Blaster. Bild des Clubs „Retro Graphics Cards“.

Beachten Sie, dass der erste V1000-E-Chip später durch einen V1000L-P mit geringerem Stromverbrauch und 20% schneller ersetzt wurde [4] .


MiroCrystal VRX. Bild von vgamuseum.info.


Canopus Total3D. Bild von vgamuseum.ru.


Der Name der Karten änderte sich, aber die darin verwendeten Chips waren die gleichen. Der einzige Parameter, anhand dessen Hersteller Preis und Leistung in Einklang bringen mussten, war die auf der RAM-Karte installierte Qualität.

  1. VGA-Anschluss zum Anschließen an einen CRT-Monitor.
  2. Ramdac, normalerweise von Bt, aber manchmal ein AT & T-Chip.
  3. Der Kern der Karte ist ein V1000-E-, V1000-P- oder v1000-L-Chip.
  4. Acht 512-Kibyte-DRAM / EDO-Chips (insgesamt 4 Mebibyte) zum Speichern von Frame-Puffern und Texturen.
  5. 64 kb EEPROM mit BIOS.

Der V1000 hatte zwei inhärente Eigenschaften, die zu beachten sind, da 3dfx Voodoo (auf das ich später noch eingehen werde) einen radikal anderen Ansatz verwendete.

Erstens sollte die Karte ein Ersatz für das sein, was bereits beim Käufer installiert war. Der Chip unterstützte das Rendern von 2D und 3D in VGA und hatte dank Kontextwechseln einen beeindruckenden 3D-Modus im Fenster. Daher hatte die Karte einen einzigen VGA-Ausgangsanschluss.

Das zweite Merkmal ist die „Big Iron“ -Architektur, die auf einer einzelnen Mips-CPU basiert und Zugriff auf alle 4 Speicherbytes erhält. Der 64-Bit-Datenbus zwischen ihnen hatte keine besonderen Eigenschaften. Dieses standardisierte Design machte es einfach, die Karte mit dem bootfähigen Mikrocode zu programmieren (dies machte die Karte zur ersten GPU für einen PC, lange bevor Nvidia diese Definition entwickelte).

V1000 Programmierung


Das SDK [5] enthielt eine Reihe von Header-Dateien für die Interaktion mit der C-Sprache (RRedline unter Windows und Speedy3D unter DOS). Das Rendering des strukturierten Dreiecks ähnelte dem, was Vulkan mit manuellem VRAM heute bietet. Die API, die winkelbasierte strukturierte Dreiecke rendern kann, unterstützt auch Alpha-Tests, Alpha-Blending und Nebel.

#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 hat 128 KB Mikrocode in Vérité geladen und C-Aufrufe in V1000-Assembler-Funktionsaufrufe übersetzt.

Eine interessante Tatsache: Der Name der API "RRedline" schlug den Ausdruck "Rendition Ready" und wurde höchstwahrscheinlich gemeinsam gewählt. Der Name Speedy3D war jedoch die Idee von Walt Donovan.

Tatsächlich war der v1000 nur eine langsame CPU (25 MHz) mit einer 32 * 32-Einzelzyklus-Multiplikation (die einen wesentlichen Teil des Chips einnimmt!), Einem Einzelzyklus-Befehl zum Berechnen des approximierten inversen Werts (d. H. Zwei-Zyklus-approximierte ganzzahlige Division) und einem gemeinsamen Satz von RISC-Befehlen. Oh, und auch der Befehl "bilineares Laden", der einen linearen 2x2-Speicherblock ausliest und eine bilineare Filterung basierend auf den an den Befehl übergebenen Bruchwerten von u und v durchführte. Es gab einen winzigen Cache in der Karte, anscheinend nur 4 Pixel. Wenn daher ein perfekt passender 2x2-Block angezeigt wurde, wurde die Belastung der Speicherbandbreite verringert.

Es gab keine Hardware-Unterstützung für Z-Puffer. Daher musste die in v1000 ausgeführte Software Z lesen, einen Vergleich durchführen und dann entscheiden, ob geschrieben werden soll oder nicht.

- Walt Donovan (Algorithmusarchitekt)

Um Texturen und Mikrocode an die Karte zu senden, verwendete der Treiber DMA, um Daten ohne CPU-Eingriff über PCI zu übertragen. In der Praxis hatten viele Motherboards keine korrekte Bussteuerung, sodass die Spiele in den PCI-FIFO-Modus zurückkehren mussten, was sich negativ auf die Leistung auswirkte [6] . Innerhalb der Karte wurden alle Operationen in 32-Bit-Festkomma-Ganzzahlen ausgeführt.

Die Entwickler entschieden, dass Rendition vollständig programmierbar sein würde, verwendeten jedoch keine intelligente Pipeline oder schnelle Synchronisation. Wenn also 25 Anweisungen zum Aufzeichnen eines Pixels benötigt wurden, erhalten wir nur 1 Megapixel / s. Wenn Sie Geräte mit fester Funktionalität verwenden, können Sie einen Förderer erstellen, der diesen 25 Anweisungen entspricht, und 25 Megapixel / s erreichen. Die Mitarbeiter von 3dfx kamen von SGI und entschieden sich für den Ansatz, der sich als die richtige Entscheidung herausstellte - eine Dreiecksverarbeitungs-Engine mit festen Funktionen und einer Teilmenge von OpenGL-Funktionen für die Verwaltung der Geräte zu erstellen. Die V1000-Entwickler hatten eine völlig andere Erfahrung, sie kannten OpenGL nicht und entschieden daher, dass es korrekter wäre, eine CPU zu erstellen.

- Walt Donovan (Algorithmusarchitekt)

Zusätzlich zu all diesen Funktionen verfügte die Karte über ein innovatives Anti-Aliasing-System, das einen lustigen Nebeneffekt hatte.

Der in vQuake verwendete Anti-Aliasing-Algorithmus wurde patentiert (Patentnummer 6005580). Es gab einen lustigen Witz über diesen Algorithmus. Es funktionierte nur mit Dreiecken, aber nicht mit Intervallen. Quake verwendete das Konzept der „perfekten Z-Pufferung“, bei der Grafiken in Intervalle unterteilt und mithilfe von BSP / PVS (binäre Raumpartitionierung / eine Reihe potenziell sichtbarer Elemente) visuell sortiert wurden. Daher erstellte die Engine eine Reihe von Intervallen, die den Bildschirm idealerweise ohne Überlagerungen und fehlende Pixel abdeckten, und zum Rendern war ein einzelner Schreibvorgang (ohne Z-Pufferung!) Im Anzeigespeicher erforderlich. Die Anfangsdaten für diese Intervalle waren jedoch Dreiecke. Der Antialiasing-Algorithmus suchte nach Kanten von Silhouetten und glättete sie. (Weitere Informationen zu dieser Idee finden Sie unter humus.name, Geometrischer Post-Process-Antialiasing-Eintrag vom März 2011 - der Autor hat diese Technologie erneut erfunden!) Da das Anti-Aliasing jedoch nach dem Rendern des Bildschirms durchgeführt wurde (alle Intervalle wurden bereits gezeichnet), wurde der Konzeptalgorithmus verwendet hatte anscheinend eine Rippe oder nicht. Er hat es trotzdem gemalt. (Wenn ein Z-Puffer verwendet würde, würden nur sichtbare Kanten neu gezeichnet!) In der Praxis war dies kein großes Problem, da BSP normalerweise unsichtbare Dreiecke sehr gut schneidet.

Aber nicht mit Charaktermodellen! Durch das Beben konnte der Spieler Menschen sehen, die sich hinter Türen und Wänden versteckten, was zu einer kleinen und bewegenden Verzerrung der Texturen führte!

- Walt Donovan (Algorithmusarchitekt)

vQuake


Zum Zeitpunkt der Veröffentlichung der Karten unterstützten sie einige gute Spiele. Ja, Descent II, Grand Prix Legends, IndyCar Racing II, Myst, Nascar Racing, EF2000 und Tomb Raider waren gute Spiele, aber Quake war der wahre Diamant in der Krone, der anspruchsvollste und förderlichste Verkauf. Die Spiel-ID-Software erhielt unter Vérité einen eigenen Port namens vQuake, der am 2. Dezember 1996 veröffentlicht wurde. Es wurde von Walt Donovan und Stefan Share von Vérité in Zusammenarbeit mit id Abrash Michael geschrieben.

Die Arbeit war ziemlich mühsam, aber der Hafen funktionierte. Pentium 166Mhz, das Quake mit einer Auflösung von 320x200 bei 26 Bildern pro Sekunde rendern kann, könnte mit bilinearer Filterung auf 640x480 springen und dennoch mit 22 Bildern pro Sekunde rendern [8] . In der Praxis wählten die Spieler eine Auflösung von 512 x 384, die wunderschön aussah und es ermöglichte, auf dem P166 32 Bilder pro Sekunde bereitzustellen. Für kurze Zeit war vQuake zweifellos die beste Art, Quake zu spielen.

Bild

Software-Rendering

Bild

Vérité V1000

Vielen Dank an den Benutzer @swaaye vom vogons.org-Forum für Screenshots von V1000 und Fruit Of the Dojo für seinen hochwertigen und einfach zu hackenden Port Quake unter MacOSX [9] .

Bild

Software-Rendering

Bild

Vérité V1000

Z-Pufferfehler


Was dem V1000 (und indirekt seinem Nachfolger V2200) fehlte, war die Hardwarebeschleunigung des Z-Puffers. Sobald der Entwickler einen Tiefentest durchführte, fiel die Füllrate auf 12,5 Megapixel / s und die Bildrate wurde halbiert. Wie Stefan Podell später erklärte [10] , wurden vQuake (und alle anderen Spiele) so auf das V1000 portiert, dass das Lesen des Z-Puffers minimiert wurde.

Die Entwickler stellten fest, dass die einzige Möglichkeit, die erforderliche Geschwindigkeit sicherzustellen, darin bestand, den Hauptteil der Arbeit auf die CPU zu übertragen. Im Fall von vQuake bedeutete dies, dass die Karte als ultraschneller horizontaler Intervall-Renderer verwendet wurde, der immer in den Z-Puffer schreibt, aber z wird nur beim Rendern von Feinden gelesen und verglichen. Und obwohl es den Entwicklern gelungen ist, gute Produkte zu entwickeln, schwebten die Konsequenzen einer solchen Wahl der Architektur lange Zeit.

3dfx und Drop Rendition


id Software hat GLQuake am 22. Januar 1997 veröffentlicht. Es wurde basierend auf miniGL implementiert (eine Teilmenge des OpenGL 1.0-Standards, dem unter anderem GL_LIGHT und GL_FOG fehlten). Diese Binärdatei öffnete die Tür zu allen hardwarebeschleunigten PC-Karten. In dieser Hinsicht zeichneten sich die Voodoo-Karten von 3dfx Interactive besonders aus. Ihre beeindruckende Leistung (41 fps in einer Auflösung von 512 x 384 mit 16-Bit-Farbe auf P166 [11] ) wurde zum De-facto-Standard für 3D-Beschleuniger. Die Füllrate des V1000 von 25 Megapixeln / s, die früher im Vergleich zum Software-Rendering von Pentium günstig war, schien jetzt vor dem Hintergrund von 50 Megapixeln / s von der Voodoo-Karte, die nicht einmal von Z-Tests beeinflusst wurde, mittelmäßig zu sein.

Die Antwort von Rendition war das leistungsstärkere V2x00, was die Situation paradoxerweise verschlechterte. Es wurde angekündigt, dass der V2x00 dank des Hardware-Z-Puffers doppelt so schnell war, jedoch nicht einmal die Bildrate in vQuake verbessern konnte. Diese Anomalie untergrub das Kundenvertrauen und wirkte sich negativ auf den vQuake-Entwickler Stefan Sharele aus, der der Ansicht war, er müsse erklären, warum die Leistung von vQuake eher durch die CPU als durch die GPU eingeschränkt wurde [12] .

... mein Ruf wurde durch die Tatsache beeinträchtigt, dass VQuake und VHexen2 auf V2x00 nicht schneller funktionierten, daher muss ich erklären, warum dies passiert ist.

[...]

Walt und Michael entschieden, dass, da der Verite 1000 bei Pixeln mit Z-Pufferung keine sehr gute Leistung erbrachte, die Anzahl der Pixel, die Verite zeichnen muss, durch Pentium beim Sortieren dieser Intervalle verringert werden würde. Darüber hinaus könnten wir die Z-Vergleichsfunktion in Verite deaktivieren.

[...]

... was auch immer der Verite-Chip war, die CPU hat viel Arbeit bekommen.

- Stefan Podell

Darüber hinaus gab es erhebliche Probleme in der Hardwarearchitektur, die zunächst zum Ausfall von [13] V2x00 führten. Es dauerte mehrere Monate, um das Problem zu beheben, und selbst danach arbeitete das Board noch mit einer Frequenz von 50 MHz, während NVidia NV3 und Voodoo2 bereits 100 MHz erreichten.

Die dritte Generation, basierend auf dem V3300, könnte den Lauf der Geschichte verändern, aber es kam zu spät heraus. Das Projekt wurde 1998 abgebrochen, nachdem Rendition von Micron Technology übernommen wurde.

Während unserer Arbeit bei Rendition haben wir viele Fehler gemacht. Es war möglich, v1000 einige Monate zuvor zu veröffentlichen (und in diesen Monaten keine Konkurrenten zu haben), wenn wir das Schema selbst entwickelt und nicht auf die Fab übertragen haben. Darüber hinaus warf die Qualitätskontrolle des Chips Fragen auf. Ein Mitarbeiter unseres Unternehmens hat mehrere Monate damit verbracht, die MPEG-Dekomprimierung in der Assemblersprache V1000 zu implementieren, konnte sie jedoch aufgrund unvorhersehbarer Chip-Fehler nicht zum Laufen bringen.

vQuake hat gut funktioniert, nur weil die v1000 nicht viel Arbeit geleistet hat. "Diese Liste von Intervallen rendern", "diese Kante glätten" - das ist fast alles, was er getan hat. Mike Abrash und ich haben zu viel Zeit damit verbracht, Quake mit dem V1000 kompatibel zu machen, daher war dieses Modell auf lange Sicht nicht geeignet.

- Walt Donovan (Algorithmusarchitekt)

Nach dem Zusammenbruch von Rendition verdoppelte 3dfx seine Bemühungen, für Voodoo2 zu werben, dessen herausragende Eigenschaften es ermöglichten, alle Konkurrenten mitzunehmen. Der König der 3D-Grafik auf dem PC beherrscht seit einiger Zeit den Markt. Dann ging das Spiel weiter, neue Konkurrenten tauchten auf, darunter der kanadische ATI und eine damals fast unbekannte Firma namens Nvidia.

Referenzen


[1] Quelle: VGA Museum, V1000 Texel Fillrate (MTexel / s), angegeben als 25

[2] Quelle: John Carmack .plan 22. August 1996 „Bei 512 * 384 ist es fast doppelt so schnell“

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

[4] Quelle: Überprüfung des V1000

[5] Quelle: Rendition Verite V1000 SDK

[6] Quelle: Die [...] Unreife des PCI-Busses durch DMA-Fehler tritt auf

[7] Quelle: RRedline-Programmierhandbuch

[8] Quelle: Benchmarks zum Vergleich der Rendition Vérité V1000-E und V1000L-P

[9] Quelle: MacOSX X Quake-Port-Quellcode auf github.com

[10] Quelle: Stephan Podell BSS-Beitrag

[11] Quelle: Vergleich der Frameraten in GLQuake mit Voodoo1

[12] Quelle: BSS-Beitrag von Stephan Podell

[13] Quelle: wikipedia.com, Abschnitt "Untergang"

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


All Articles