Voodoo であそぶ

Access counter:
不定期 Voodoo 日記?

Voodoo on Linux

3D 専用アクセラレータボード Diamond Monster 3D 等に用いられている 3Dfx の Voodoo チップは、3Dfx が出している Glide というライブラリを使えば、 Linux でも使うことができる (Voodoo Rush は未対応。Voodoo2 も正式には対応していないが動作させるためのパッチが存在するらしい)。 また、Mesa というフリーの OpenGL の実装が Glide に対応しており、 それを使うと OpenGL プログラミングが Linux でできる。

関連リンク集:


Sun May 24 13:28:54 JST 1998

今日の AKIBA Hotline! に、 ぷらっとホーム Canopus Pure3D のバルク品が 17,800 円という情報が 実によいタイミングで載っていました。 いてもたってもいられなくなった僕は、 ほげらら視聴後あきばにでかけていって大購入してしまいました。 それも 2 枚。

単に Voodoo が載ってるだけのカードなら そこいらで 15,000 円くらいで売ってたのですが、 全画面出力だとデバッグがやりにくいし Bt848 も持ってるしというわけで、 ビデオ出力機能のあるものを探していたのです。 そういうのもいままでないわけじゃなかったんだけど、 たいてい Voodoo Rush がのってるやつで Linux の Glide じゃ使えないことがわかっているので、買えませんでした。 今回は Canopus というまともなメーカの製品が手に入って大変うれしい。

2 枚買ってしまったのはいつもどおり単に血迷ってしまったというだけなのですが(ぉ、 買いにいく前に Glide の Programmers Manual というのをみてみたら 複数の Voodoo 構成をサポートしているように読めたので、 たぶんこれはいけるだろうという読みがあった上での血迷いでした(だからなんだ)。

Voodoo/Voodoo2 を 2 枚挿しといったら、 SLI にして画質を向上させるとかいうのがふつーの使い方なのでしょうが、 僕はそういうのには全然興味なくて、 あくまでも 2 つの Voodoo を個別に操作して別々の画像を描画し、 HMD による立体視等に応用することを目指します。

んでさっそく Glide のサンプルとかをいろいろ書きかえて試してみたら、 案の定ちゃんと 2 枚別々の絵が描けることを確認できました。 ビデオ信号もちゃんと同時に出力されており、 X window の xawtv で その画面を見ることができました。 これはなかなかいけそうです。 X でこういうのがするする動くというのは、なんか SGI マシンみたいでいいでしょう。

でも Mesa は Voodoo はひとつだけしか想定してないようで、 片方にしか絵がかけませんでした。 それにビデオ信号のほうはなぜかうまくうつらない。 というわけで Mesa を使おうと思ったらいろいろ書きなおす必要がありそうです。


Sun May 24 15:49:00 JST 1998

熱暴走(T_T)

Pure3D をさしてからマシンのふたを閉じ、 しばらくするとビデオカード(Millennium)がまともに動作しなくなる。 リブートしても同じ。というか、ビデオカードがないよという beep 音が鳴る。 おそるおそるふたを開けて Pure3D にさわってみると、 ビデオ出力部分が長くは触れないほど熱い。 ついでに Bt848 のチューナユニットも猛烈に熱かった。

こいつらの熱が Millennium を直撃してるようにみえたんで、 PCI カードどもの配置替えをした。 熱いカードどもは上にもっていき、 あいだに tulip をはさんで Millennium は下にしてみた。 電源をいれたらまともにうつる。 X を立ちあげていろいろ Voodoo なサンプルを Bt848 でみたりとかしているが、 とりあえず動いているようだ。 上 3 枚のカードはあいかわらず熱く、ふたはまだ閉めていない。

さっきの Mesa だとビデオ出力がうまくいかないことについてだけど、 README.3DFX というのを読んでみたら、 Mesa はデフォルトでは 640x480@75Hz で出力しようとしており、 それが原因だということがわかりました。

# export SST_SCREENREFRESH=60
としたらちゃんと映るようになった。


Tue May 26 12:43:46 JST 1998

Pure3D はやはり猛烈に熱い。 Voodoo チップと、端についてる 78M05 が特に熱い。 とにかく熱くて、数時間くらいたつと必ずおちる。 おちるときは Millennium が必ず最初におかしくなる。 これではやってられんので、 メインマシンからははずしてしまった。

んでとなりのマシンにさしてみたのだが、 これが全然動かない。 さしかたによっては BIOS 画面すらでてこなかったりとか、 うまく起動しても PCI BIOS が認識してなかったりとかする。 1 枚だけ認識したんで Glide のサンプルプログラムを動かしてみたら その直後に HDD の読み書きができなくなった。はっきりいってこわい。

このマシンは GA-586DX で dual Pentium、Trio64V+、AHA2940UW オンボードという構成なんだけど、 やはり Voodoo にも相性というものがあるんだろうか。 メインマシン(GA-686DX、dual Pentium Pro、Millennium)のほうでは 拍子抜けするくらいあっさり動いてしまったのだが、 熱の問題さえなんとかなればなあ…。

とりあえずフルタワーケース全体の空気の流れについて改善する必要がある。 あきばにいくと Voodoo 専用クーラーというのが売ってるらしいんで、 それでもつけてみるか。


Fri Jun 12 20:12:20 JST 1998

長らく更新をさぼっていたな。

Pure3D、結局 1 枚は壊れていたということが判明したので、 ぷらっとホームに交換していただきました。 で、そいつを今日受けとってきました。 代替品が入手できるまで時間がかかってしまった模様。 どういう拍子に壊れてしまったのかはいまだによくわからない。 やはり熱すぎだから?

少し前に、Pure3D を挿してるマザーボードを フルタワーから別のミニタワーのケースに移したのだけど、 放熱という面では大差ない模様。 カードが横向きで縦に重なるようになっているあたりが そもそもよろしくないと思う。 チップも下向きに実装されているし、チップにファンを装着しても どれだけの効果があるのか、いまいちよくわからん。


Sun Jun 14 11:24:12 JST 1998

AKIBA Hotline!を見たら、 PC Next という店で Pure3D が 13,800 えんでうってると書いてあった。 うげーやられた:->

ある程度予想できたことだし、まあいいか。


Tue Nov 10 03:00:06 JST 1998

超ひさびさの更新。またいぢる気になってきた(ぉ。 Pure3D たちの動作不良現象はいちおう鎮静化しているようである。 いろいろあったんだけど、まあ 5 かげつも昔の話でわすれちったよ。

GL/fxmesa.h というヘッダファイルにある関数どもをいじれば、 直接 glide を介して Voodoo に描画でけるらしいことがわかった。 しかしこれらの関数の説明書というのがどこにも見あたらないぞ。 困ったものだ。


Tue Nov 10 03:13:00 JST 1998

とりあえず ここにいって、新しい MesaLib-3.0.tar.gzMesaDemos-3.0.tar.gzやらをとってくる。 Debianized Package の Mesa はバージョンが 2.6 で古い上に、 3Dfx サポートなしなのでだめだめだ。自分でコンパイルするぞ。

Linux 用 Glide はここからとってくる。 すでに Voodoo Rush、Voodoo2 にも対応しているらしい。えらい。 .rpmしかないので、Debian にインストールするには alien とかいうのを使って.debに変換してからインストールする。 /dev/3Dfx とかいう便利そうなドライバもあったが、 これは 2.1.125 ではコンパイルできんかったのであきらめた。


Tue Nov 10 03:22:43 JST 1998

Mesa-3.0 を展開して、Make-config を見ると、 linux-386-glide-mits なんてーのがある。 なんだこれ?

そこでREADME.MITSを読んでみると、次のようなことが書いてある。

1. Requirements:
     Mesa 3.0.
     An SMP capable machine running Linux 2.x
     libpthread installed on your machine.


2. What does MITS stand for?
     MITS stands for Mesa Internal Threading System. By adding
     internal threading to Mesa it should be possible to improve
     performance of OpenGL applications on SMP machines.
おおおおお、むちゃくちゃ面白そうじゃないか!!! ちょうどこのマシンは dual P6-150 マシンだ、ということで さっそく make linux-386-glide-mits してしまう。 いけいけ。ごうごう。


Tue Nov 10 03:53:53 JST 1998

できた! CPU が 2 つあっても 無線 LAN で NFS なんかしてたもんだからやたら時間かかったぜー。

MIT の効果とやらを見てみようと、3Dfx のデモを走らせてみる。 fireteapotともども、 数 fps 速度が向上しているように見えた。うーむ、こんなもんか。 tunnel2 というデモは、実行すると

Tunnel2 V1.0
Written by David Bucciarelli (tech.hmw@plus.it)
You need TWO Voodoo Graphics boards in order to run this demo !
とかいって走らなかった。おおお、 でかした!! 望みどおり Pure3D を 2 枚差してやろう!!! うひひひひ。あとでな。


Tue Nov 10 04:08:59 JST 1998

よくみると、遅くなってるのと速くなってるのがある(^^; なんなんだこりゃ。 tunnel がなんか 60fps だったのが 30fps くらいになっていて 超がっかり。なぜー


Tue Nov 10 06:27:45 JST 1998

うひょ。できた。やった。ついに勝利。 Voodoo の画面に、直接 OpenGL の API で描画することに成功。 GLX や GLUT なんて使わない。これでまともなゲームが作れる。 libMesaGL.so.3libX11.soを リンクすることを要求してきたが、 まあその程度のわがままは許してやることにする。


Tue Nov 10 20:43:50 JST 1998

OpenGL の行列スタックとか座標変換とかについてようやく理解。 あのガイドブックに書いてある説明はちと意味不明であった。 これは原文からしてそうなのか、それとも訳が腐っているのか。 関心したのは、N64 のハードウェアとそっくりだなあと思ったこと。 ていうか N64 が OpenGL にあわせて作られたんだと思うが。

本からカットアンドペーストしてるだけの サンプルプログラムもかなり増えてきた。 とりあえず Sidewinder Force Feedback Pro で 目の前の立方体をぐるぐるまわすところまでは、できた。 次はディスプレイリストについて本を読んで理解することにしよう。


Wed Nov 11 18:03:28 JST 1998

いきなりだがテクスチャマッピングのプログラムをためす。 checker.c という市松模様を描くあれだ。 んでもって、Bt848 でとりこんだ画像をテクスチャマップすることに成功。 しかしキャプチャの結果が RGB の順でないので色が変になる。 なんとかして。


Thu Nov 12 07:32:55 JST 1998

OpenGL の WWW サイトをみる。 それによると、OpenGL 1.2では BGRA なフォーマットにも対応しているらしい。 Mesa 3.0 は OpenGL 1.2 に準拠しているそうであるので、 これを使えば解決だ。やった。


Thu Nov 12 08:39:11 JST 1998

GL_BGR を指示してみるが、 真っ白なテクスチャしか貼られない。なんだこりゃ。 しかたなく Mesa のソースコードを見てみると、 GL_BGR の画像が来た場合は 最初にRGBの順序をいれかえて GL_RGB に変換してるだけだったので あきれた。 こんなら自分でやったほーがいいぞ。ぐちぐち。 それはそれとして、正しく表示されないのはなぜだ。


Thu Nov 12 09:10:09 JST 1998

あうー。たまらん。

結論は、Mesa 3.0 のバグ。ということで。 OpenGL 本の checker.c で、 GL_RGBGL_BGR に変えただけで、 テクスチャがまっしろになってしまった。 まああのコード見りゃどこがおかしいかだいたい想像つくけどねえ。 ともかくバグはバグなので、作者にレポートを送るべきだろうか。

結局 GL_BGR を使うのはあきらめて、 自分で RGB 順序をいれかえることにする。 あのコードじゃ無理に使ったって意味ないもんな。


Thu Nov 12 09:32:29 JST 1998

あたしの顔がまわったまわった。うひょひょひょひょ。 しかしなにも考えずにキャプチャしながらまわすと遅くてしょうがないですな。 あう。 ダブルバッファでキャプチャしながら処理するようにしなくては。


Thu Nov 12 12:29:40 JST 1998

GL_SPHERE_MAPって球面にマッピングするもんだとばかり 思っていたが実はぜんぜん違った。環境マッピングに使うものらしい。 うまくやるためにはそれ専用のテクスチャを用意する必要があるということだ。


Thu Nov 12 15:28:41 JST 1998

fxMesaSwapBuffers()のコードを見てみるが、 案の定 Glide の grBufferSwap を呼んで、 あとはひたすらwhileループで待ってるだけだった。 最低…。

はて、VSYNC 待ちの API がこれしかないってのは困ったもんですねえ。 Bt848 の VSYNC 待ちと同時に走らせられないじゃん。

1999年02月12日 (金) 18時11分44秒 JST

修論もおわって久々の更新ですな。はう。

ほげめものほうに 顛末がみんな書いてあるけど、 IO DATA の GA-VDII12/PCI という腐った仕様の Voodoo2 カードの NTSC 出力を Linux でも有効にすることができるようになったぞ。 使いやすいように小物ユーティリティとしてまとめるとするかね。

これで Linux で使えて NTSC 出力可能な Voodoo2 カードの 入手難が解消できれば実によろこばしい。うひひひ。


takeshi@jsk.t.u-tokyo.ac.jp
Last modified: Fri Feb 12 18:15:16 1999