През месец януари 1997 година много неща в света на компютърните игри се промениха, след като id Software представи новата версия на Quake с име GLQuake. И тъй като портът бе написан с помощта на miniGL (подмножество на стандарта OpenGL 1.1), всеки производител на хардуерни графични ускорители имаше възможност да напише свой miniGL драйвер и да се включи в надпреварата при 3D картите. От този момент, всеки получи възможността да се конкурира и да предложи решение с възможно най-много кадри в секунда. Нека накратко разгледаме тези събития и да висим кои два авторитета от това време без съмнение бяха считани за кралете в тази област.

„Засега няма никакви съмнения: светът на Quake се управлява от Voodoo. А тъй като Quake е водеща фигура в света на игрите, то закупуването на 3Dfx Voodoo е почти неизбежно за геймъра“ – Tom’s Hardware, 30 октомври 1997 година.

„3DFX Voodoo 1 е еталонът, по който се равняват всички останали графични карти“ – се казва в  .plan файла на Джон Кармак от 12 февруари 1998 година.

Само като погледнах спецификациите, в които се казва, че скоростта на запълване е 50 мегапиксела в секунда, веднага поисках да изуча тази карта и да направя нещо подобно, но още по-мощно.

3dfx Interactive

Рос Смит, Скот Селърс и Хари Търли се запознават, докато работят в SGI. Те работят известно време в Pellucid, където се опитват да продават платките IrisVision за персонални компютри (през 1994 година цената на една такава платка е $4000), но малко по-късно основават собствена компания с поддръжката на компанията TechFarm на Горди Кемпбъл. Така през 1994 година се появява компанията 3dfx Interactive, централният офис на която се намира в Сан Хосе, Калифорния.

Първоначално компанията възнамерява да изгражда мощни системи за аркадните автомати, но сменя дейността си и започва разработването на разширителни платки за персонални компютри. Причините за тази постъпка са три:

  • Достатъчно ниската цена на паметта
  • Започвайки от FastPage RAM, а след това при EDO RAM, таймингите намаляват с 30% и паметта вече може да работи с честота до 50 MHz
  • 3D или псевдо 3D игрите стават изключително популярни. Успехът на игри като DOOM, Descent и Wing Commander III показва, че вече са назрели условията за възникването на пазар за 3D ускорители
  • Основателите на компанията разбират, че трябва да създадат нещо мощно за тези игри, цената на което да е в рамките на 300-400 долара. През 1996 година компанията обявява създаването на новата архитектура SST1 (наречена така в чест на основателите – Sellers-Smith-Tarolli-1), за която съвсем скоро лицензи за използване закупуват редица OEM производители, включително Diamond, Canopus, Innovision и ColorMAX. За техните устройства е измислено маркетинговото име Voodoo1, подчертаващо високата „вълшебна“ производителност.

    Както и в случая с V1000, при създаването на собствени версии производителите могат да променят само типа на буферната памет, цвета на печатната платка и разположението на чиповете. Всичко останало е стандартизирано.

    1 от 4

    3dfx прави смела стъпка, като се отказва от 2D рендирането. Voodoo1 има два VGA порта, единият от които се използва вход, а другият – за изход. Карата е разработвана като допълнение – тя взема за входни данни информацията от стандартната 2D VGA карта, вече инсталирана в компютъра. Когато потребителят работи с операционната система (DOS или Windows), Voodoo1 просто препраща сигнала от своя VGA вход към своя VGA изход. Но при превключването към 3D режим, Voodoo1 поема контрола върху своя VGA изход и игнорира сигнала на своя VGA вход. Някои карти имат механичен превключвател, от който се чува ясно щракване при преминаване от 2D към 3D режим. Това решение очевидно означава, че Voodoo1 може да се използва само за рендиране на цял екран и няма как да показва изображение в програмен прозорец.

     

    Друг важен момент при SST1 е, че в нея не се използва един процесор а два непрограмируеми ASIC (Application-Specific Integrated Circuit) специализирани чипа. Ако погледнем пътечките на печатната платка ще видим, че всеки един от тези чипове, отбелязани като TMU и FBI, имат собствена памет. На картата с 4 MB буферна памет, тя е разделена по равно: 2 MB за TMU за изграждането на текстурите и 2 MB за FBI, които се използват за буфериране на цветовете и за z-буфера за изчисляване на дълбочината, като се записват съответно 16-битови RGBA и 16-битови integer/half-float думи. Картата с 4 MB буферна памет поддържа резолюция до 640х480 пиксела – 2 буфера за цветовете (640x480x2) за целите на двойното буфериране, плюс един буфер за дълбочината (640x480x2) = 1 843 200. Следващите модели с 4 MB памет за FBI дават резолюция до 800х600 пиксела – 2x800x600x2 + 800x600x2 = 2 880 000.

    Конвейера за рендиране SST1

    В спецификациите конвейерът не е описан подробно. Според моята интерпретация, животът на един триъгълник се състои от пет етапа:

  • Триъгълникът се създава и преобразува от централния процесор на компютъра – по това време обикновено Pentium. Това изисква извършване на операциите умножение на матрица на точките от пространството на модела, отрязване, премахване на еднородните координати и преобразуването на видимото поле. В края на този процес остават само видимите елементарни триъгълници от екранното пространство
  • С помощта на командата triangleCMD триъгълниците чрез PCI шината се подават на интерфейса на буфера на кадрите (Frame Buffer Interface, FBI). Те се преобразуват в заявки за растерни редове, създавани от Texture Mapping Unit. За всеки елемент от растерния ред (фрагмент) TMU изпълнява до четири заявки за търсене на филтър, ако на разработчика е необходимо билинейно филтриране
  • TMU изпраща фрагментите във FBI във вид на текстурирано 16-битово значение на RGBA цвета плюс 16-битовото z значение
  • FBI извършва тестове на фрагментите в z буфера, като ги сравнява със заделената буферна памет
  • Накрая, за всеки фрагмент се прилага осветяване на базата на атрибута за осветяването и се извършва търсене в таблицата със значенията на мъглата, която включва 64 елемента
  • Нещо не съвпада

    След като се запознахме с конвейера и знаем, че всеки компонент (TMU, FBI, EDO RAM) работи с честота 50 MHz, виждаме че в разчетите изглежда има някаква грешка и тази графична карта няма как да достигне скорост от 50 мегапискела в секунда.

    Необходимо е да бъдат решени два проблема.

    Първо, TMU трябва да прочита четири тексела (Texture element) за да може да се извърши билинейното филтриране на текстурите. А това означава, че трябва да се извършат четири цикъла на обръщение към паметта. Това ще доведе до недостиг на данни за TMU и съответно, скоростта на запълване ще падне до 40/14 = 12,5 мегапиксела в секунда.

    Има и друго тясно место на ниво FBI. Ако е включена проверката за дълбочина на z-буфера, то преди записването или отхвърлянето на входящото z значение на съответния фрагмент трябва да се сравнява с това, което вече се намира в z-буфера. Това са две операции с паметта, които двойно биха намалили скоростта на запълване: 50/2= 25 мегапиксела в секунда.

    Четирипосочният интерлийв на TMU

    Решението на проблема с четирите семпъла е дадено в спецификациите на SST1.

    „Паметта за данните на текстурите е разделена на няколко редуващи се части, което дава възможност на всяка отделна банка да има достъп до данните, независимо от адреса. използван за достъп до данните в другите банки“ – част от SST1 спецификацията.

    В спецификацията не се казва дали се използва мултиплексиране на адресите и дали можем да ги покажем без мултиплексиране и без разделяне:

    По този начин, TMU архитектурата позволява за един такт да се получат 4х 16-битови тексела.

    Двупосочният интерлийв при FBI

    Решението на проблема с двете операции за достъп до паметта при FBI също не е описано в спецификациите. Но в документа се казва, че скоростта на запълване е 100 мегапиксела за секунда, благодарение на възможността за запис на два пиксела за такт. Това се постига чрез двупосочно редуване (двупосочен интерлийв).

    FBI (Frame Buffer Interface) чете и записва по два пиксела наведнъж (2х 1 пиксел, включващи 16-битов цвят и 16 битов z). За тази цел 21-битовия адрес се преобразува в два 20-битови адреса, в които най-младшият бит е отхвърлен и се използва за четене и запис на двата поредни пиксела. И тъй като алгоритъмът за изчертаване на растерни линии се движи отляво надясно, четенето на два поредни пикела наведнъж, изключително много помага за реализацията на този алгоритъм.

    Програмирането на Voodoo1

    На най-ниско ниво програмирането на Voodoo1 става с помощта на регистрите, а API има удивително малък брой команди. Всъщност, те са само пет: TRIANGLECMD (с фиксирана запетая), FTRIANGLECMD (с плаваща запетая), NOPCMD (no-op), FASTFILLCMD (изчистване на буфера) и SWAPBUFFERCMD за зареждането на регистрите с данни за осъществяване на z-теста, смесването, зареждането на цветовете на мъглата и още много други. Зареждането на текстурите във VRAM става чрез 8 MB write-only памет, която е дублирана в оперативната памет на компютърната система.

    Разработчиците програмираха Voodoo1 чрез Glide API. Логиката на дизайна на Glide API е вдъхновена от GL/OpenGL, като основните разлики са, че вместо вместо префикса gl се използва gr, а програмистите трябва самостоятелно да управляват VRAM, както сега се прави във Vulkan.

    Ето един пример:

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

     

    GLQuake

    Теоретичният максимум на скоростта на запълване от 50 мегапиксела в секунда би трябвало да осигурява опресняване на кадрите с честота почти 50 Hz при резолюция 640х480. Но тъй като Quake комбинира по два слоя текстури за една и съща повърхност (единият слой е за цвета, а вторият – за картата на осветеността), то всеки кадър се рисува на два пъти, като при втория пас се прилага допълнително отместване. В резултат от това с процесор P166Mhz играта Quake работи с 26 fps.

    Софтуерно рендиране
    GLQUAKE VOODOO1

    А ако резолюцията на играта бъде намалена до 512х384 пиксела, получават се плавни 41 fps, каквито по това време не може да достигне нито един конкурент.

    3fdx Voodoo2

    Малко е да се каже, че 3dfx беше еталонът на пазара от 1996 до 1998 година. След SST1, технологията Voodoo2 вдигна летвата на производителността още по-високо благодарение на 100 MHz EDO RAM, ASIC с честота 90 MHz, както и с използването на два TMU чипа, даващи възможност за генерирането на един кадър с двойна текстура за нуждите на Quake само за един пас. Тази технология бе чудовищна за времето си, а и самите графични карти изглеждаха разкошно.

    Скоростта за запълване при Voodoo2 почти се удвои и достигна 90 МР/с. Бенчмарковете на Quake достигнаха до потресаващите за времето си 80 fps при система с процесор Pentium II 266 MMX.

    За съжаление, след излизането на Voodoo3 през 1999 година, съдбата на 3dfx рязко се промени. Компанията се опита да разработва собствени универсални карти и прекрати да продава на OEM производителите своите технологии, понеже се сблъска с нарастващата конкуренция в това отношение.

    Следващата графична карта Voodoo3 се оказа по-слаба в сравнение с видеокартата GeForce 256 на компанията Nvidia, която предлага хардуерната поддръжка на теселацията и осветяването на сцените.

    В отговор на това, 3dfx отложи излизането на Voodoo4 и пристъпи към създаването на Voodoo5 с технологията VSA-100 (Voodoo Scalable Architecture). Резултатът бе доста неочакван. Новата графична карта с кодово име Napalm се сблъска с конкуренцията на още по-мощните NVidia GeForce 2 и ATI Radeon. И накрая, на 28 март 2000 година 3dfx обяви фалит и бе закупена от Nvidia.

     

    За хората, живели през 90-те години и играли игри, ускорени от Voodoo1 или Voodoo2, компанията 3dfx си остава знакова компания, символизираща превъзходство в много отношения. Тя стана нещо като ода на заслужения успех, постигнат благодарение на проявената смелост, изключителния талант и упоритата работа. Адмирации.