Sejarah 3dfx Voodoo1

gambar

Ini adalah artikel kedua dalam seri “Kartu 3D Gempa Akhir Tahun 90-an yang Bekerja”. Pada bagian pertama, kami memeriksa Rendition Vérité 1000 pada akhir tahun 1996 dan port game khusus untuknya yang disebut vQuake. Rendition berhasil mengalahkan semua orang di pasar Gempa. Untuk waktu yang singkat, itu tetap satu-satunya papan yang mampu meluncurkan blockbuster Perangkat Lunak id dengan akselerasi perangkat keras.

Tapi itu semua berubah pada Januari 1997, ketika id Software merilis versi baru Quake yang disebut GLQuake. Karena port dibuat menggunakan miniGL (bagian dari standar OpenGL 1.1), setiap produsen akselerator perangkat keras dapat menulis driver miniGL dan mengambil bagian dalam perlombaan kartu 3D. Sejak saat itu, kemungkinan kompetisi terbuka untuk semua orang. Tujuannya adalah untuk menghasilkan frame per detik sebanyak mungkin. Hadiahnya adalah ketenaran dan uang pelanggan. Setelah mempelajari sejarah secara singkat, orang dapat memahami bahwa kedua penguasa pada masa itu tidak diragukan lagi menganggap raja-raja dari gunung itu dua produsen.

Tidak ada keraguan tentang itu sejauh ini: dunia Quake diperintah oleh Voodoo. Dan karena Quake menguasai dunia game, membeli 3Dfx Voodoo hampir tidak bisa dihindari bagi para gamer.

- Tom's Hardware, 30 November 1997

3DFX Voodoo 1
- Standar pengukuran semua kartu lainnya.

- John Carmack .plan file. 12 Februari 1998 [2]

Hanya dengan melihat spesifikasi [3] , yang menyatakan tingkat pengisian 50 megapiksel / s, saya segera ingin mempelajari kartu ini dan memahami apa yang dilakukan 3dfx untuk membuat produk yang begitu kuat.

3dfx Interactive


Ross Smith, Scott Sellers dan Gary Tarolli bertemu ketika mereka bekerja bersama di SGI [4] . Setelah bekerja sedikit di Pellucid, di mana mereka mencoba menjual papan IrisVision untuk PC (pada tahun 1994 papan tersebut harganya $ 4000), rekan-rekan mendirikan perusahaan mereka sendiri dengan dukungan dari Gordy Campbell TechFarm. 3dfx Interactive, berkantor pusat di San Jose, California, didirikan pada tahun 1994.

Awalnya, perusahaan bermaksud untuk menciptakan sistem perangkat keras yang kuat untuk mesin arcade, tetapi mengubah arahnya dengan mengembangkan papan PC. Ada tiga alasan untuk ini.

  1. Harga RAM yang sangat rendah.
  2. Dimulai dengan FastPage RAM dan kemudian EDO RAM, latency dalam RAM telah berkurang 30%. Sekarang memori bisa bekerja dengan frekuensi hingga 50 MHz.
  3. Game dalam 3D (atau pseudo-3D) menjadi semakin populer. Keberhasilan gim seperti DOOM, Descent, dan Wing Commander III telah menunjukkan bahwa pasar akselerator 3D akan segera muncul.

Para pendiri perusahaan menyadari bahwa mereka perlu menciptakan sesuatu yang kuat, dirancang untuk permainan dan dengan harga eceran di kisaran 300-400 dolar. Pada tahun 1996, perusahaan mengumumkan penciptaan arsitektur SST1 (dinamai setelah pendiri - Penjual-Smith-Tarolli-1), yang segera dilisensikan oleh beberapa OEM seperti Diamond, Canopus, Innovision dan ColorMAX. Untuk kreasi mereka muncul dengan nama pemasaran "Voodoo1", yang menekankan kinerja magisnya.

Seperti pada V1000, saat membuat kartu, pabrikan hanya dapat mengubah jenis RAM yang dipilih (EDO atau DRAM), warna papan, dan pengaturan fisik chip. Hampir semuanya standar.


Diamond Monster 3D, gambar diambil dari vgamuseum.info.


Canopus Pure3D, gambar diambil dari vgamuseum.info.


BIOSTAR Venus 3D, gambar diambil dari vgamuseum.info.


ORCHID 3D Benar, gambar diambil dari vgamuseum.info.


Ketika melihat papan SST1, sangat mengejutkan betapa berbedanya dengan pesaingnya - Rendition Verite 1000 dan NVidia NV1.

Pertama, 3dfx mengambil langkah berani, meninggalkan dukungan rendering 2D. Voodoo1 memiliki dua port VGA, satu digunakan sebagai output, dan yang lainnya sebagai input. Kartu ini dikembangkan sebagai tambahan, dibutuhkan sebagai input output dari kartu VGA dua dimensi, sudah terpasang di komputer. Ketika pengguna bekerja dengan sistem operasi (DOS atau Windows), Voodoo1 hanya mengalihkan sinyal dari input VGA ke output VGA. Saat beralih ke mode 3D, Voodoo1 mengendalikan output VGA dan mengabaikan sinyal dari input VGA-nya. Beberapa papan memiliki sakelar mekanis yang diklik saat beralih antara mode 2D dan 3D. Keputusan ini berarti bahwa kartu hanya dapat digunakan untuk rendering layar penuh, tidak ada mode "jendela".

Aspek penting kedua dari SST1 adalah bahwa itu tidak dibuat dari satu CPU, tetapi dari dua ASIC yang tidak dapat diprogram (Sirkuit Terpadu Khusus Aplikasi, Sirkuit Terpadu Tujuan Khusus). Jika Anda berjalan di sepanjang jalur ban, Anda dapat melihat bahwa masing-masing chip berlabel "TMU" dan "FBI" memiliki RAM sendiri. Pada kartu memori, 4 mebibytes RAM dibagi sama rata: 2 mebibytes TMU untuk menyimpan tekstur dan 2 mebibytes FBI untuk menyimpan buffer warna dan z-buffer, sementara nilai-nilai disimpan masing-masing sebagai 16-bit RGBA dan 16-bit integer / half-float. Kartu memori dengan 4 mebibytes mendukung resolusi hingga 640x480 (2 buffer warna (640x480x2) untuk buffering ganda + 1 buffer kedalaman (640x480x2) = 1 843 200). Model selanjutnya dengan 4 mebibytes dari FBI RAM diizinkan menggunakan resolusi hingga 800x600 (2x800x600x2 + 800x600x2 = 2.880.000).

Pipa render SST1


Konveyor tidak dijelaskan secara rinci dalam spesifikasi. Menurut interpretasi saya, kehidupan segitiga terdiri dari lima tahap.


  1. Segitiga dibuat dan ditransformasikan dalam prosesor utama komputer (biasanya Pentium). Operasi tersebut termasuk perkalian dengan matriks model / ruang proyeksi, pemotongan, pembagian perspektif sudut, memotong koordinat homogen, dan mengubah bidang pandang. Pada akhir proses ini, hanya segitiga yang terlihat dari ruang layar yang tersisa (karena kliping, satu segitiga bisa berubah menjadi dua).
  2. Menggunakan perintah triangleCMD, segitiga ditransfer melalui bus PCI ke Frame Buffer Interface (FBI). Mereka dikonversi ke kueri string raster yang dibuat oleh Unit Pemetaan Tekstur. Untuk setiap elemen garis raster (disebut fragmen), TMU melakukan hingga empat permintaan pencarian per piksel jika pengembang memerlukan pemfilteran bilinear. Pembagian perspektif terfragmentasi juga dilakukan dalam TMU.
  3. TMU mengirimkan fragmen ke FBI sebagai nilai warna RGBA 16-bit bertekstur + nilai z 16-bit.
  4. FBI melakukan tes fragmen dalam buffer-z, membandingkannya dengan RAM yang dialokasikan, yang menyimpan nilai-nilai RGBA dan nilai-z dari buffer frame.
  5. Akhirnya, pencahayaan diterapkan pada fragmen berdasarkan atribut warnanya dan pencarian di tabel kabut 64 elemen. Jika diperlukan pencampuran, FBI menggabungkan fragmen yang dihasilkan dengan apa yang sudah ada dalam buffer warna.

Fakta menarik: jika Anda seorang penggemar 3D, Anda mungkin tahu tentang kode root kuadrat terbalik cepat, yang menjadi terkenal berkat kode Quake 3 asli:

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

Dalam pencarian [5] sumber Q_rsqrt Rys untuk Perangkat Lunak menghubungi Gary Tarolli, yang mengatakan bahwa ia menggunakan kode ini saat masih bekerja di SGI. Jadi wajar untuk menganggap bahwa itu juga digunakan dalam pipa SST1.

Sesuatu tidak cocok


Setelah berkenalan dengan conveyor dan mengetahui bahwa setiap komponen (TMU, FBI, EDO RAM) beroperasi pada frekuensi 50 MHz, kita dapat memahami bahwa ada beberapa jenis kesalahan dalam perhitungan dan kartu tidak dapat mencapai kecepatan 50 megapiksel / s. Dua masalah harus diselesaikan di sini.

Pertama, TMU harus membaca empat texels untuk melakukan penyaringan tekstur bilinear. Ini berarti bahwa empat siklus akses ke RAM diperlukan, yang akan menyebabkan kurangnya data untuk TMU dan tingkat pengisian 50/4 = 12,5 megapiksel / s.

Ada hambatan lain di tingkat FBI. Jika pemeriksaan z-buffer diaktifkan, maka sebelum menulis atau membuang nilai-z yang masuk dari fragmen harus dibandingkan dengan apa yang sudah ada di z-buffer. Jika tes berhasil, maka nilainya harus dicatat. Ini adalah dua operasi dengan RAM, yang menyebabkan penurunan tingkat pengisian hingga setengahnya: 50/2 = 25 megapiksel / s.

TMU interleaving empat arah


Solusi untuk masalah empat sampel pada tahap TMU disebutkan dalam spesifikasi SST1.

Interleaving penuh diterapkan dalam jalur data memori tekstur, yang memungkinkan bank tunggal untuk mengakses data terlepas dari alamat yang digunakan untuk mengakses data di bank lain.

- Spesifikasi SST1

Itu tidak menunjukkan apakah bus menggunakan multiplexing alamat, atau data umum dan bus alamat. Lebih mudah untuk mengetahuinya jika Anda menggambarnya tanpa multiplexing dan tanpa pemisahan.


Terlepas dari detailnya, arsitektur TMU diizinkan untuk menerima 4 x 16-bit texels per siklus. Jika data input tiba pada frekuensi yang benar, maka TMU dapat melakukan pembagian fragmen-bijaksana oleh w, dan kemudian menghasilkan nilai-z fragmen (16-bit) dan warna fragmen (16-bit), yang dikirim ke FBI.

FBI interleaving dua arah


Solusi untuk masalah dua operasi akses RAM pada tahap FBI juga tidak dijelaskan dalam spesifikasi. Namun, dokumen tersebut menyebutkan laju pengisian 100 megapiksel / d dicapai dengan glClear karena kemampuan untuk merekam dua piksel per siklus, dan ini membuat kita memahami bahwa interlacing dua arah digunakan di sini.


FBI membaca dan menulis dua piksel sekaligus (2 x 1 piksel yang terdiri dari warna 16-bit dan 16-bit z = 64 bit). Untuk melakukan ini, alamat 21-bit menghasilkan dua alamat 20-bit, di mana bit paling signifikan dibuang untuk membaca / menulis dua piksel secara berurutan. Karena algoritma garis raster yang diperlukan untuk menulis / membaca dalam garis horizontal bergerak dari kiri ke kanan, membaca dua piksel ordinal sekaligus bekerja dengan sangat baik.

64-bit bus TMU-> FBI


Bagian terakhir dari teka-teki adalah bus FBI-TMU 64-bit. Hampir tidak ada yang ditulis tentang itu dalam spesifikasi, tetapi perilakunya dapat dipahami oleh data yang dikonsumsi FBI. Karena FBI memproses dua piksel sekaligus, masuk akal untuk berasumsi bahwa TMU tidak mengirim texels secepat mungkin, tetapi menggabungkan keduanya dua sebagai dua warna 16-bit + nilai z 16-bit.

Pemrograman Voodoo1


Pada level terendah, pemrograman Voodoo1 dilakukan menggunakan register yang dipetakan oleh memori. API terdiri dari sejumlah kecil perintah, hanya ada lima di antaranya: TRIANGLECMD (dengan titik tetap), FTRIANGLECMD (dengan titik mengambang), NOPCMD (no-op), FASTFILLCMD (kliring penyangga) dan SWAPBUFFERCMD terkait dengan memuat register data untuk pengaturan pencampuran, z-test, unduhan warna kabut dan banyak lagi. Pemuatan tekstur dalam VRAM dilakukan melalui RAM PCI tulis-saja 8 mebibytes dengan pemetaan memori.

(Nyata) Pemrograman Voodoo1


Pengembang memrogram Voodoo1 melalui Glide API [6] . Logika desain API terinspirasi oleh IRIS GL / OpenGL, menggunakan mesin negara dan awalan untuk semuanya (hanya "gr" yang digunakan sebagai ganti "gl", dan programmer yang diperlukan untuk mengontrol VRAM, seperti yang sekarang dilakukan di Vulkan.)

 #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 "Standar"


Meskipun MiniGL adalah bagian dari standar OpenGL 1.1, spesifikasi tidak pernah dirilis untuk itu. MiniGL adalah "hanya fitur-fitur yang digunakan Quake." Dengan menjalankan objdump untuk biner quake.exe, mudah untuk membuat daftar "resmi".

  $ 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 


Jika Anda mulai mempelajari OpenGL baru-baru ini, maka Anda harus tertarik dengan nama-nama fungsi seperti glColor3f, glTexCoord2f, glVertex3f, glTranslatef, glBegin dan glEnd. Mereka digunakan untuk mode yang disebut "mode Segera", di mana koordinat titik, koordinat tekstur, manipulasi matriks, dan warna ditunjukkan oleh satu panggilan fungsi pada suatu waktu.

Ini adalah bagaimana "pada masa itu" seseorang bertekstur dan diarsir oleh segitiga Gouraud ditarik.

 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


Tingkat pengisian maksimum teoretis 50 megapiksel / s seharusnya memberikan hampir 50 frame per detik dalam resolusi 640x480. Namun, karena Quake menggabungkan dua lapisan tekstur per permukaan (satu untuk warna, yang lain untuk lightmap), SST1 harus menggambar setiap frame dua kali dengan tambahan pencampuran di pass kedua. Akibatnya, Quake berlari pada 26 fps pada P166Mhz.

Dengan mengurangi resolusi menjadi 512x384 pada mesin yang sama, dimungkinkan untuk mencapai smooth 41 fps [7] , yang pada saat itu tidak dapat disediakan oleh pesaing mana pun.

gambar

Render perangkat lunak

gambar

GLOODAK VOODOO1



Fakta menarik: SST1 bukan untuk semua orang. Beberapa orang menyukai piksel dan menemukan bilinear menyaring "buram." Yang lain kesal dengan hilangnya koreksi gamma.

Glquake terlihat seperti sampah. Saya pikir seseorang dapat berdebat dengan ini, tapi mari kita akui - itu terlihat mengerikan, terutama pada kartu NVidia. Pada papan 3dfx, semuanya tidak terlalu buruk ... tetapi warnanya masih buram. Pada TNT2, gambarnya menjijikkan; dia terlalu gelap dan suram.

- Panduan @Frib, Glquake & QW Tidak Resmi [8]

3fdx Voodoo 2



Jika saya mengatakan bahwa aturan 3dfx di pasar dari tahun 1996 hingga 1998, ini akan menjadi pernyataan yang meremehkan. Setelah SST1, teknologi Voodoo 2 meningkatkan standar berkat RAM EDO 100 MHz, ASIC dengan frekuensi 90 MHz, dan bukan hanya satu, tetapi dua TMU, yang memungkinkan rendering frame Quake multi-tekstur (warna + pencahayaan) dalam satu pass [9] . Teknologi ini adalah monster nyata, dan bahkan kartu grafis itu sendiri tampak mewah.

Kecepatan mengisi di Voodoo 2 hampir dua kali lipat, mencapai 90 megapiksel / s. Benchmark gempa melonjak ke 80 fps yang menakjubkan pada Pentium II 266 MMX (dibandingkan dengan 56 fps dengan Voodoo1), pada kenyataannya, mencapai batas logika permainan dan kemampuan monitor.

gambar

Super Voodoo 2 12MB, gambar diambil dari vgamuseum.info.

Sayangnya, setelah rilis Voodoo3 pada tahun 1999, cerita 3dfx berubah tajam. Dia mulai berusaha mengembangkan kartu universal sendiri dan berhenti menjual teknologi OEM, dihadapkan pada meningkatnya persaingan.

Transisi ini tidak selesai seperti yang diharapkan, dan kinerja Voodoo3 mengecewakan dibandingkan dengan NVidia's GeForce 256, yang mampu memberikan tessellation dan pencahayaan perangkat keras (Pentium melakukan bagian ini dalam pipa).

Menanggapi NVidia, 3dfx membatalkan pengembangan Voodoo4 untuk mulai membangun Voodoo5 dengan teknologi VSA-100 (Voodoo Scalable Architecture). Hasilnya tidak terduga: setelah merilis "Napalm" (nama kode kartu), ia bertemu dengan kartu NVidia GeForce 2 dan ATI Radeon yang lebih kuat. Pada akhirnya, pada tanggal 28 Maret 2000 3dfx mengajukan kebangkrutan dan dibeli oleh NVidia.

Bagi mereka yang hidup di akhir tahun 90-an dan senang bermain Voodoo1 atau Voodoo2, 3dfx tetap menjadi perusahaan landmark yang melambangkan keunggulan. Dia menjadi ode untuk keberhasilan yang layak dicapai melalui keberanian, bakat luar biasa dan kerja keras. Terima kasih kawan!

Referensi


[1] Sumber: Kisah Rendition Vérité 1000

[2] Sumber: John Carmack .plan. 12 Februari 1998

[3] Sumber: SST-1, ENGINE GRAFIK KINERJA TINGGI UNTUK PERCEPATAN GAME 3D

[4] Sumber: Panel Sejarah Lisan 3dfx

[5] Sumber: Origin of Quake3's Fast InvSqrt ()

[6] Sumber: Panduan Pemrograman Glide

[7] Sumber: Perbandingan kecepatan bingkai di GLQuake Menggunakan Kartu 3D Voodoo & Voodoo 2

[8] Sumber: Frib, Glquake & Panduan QW Tidak Resmi

[9] Sumber: VOODOO2 GRAPHICS ENGINE GRAFIK KINERJA TINGGI UNTUK PERCEPATAN GAME 3D

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


All Articles