フリーのNvidiaドライバをハッキングするNouveauプロジェクト

 今のところ、Nvidia製グラフィックカードを所有するGNU/Linuxユーザには2つの選択肢がある。同社のプロプライエタリなドライバを使用してフリーソフトウェアの原則を破るか、フリーのnvドライバを使用して3Dアクセラレーションをあきらめるかだ。Nouveauプロジェクトは、完全に機能するフリーのNvidiaドライバを独自に作成することで、このジレンマを打開しようとしている。Nouveauプロジェクトの経緯と現在の開発状況について、同プロジェクトで現在活動している2人の開発者Stephane Marchesin氏とBen Skeggs氏に話を伺った。

 ビデオドライバに取り組むほかの何名かと同様、Marchesin氏とSkeggs氏もR300プロジェクトのビデオドライバの分野で活動を始めた。すでに中断されたこのプロジェクトでは、メンバーたちがATI Radeonカードシリーズの3Dアクセラレーション機能の解析を試みていた。Skeggs氏が主に取り組んでいたのはピクセル単位でエフェクトの計算とレンダリングを行うグラフィック機能、フラグメントシェーダだったが、彼はその頃のことを「グラフィックドライバ全体のさまざまな部分がどのようにつながっているのか、まったくわからない状態だった」と話している。一方、Marchesin氏が深く関わっていたのは、レンダリング速度とタイリングという標準的なレンダリング方法を改善するグラフィック処理の技法Hyperzのリバースエンジニアリングや、Itaniumプラットフォームへの3D機能の移植だった。「変更を加えるにつれてQuake 3のフレームレートが上がっていくのを見るのがとても面白かった」とMarchesin氏は当時を振り返る。

 2005年6月、Marchesin氏は個人プロジェクトとしてNouveauに着手した。ほぼ8か月かけて、Marchesin氏はnvドライバの機能を整理するとともに、プロプライエタリなNvidiaドライバをマシン上で実行しながら情報を収集するためのリバースエンジニアリングツールREnouveauを書き上げた。「Nvidiaカードの内部動作を理解するのに多くの時間を費やした。グラフィックハードウェア分野のほかのどのドライバとも大幅に異なる動作だった。こうした活動を手がける気になった主な理由は、低レベルプログラミングへの個人的な関心と、当時使っていた作業用マシンのNvidia製バイナリドライバが修正できなかったことにあった(ドライバと私のマシンのチップセットとの相性が悪かったのか、ドライバにバグがあったかのどちらかだ。いずれにしても、Nvidia製ドライバはバイナリ形式なので手の打ちようがなかった)」(Marchesin氏)

 2006年2月、Marchesin氏はFOSDEM(Free and Open Source Software Developer’s European Meeting)においてプロジェクトの成果を披露した。その場で数時間にわたってREnouveauを使いながらNvidiaチップのあるシリーズのレンダリングについて学んだSkeggs氏は、たちまち魅了された。やがて彼は#nouveauというIRCチャンネルに参加する。「自分が学んだことをすっかり伝えることがねらいだった。そうこうするうちに、結局そこから抜け出せなくなってしまった」(Skeggs氏)

 Nouveauの2D機能は、nvドライバのコードをフォークさせたものだ。ただし、Skeggs氏は次のように語っている。「コードはかなり変更されている。複数のクライアントがNvidiaカードに同時にアクセスできるように、相当な量のコードをカーネルモジュールに移し、エンジン設定のかなりの部分を書き直さなければならなかったからだ」

 現時点では2D機能に関する作業の多くが完了している。「日常的な使用においては、機能の点でもパフォーマンスの点でも、すぐにnouveauでnvを置き換えることが可能だ」とMarchesin氏は述べる。実際、nouveauドライバは、すでにFedora 7などいくつかのディストリビューションに収録されている。ただし、機能面での制限があるため、デフォルトでは使用されていない。

 今のところ、3D機能の開発はあまり進んでいない。「基本的な3D機能がいくつかのNV4xチップで動作する程度だ。その他のチップセットを期待どおりのレベルに仕上げること以外に、テクスチャリング機能をこの3Dドライバに実装する必要もある。ご想像のとおり、テクスチャリング機能のない3Dドライバなんて、ほとんど意味がない」。ただし、3D機能を実装する基本的な知識はプロジェクト内にあるので、あとはただコードを書いてテストするだけだ、とも彼は話している。

作業の進捗

 その他の実装予定機能については、作業が進んでいる。そうした作業のほとんどでリバースエンジニアリングが必要になることから、REnouveauや2D機能用のValgrindプラグインのようなツールが使われることが多い。

 Nouveauプロジェクトでは、もともとATI Radeonカードのリバースエンジニアリング用に作られたツールMmioTraceも使用されている。これはカーネル内部のメモリマップドI/Oのアクセスのトレースを行うものだ。「確かにNvidiaは重い作業の大半をカーネルモジュール内で行っているのだが、当初NouveauにはNvidia.ko内部で何が起こっているのかの確認に使えるツールがなかった。MmioTraceのようなツールがなければ、今の状態にはたどり着けていなかっただろう」(Skeggs氏)

 またNouveauでは、Utah-GLXやNVClockなど、Nvidiaカードで動作するほかのソフトウェアに関する情報を蓄積している。さらに、BeOSベースのオペレーティングシステムHaiku用のNvidiaカードドライバを開発しているプログラマたちとの情報共有も行っている。しかし、Marchesin氏は「既存の3D対応ドライバは旧式のカードでしか動作しない。新型のカードについては、参照できる情報がまったくない」と話す。

 プロジェクトのほかの部分では、フリーのグラフィックドライバで培われたチームの過去の経験がきわめて貴重な役割を果たしている。「大局的な設計にかかわる多くの選択が、Nvidiaのハードウェア設計とフリーのグラフィックドライバにおける我々のこれまでの経験の双方に導かれる形で行われてきた」とMarchesin氏は語る。「私の知る限り、我々のドライバは基本的な2D機能にもカーネルモジュールを使用する最初のフリーソフトウェアドライバだった。このため、コードのより多くの部分をカーネルに移すことができ、さらに複数のアプリケーションでのカードの共有がこれまでよりも効率的に行える」

 Nouveauプロジェクトには、フリーソフトウェア財団(Free Software Foundation)からのアプローチがあった。それは同財団の優先プロジェクトのリストに加えるかどうかをメンバーに問い合わせるもので、Gnash、フリーのFlashプレーヤ、LinuxBIOSのようなプロジェクトはこのリストに名前が追加されたことで注目度が高まっていた。だが、Skeggs氏はこの件について次のように語る。「過剰な注目が集まるのを避けたいことを主な理由として、我々はこの申し出を断った。Nouveauはまさしく開発者のためのプロジェクトであり、ユーザから非常に有用だと認められるようなプロジェクトではないからだ」。そういえば、Marchesin氏は「このことは、すぐにSlashdotのネタになってしまった…」とも言っていた。

 Nouveauが情報提供を一切受けていない情報源の1つが当のNvidiaである。プロジェクトの初期に、Skeggs氏はマルチディスプレイ・サポートを有効にするためにNvidiaにドキュメントの提供を求めた。「だが、現時点で提供できるドキュメントは皆無だとの回答が返ってきただけだった。そんな回答をよこすくらいなら、完全に依頼を無視してくれたほうがまだマシだったね」(Skeggs氏)

 今後もNvidiaからの支援はまったく得られないだろう。チェコのWebサイトABCLinuxUによるインタビュー記事には、NvidiaのUNIXソフトウェア担当ディレクタAndy Ritger氏の「Nouveauには協力も妨害もしない、というのがNvidiaのスタンスだ」という言葉が記されている。NvidiaのGNU/Linuxサポートは、引き続きnvドライバと既存のプロプライエタリなドライバに限られるだろう、ともRitger氏は述べている。

 しかし、こうしたNvidiaからの支援の欠如はMarchesin氏の障害にはなっていない。「ベンダの協力がなくてもドライバが書けることを我々は示さなければならない。このプロジェクトを通じて、私はそれを試みているところだ」

プロジェクトの支援と今後の動向

 Nouveauは依然として開発者のためのプロジェクトだが、Skeggs氏は、一般のユーザでも自分のマシンでREnouveauとMmioTraceを実行して出力結果を送ることでプロジェクトへの協力が可能だと話す。すでにNouveauはさまざまなカードからかなりの情報を取得しているが、「同じシリーズのカードのチップセットどうしでも若干の違いが見られることがある」とSkeggs氏は述べている。

これについてMarchesin氏は次のように補足する。「我々は常に新しい開発者を求めている。かなりのプログラミングスキルを持っていて、グラフィックドライバ向けプログラミングの習得に関心があるなら、我々のIRCチャンネルが役に立つだろうし、そこに参加しているだけで必要な情報のほとんどが得られるはずだ」

 Nouveauの最終的な目標は「きちんと機能するオープンソースのNV04以降のNvidiaチップ用2D/3Dドライバを提供すること」だとSkeggs氏は説明する。

 では、その目標が達成されたらどうするのだろうか。「そうだね、いつになっても改善すべき点や修正すべきバグはあるものだ。それを別にしても、きっとNvidiaは我々が取り組むべき新しいチップを出してくるだろう」(Skeggs氏)

 「我々のドライバとバイナリ版ドライバとのベンチマーク比較が行われることも期待している。そうなれば、ドライバのパフォーマンス面にもっと注力しなければならなくなるだろう」(Marchesin氏)。その一方では、大勢の潜在的ユーザがNouveauドライバの完成を待ち望んでいる。

Bruce Byfieldは、Linux.comとIT Manager’s Journalに定期的に寄稿しているコンピュータジャーナリスト。

Linux.com 原文