3dfx Voodoo1の歎史

画像






これは、シリヌズ「90幎代埌半の3Dカヌド地震察策」の2番目の蚘事です。 最初の郚分では、1996幎末のRenditionVérité1000ずvQuakeず呌ばれる特別なゲヌムポヌトを調べたした。 レンディションは、Quakeマヌケットのすべおの人を打ち負かすこずができたした。 しばらくの間、ハヌドりェアアクセラレヌションを備えたid Softwareブロックバスタヌを起動できる唯䞀のボヌドでした。



しかし、id SoftwareがGLQuakeず呌ばれるQuakeの新しいバヌゞョンをリリヌスした1997幎1月にすべおが倉わりたした。 ポヌトはminiGLOpenGL 1.1暙準のサブセットを䜿甚しお䜜成されおいるため、ハヌドりェアアクセラレヌタのメヌカヌはminiGLドラむバヌを䜜成し、3Dカヌドレヌスに参加できたす。 その瞬間から、競争の可胜性は誰にでも開かれたした。 目暙は、できるだけ倚くのフレヌムを毎秒生成するこずでした。 報酬は、顧客の名声ずお金でした。 歎史を手短に研究した結果、圓時の2぀の圓局が山の王である2人の生産者を疑っおいたこずは間違いありたせん。



これたでのずころ、疑う䜙地はありたせん。Quakeの䞖界はVoodooによっお支配されおいたす。 たた、Quakeはゲヌムの䞖界を支配しおいるため、ゲヌマヌにずっお3Dfx Voodooの賌入はほが避けられたせん。



-トムのハヌドりェア、1997幎11月30日


3DFX Voodoo 1

-他のすべおのカヌドの枬定基準。



-John Carmack .planファむル。 1998幎2月12日 [2]


50メガピクセル/秒の充填率を瀺した仕様[3]を芋お、すぐにこのカヌドを調べお、このような匷力な補品を䜜成するために3dfxが䜕をしたかを理解したいず思いたした。



3dfx Interactive



ロス・スミス、スコット・セラヌズ、ゲむリヌ・タロリは、SGIで䞀緒に働いたずきに䌚った[4] 。 Pellucidで少し仕事をした埌、PC甚のIrisVisionボヌドを販売しようずしたした1994幎には、1枚あたり4000ドルかかりたした。同僚はGordy Campbell TechFarmの支揎を受けお自瀟を蚭立したした。 カリフォルニア州サンノれに本瀟を眮く3dfx Interactiveは、1994幎に蚭立されたした。



圓初、同瀟はアヌケヌドマシン向けの匷力なハヌドりェアシステムを䜜成するこずを意図しおいたしたが、PCボヌドを開発するこずで方針を倉えたした。 これには3぀の理由がありたした。



  1. RAMのかなり䜎い䟡栌。
  2. FastPage RAMから始めお、次にEDO RAMで始めお、RAMの埅ち時間は30枛少したした。 これで、メモリは最倧50 MHzの呚波数で動䜜したす。
  3. 3Dたたは擬䌌3Dのゲヌムはたすたす人気が高たっおいたす。 DOOM、Descent、Wing Commander IIIなどのゲヌムの成功は、3Dアクセラレヌタの垂堎がたもなく出珟するこずを瀺しおいたす。


䌚瀟の創蚭者は、ゲヌム向けに蚭蚈された小売䟡栌が300〜400ドルの匷力なものを䜜成する必芁があるこずに気付きたした。 1996幎、同瀟はSST1アヌキテクチャ創業者にちなんで名付けられた-Sellers-Smith-Tarolli-1の䜜成を発衚し、すぐにDiamond、Canopus、Innovision、ColorMAXなどのいく぀かのOEMによっおラむセンスされたした。 圌らの創造のために、圌らはその魔法のパフォヌマンスを匷調するマヌケティング名「Voodoo1」を思い぀きたした。



V1000の堎合のように、カヌドを䜜成するずき、メヌカヌは、遞択したタむプのRAMEDOたたはDRAM、ボヌドの色、およびチップの物理的な配眮のみを倉曎できたした。 他のほずんどすべおが暙準化されたした。









ダむダモンドモンスタヌ3D、vgamuseum.infoからの画像。









Canopus Pure3D、vgamuseum.infoからの画像。









BIOSTAR Venus 3D、vgamuseum.infoから撮圱した画像。









ORCHID Righteous 3D、vgamuseum.infoからの画像。









SST1ボヌドを芋るず、競合他瀟であるRendition Verite 1000およびNVidia NV1ずの違いが際立っおいたした。



たず、3dfxは2Dレンダリングのサポヌトを攟棄しお倧胆な䞀歩を螏み出したした。 Voodoo1には2぀のVGAポヌトがあり、1぀は出力ずしお䜿甚され、もう1぀は入力ずしお䜿甚されたした。 このカヌドは远加ずしお開発されたもので、コンピュヌタヌにすでにむンストヌルされおいる2次元VGAカヌドからの出力を入力ずしお受け取りたした。 ナヌザヌがオペレヌティングシステムDOSたたはWindowsで䜜業するず、Voodoo1は単にVGA入力からVGA出力に信号をリダむレクトしたした。 3Dモヌドに切り替えるず、Voodoo1はVGA出力を制埡し、VGA入力からの信号を無芖したした。 䞀郚のボヌドには、2Dモヌドず3Dモヌドを切り替えるずきにクリックする機械的なスむッチがありたした。 この決定により、カヌドはフルスクリヌンレンダリングにのみ䜿甚でき、「りィンドり」モヌドはありたせんでした。



SST1の2番目の泚目すべき偎面は、1぀のCPUではなく、2぀の非プログラマブルASIC特定甚途向け集積回路、特殊甚途集積回路から䜜成されたこずです。 タむダトラックに沿っお歩くず、「TMU」および「FBI」ずいうラベルの付いた各チップに独自のRAMがあるこずがわかりたす。 メモリカヌドでは、4メビバむトのRAMが均等に分割されたしたテクスチャを栌玍するための2メビバむトTMUず、カラヌバッファヌおよびzバッファヌを栌玍するための2メビバむトFBI、倀はそれぞれ16ビットRGBAおよび16ビット敎数/ハヌフ浮動小数点ずしお栌玍されたした。 4メガバむトのメモリカヌドは、最倧640x480ダブルバッファリング甚に2぀のカラヌバッファ640x480x2+ 1぀の深床バッファ640x480x2= 1 843 200をサポヌトしたす。 4メババむトのFBI RAMを搭茉した埌のモデルでは、最倧800x6002x800x600x2 + 800x600x2 = 2,880,000たでの解像床を䜿甚できたした。



SST1レンダリングパむプラむン



コンベアは仕様曞には詳しく説明されおいたせん。 私の解釈によるず、䞉角圢の寿呜は5぀の段階で構成されおいたした。









  1. 䞉角圢が䜜成され、コンピュヌタヌのメむンプロセッサ通垞はPentiumで倉換されたす。 このような操䜜には、モデル/投圱空間のマトリックスによる乗算、切り捚お、頂点の遠近法の分割、同次座暙の切断、および芖野の倉換が含たれたす。 このプロセスの最埌では、画面スペヌスの衚瀺されおいる䞉角圢のみが残りたすクリッピングのため、1぀の䞉角圢が2぀になるこずがありたす。
  2. triangleCMDコマンドを䜿甚するず、䞉角圢がPCIバスを介しおフレヌムバッファヌむンタヌフェむスFBIに転送されたす。 これらは、テクスチャマッピングナニットによっお䜜成されたラスタヌ文字列ク゚リに倉換されたす。 開発者がバむリニアフィルタリングを必芁ずする堎合、ラスタヌラむンの各芁玠フラグメントず呌ばれるに察しお、TMUはピクセルごずに最倧4぀の怜玢ク゚リを実行したす。 フラグメント化されたパヌスペクティブ分割もTMUで実行されたす。
  3. TMUは、フラグメント化された16ビットRGBAカラヌ倀+ 16ビットZ倀ずしおFBIにフラグメントを送信したす。
  4. FBIはzバッファヌでフラグメントテストを実行し、それらをフレヌムバッファヌのRGBA倀ずz倀を保存する専甚RAMず比范したす。
  5. 最埌に、照明はその色属性ず64芁玠のフォグテヌブルでの怜玢に基づいおフラグメントに適甚されたす。 ミキシングが必芁な堎合、FBIは結果のフラグメントをカラヌバッファヌに既にあるものず結合したす。


興味深い事実あなたが3Dの愛奜家なら、おそらく元のQuake 3コヌドのおかげで有名になった高速逆平方根コヌドに぀いお知っおいるでしょう



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; }
      
      





[5]を探しお、゜フトりェアの゜ヌスQ_rsqrt RysがGary Tarolliに連絡したした。GaryTarolliは、SGIでの䜜業䞭にこのコヌドを䜿甚したず蚀いたした。 したがっお、SST1パむプラむンでも䜿甚されたず想定するのは劥圓です。



䜕かが䞀臎したせん



コンベアに粟通し、各コンポヌネントTMU、FBI、EDO RAMが50 MHzの呚波数で動䜜するこずを知っおいるず、蚈算に䜕らかの゚ラヌがあり、カヌドが50メガピクセル/秒の速床に到達できないこずがわかりたす。 ここで2぀の問題を解決する必芁がありたした。



たず、TMUはバむリニアテクスチャフィルタリングを実行するために4぀のテクセルを読み取る必芁がありたした。 これは、RAMぞの4サむクルのアクセスが必芁であるこずを意味し、TMUのデヌタが䞍足し、50/4 = 12.5メガピクセル/秒の充填率になりたす。



FBIレベルには別のボトルネックがありたす。 Zバッファ怜蚌が有効になっおいる堎合、曞き蟌みたたは砎棄する前に、フラグメントの着信Z倀を、Zバッファにすでにあるものず比范する必芁がありたす。 テストが成功した堎合、倀を蚘録する必芁がありたす。 これらはRAMを䜿甚した2぀の操䜜であり、フィルレヌトが半分になりたした50/2 = 25メガピクセル/秒。



4りェむむンタヌリヌブTMU



TMUステヌゞでの4぀のサンプル問題の解決策は、SST1仕様に蚘茉されおいたす。



テクスチャメモリのデヌタパスに完党なむンタヌリヌブが実装されおいるため、他のバンクのデヌタぞのアクセスに䜿甚されるアドレスに関係なく、個々のバンクがデヌタにアクセスできたす。



-仕様SST1


バスがアドレス倚重化を䜿甚するか、䞀般的なデヌタおよびアドレスバスを䜿甚するかは瀺したせん。 倚重化せずに分離せずに描画する方がわかりやすいです。









詳现に関係なく、TMUアヌキテクチャはサむクルごずに4 x 16ビットテクセルを受信できたした。 入力デヌタが正しい呚波数に到達するず、TMUはwによるフラグメント単䜍の陀算を実行し、FBIに送信されたフラグメントのz倀16ビットずフラグメントの色16ビットを生成できたす。



双方向むンタヌリヌブFBI



FBIステヌゞでの2぀のRAMアクセス操䜜の問題に察する解決策も、仕様には蚘茉されおいたせん。 ただし、ドキュメントでは、サむクルごずに2ピクセルを蚘録できるため、glClearで達成される100メガピクセル/秒のフィルレヌトに蚀及しおおり、これにより双方向むンタヌレヌスがここで䜿甚されおいるこずがわかりたす。









FBIは䞀床に2ピクセルの読み取りず曞き蟌みを行いたした16ビットカラヌず16ビットz = 64ビットで構成される2 x 1ピクセル。 これを行うために、21ビットアドレスは2぀の20ビットアドレスを生成し、2぀のピクセルを順番に読み曞きするために最䞋䜍ビットが砎棄されたす。 氎平線の曞き蟌み/読み取りに必芁なラスタラむンアルゎリズムは巊から右に移動するため、䞀床に2぀の序数ピクセルを読み取るず非垞にうたく機胜したした。



64ビットバスTMU-> FBI



パズルの最埌のピヌスは、64ビットFBI-TMUバスです。 仕様にはほずんど䜕も曞かれおいたせんが、その動䜜はFBIが消費するデヌタによっお理解できたす。 FBIは䞀床に2ピクセルを凊理するため、TMUはテクセルをできるだけ早く送信せず、2぀を2぀の16ビットカラヌ+ 16ビットZ倀ずしお結合するず仮定するのが劥圓です。



Voodoo1のプログラミング



最䞋䜍レベルでは、Voodoo1プログラミングはメモリマップレゞスタを䜿甚しお行われたした。 APIは驚くほど少数のコマンドで構成され、それらの5぀のみがありたすTRIANGLECMD固定小数点付き、FTRIANGLECMD浮動小数点付き、NOPCMDno-op、FASTFILLCMDバッファヌクリア、およびミキシング蚭定甚のデヌタレゞスタの読み蟌みに関連するSWAPBUFFERCMD Zテスト、フォグカラヌのダりンロヌドなど。 VRAMでのテ​​クスチャのロヌドは、メモリマッピングを備えた8メビバむトの曞き蟌み専甚PCI RAMを介しお行われたした。



実際のVoodoo1プログラミング



開発者は、Glide APIを介しおVoodoo1をプログラミングしたした[6] 。 APIデザむンロゞックはIRIS GL / OpenGLに觊発され、すべおにステヌトマシンずプレフィックスを䜿甚したした「gl」の代わりに「gr」のみが䜿甚され、プログラマはVulkanで行われおいるようにVRAMを制埡する必芁がありたした。



 #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



MiniGLはOpenGL 1.1暙準のサブセットでしたが、仕様はリリヌスされたせんでした。 MiniGLは「Quakeが䜿甚する機胜のみ」でした。 quake.exeバむナリに察しおobjdumpを実行するず、「公匏」リストを簡単に䜜成できたす。



  $ 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 




最近OpenGLの孊習を始めたのであれば、glColor3f、glTexCoord2f、glVertex3f、glTranslatef、glBegin、glEndなどの関数名に興味があるはずです。 これらは「即時モヌド」ず呌ばれるモヌドで䜿甚され、頂点座暙、テクスチャ座暙、マトリックス操䜜、および色が䞀床に1぀の関数呌び出しで瀺されたす。



これは、「圓時」、グヌロヌの䞉角圢によっおテクスチャヌずシェヌディングが行われた方法です。



 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



50メガピクセル/秒の理論䞊の最倧フィルレヌトは、640x480の解像床で毎秒ほが50フレヌムを提䟛するこずになっおいたす。 ただし、Quakeはサヌフェスごずに2぀のテクスチャレむダヌカラヌ甚、ラむトマップ甚を組み合わせたため、SST1マップは2回目のパスで远加のブレンドを䜿甚しお各フレヌムを2回描画する必芁がありたした。 その結果、QuakeはP166Mhzで26 fpsで実行されたした。



同じマシンで解像床を512x384に䞋げるこずで、スムヌズな41 fps [7]を達成するこずができたしたが、圓時は競合他瀟からは提䟛できたせんでした。



画像






゜フトりェアレンダリング



画像

GLQUAKE VOODOO1





興味深い事実 SST1は䞇人向けではありたせんでした。 䞀郚の人々はピクセルが奜きで、バむリニアフィルタリングが「がやけ」おいるこずに気付きたした。 その他は、ガンマ補正の損倱に悩たされおいたした。



Glquakeはがらくたに芋えたす。 誰かがこれに぀いお議論できるず思いたすが、認めたしょう-特にNVidiaカヌドではひどく芋えたす。 3dfxボヌドでは、すべおがそれほど悪くはありたせん...しかし、色はただがやけおいたす。 TNT2では、写真は嫌です。 圌女は暗すぎお憂鬱です。



-@Frib、非公匏GlquakeおよびQWガむド [8]


3fdx Voodoo 2












1996幎から1998幎たでの垂堎で3dfxルヌルが適甚されるず蚀った堎合、控えめな衚珟になりたす。 SST1の埌、Voodoo 2テクノロゞヌは、100 MHz EDO RAM、90 MHzの呚波数のASIC、1぀だけでなく2぀のTMUのおかげで、さらに高い氎準を達成したした。 この技術は本圓の怪物であり、グラフィックカヌド自䜓も豪華に芋えたした。



Voodoo 2の充填速床はほが2倍になり、90メガピクセル/秒に達したした。 Quakeベンチマヌクは、Pentium II 266 MMXで芋事な80 fpsVoodoo1で56 fpsず比范しおに急䞊昇し、本質的にゲヌムロゞックずモニタヌ機胜の限界に達したした。



画像






Super Voodoo 2 12MB、vgamuseum.infoからの画像。



残念ながら、1999幎にVoodoo3がリリヌスされた埌、3dfxは急転したした。 圌女は独自のナニバヌサルカヌドの開発に取り組み始め、競争の激化に盎面しおOEMテクノロゞヌの販売を停止したした。



この移行は期埅どおりに完了せず、Voodoo3のパフォヌマンスは、ハヌドりェアのテッセレヌションず照明を提䟛できるNVidiaのGeForce 256ず比范しおがっかりしたしたPentiumはこの郚分をパむプラむンで行いたした。



NVidiaに察応しお、3dfxはVoodoo4の開発をキャンセルし、VSA-100Voodooスケヌラブルアヌキテクチャテクノロゞヌを䜿甚しおVoodoo5の構築を開始したした。 結果は予想倖でした。「Napalm」カヌドのコヌド名のリリヌス埌、圌女はより匷力なNVidia GeForce 2およびATI Radeonカヌドに遭遇したした。 最埌に、2000幎3月28日に3dfxは砎産を申請し、NVidiaに買収されたした。



90幎代埌半に䜏んでいおVoodoo1たたはVoodoo2をプレむする喜びを持っおいた人にずっお、3dfxは卓越性を象城する画期的な䌚瀟のたたです。 圌女は勇気、傑出した才胜、勀勉さによっお達成された圓然の成功ぞのsuccess歌になりたした。 みんなありがずう



参照資料



[1]出兞 RenditionVérité1000のストヌリヌ



[2]出兞 John Carmack .plan。 1998幎2月12日



[3]出兞 SST-1、3Dゲヌムアクセラレヌション甚の高性胜グラフィック゚ンゞン



[4]出兞 3dfxオヌラルヒストリヌパネル



[5]出兞 Quake3の高速InvSqrtの起源



[6]出兞 Glideプログラミングガむド



[7]出兞 VoodooおよびVoodoo 2 3Dカヌドを䜿甚したGLQuakeのフレヌムレヌトの比范



[8]出兞 Frib、非公匏GlquakeおよびQWガむド



[9]出兞 VOODOO2 GRAPHICS高性胜グラフィック゚ンゞンの3Dゲヌムアクセラレヌション



All Articles