How Xgl works の日本語訳用ページです。 GNOME 3歩目 を見て作ってみました。 みなさん協力お願いします。


Written by Emanuele Tamponi, and many thanks to Mark Czubin

libGL、GLX プロトコルを経由する、Xorg、Xgl、OpenGL クライアント間の通信

はじめに: 用語に関して

NVIDIA の X ドライバ とか NVIDIA の libglx とかいった用語について混乱があるんじゃないかと思う。そんなわけで、それら用語を説明する簡単な序文をここに記す。

  • X ドライバ というのは Xorg および Aiglx (GLX はちがう) において 2D オペレーションのレンダリング機能を提供するソフトウェアのこと。つまり、X ドライバはウィンドウのレンダリングや合成 (Compositing) などを提供する。X ドライバはグラフィックス・カードの 2D セクタだけを使用し、XAA や EXA バインディングを提供できる。
  • X サーバの GLX 拡張 というのは GLX コマンド受け付け機能を提供する、X サーバに対する拡張のこと。GLX というは OpenGL コンテクストを要求するアプリケーションにそれを提供するプロトコル。OpenGL アプリケーションからの OpenGL コマンドを受け付け、レンダリングのためにそれをグラフィックス・ハードウェアに送ったりする。Xorg は自前の GLX 拡張を、NVIDIA のはクローズド・ソースの物を提供する。その X サーバの拡張を含むライブラリの名前が libglx
  • libGL というのは OpenGL オペレーションや GLX リクエストのための機能を提供するライブラリのこと。つまり libGL は、OpenGL コンテクストのために X の GLX 拡張を要求する OpenGL クライアントによって使用される、OpenGL 機能を使用するためのもの。Mesa は DRI において使用される "オープンな" libGL を、NVIDIA (ATI も同様) はクローズド・ソースの物を提供する。
  • ダイレクト OpenGL コンテクスト というのは OpenGL が ダイレクト・レンダリング されるコンテクストのこと。ダイレクト・レンダリングというのは、OpenGL コマンドを GLX 拡張に渡すことなく、グラフィックス・カードをコントロールする 3D ドライバにダイレクトに送信できるということを意味する。
  • 非ダイレクト OpenGL コンテクスト というのは OpenGL が 非ダイレクト・レンダリング されるコンテクストのこと。非ダイレクト・レンダリングというのは、libGL が OpenGL コマンドを GLX 拡張に渡さなければならないということを意味する。GLX 拡張がそれをグラフィックス・カードに渡し、レンダリングする。
  • アクセラレイテッド・レンダリング というのは、OpenGL コンテクスト内部のオペレーションが、CPU でなくグラフィックス・プロセッサ (GPU) によって elaborate されるということを意味する。アクセラレイテッド・レンダリングは非常に高速だが、ハードウェアのサポートがなければ機能しない。ハードウェアによってサポートされない機能については、libGL はソフトウェア実装にフォールバックする ( ソフトウェア・フォールバック )。DRI においては、ソフトウェア・フォールバックは Mesa によって提供される。
  • DRI というのは ダイレクト・レンダリング・インフラストラクチャ (Direct Rendering Infrastructure) の略で、OpenGL コンテクストのためにダイレクトレンダリングを提供するソフトウェアのセットのこと。libGL (Mesa 提供。ソフトウェア・フォールバックの場合と同様) や libglx (Mesa 提供)、グラフィックス・カードの専用ドライバ、DRM ダイレクト・レンダリング・マネージャ (Direct Rendering Manager) を提供する。DRM は ハードウェアへのリクエストを処理し、自身ハードウェアをコントロールするカーネル・モジュール。NVIDIA のドライバは DRI }ではなく、ダイレクト・レンダリングを処理する自前のインフラストラクチャを使用する。
  • Xgl というのは OpenGL 上に作られた新しい X サーバ・アーキテクチャのこと。すべてのレンダリングにおいて X ドライバを不要とし、ただ OpenGL ドライバを必要とする。Xgl の現在の実装は Xglx 。Xgl の可能性を測るための "hack" だ。このページは Xglx の動作を説明しようとしている。Xgl の将来の実装は Xegl となるだろう。
  • Aiglx というのは 非ダイレクト OpenGL コンテクストに対するアクセラレイテッド・レンダリング (Accelerated Rendering to Indirect OpenGL Contexts) を提供するプロジェクトのこと ( 現在は Xorg の CVS HEAD に完全に統合された )。Aiglx 以前は NVIDIA による libglx 実装のみがアクセラレイテッド・非ダイレクト GLX を提供していた。

話をはじめるまえにひとつだけ;)

ここで説明しているのは、NVIDIA製ドライバを使ってXglがどのように動作しているか、だ。これはDRIドライバを使って動作するのと似た段取りではある:DRIではMesa libGLとlibglxがNVIDIA製ドライバの代わりに読み込まれる。DRI使ったほうがおトクなことがある…後段で説明してる。

First step: XglxとXorgの起動

(Xglxについて説明していることに注意)

  • Xglが起動する。
  • "Xglの初期化関数"がXorgを立ち上げる。
  • XorgはNVIDIAのXドライバをロードする。(おそらく使われない)
  • XorgはNVIDIAのlibglxをGLX向けのXサーバー拡張(X Server Extension for GLX)としてロードする。(これを私は基本的なGLX拡張と呼んでいる)
  • XorgはOpenGLクライアントに直接OpenGLコンテキストを提供可能となる。

Second step: 要求とコンテキスト

  • XglはNVIDIAのlibGLにリンクされ、これは描画に使われる。
  • そして、XglはOpenGLクライアントとしてOpenGLコンテキストを要求する。
Xgl 「やーNVIDIAのlibGL、俺の描画のためにOpenGLコンテキストがほしいんだけど。」
NVIDIAのlibGL 「ほい、サーバーに聞いてみるわ。」
  • NVIDIAのlibGLは基本的なGLX拡張と会話を始めるために、自身のGLX関数を使う。
NVIDIAのlibGL 「おい、基本的GLX拡張!俺のクライアント(Xgl)向けのOpenGLコンテキストをよこせ。」
基本的GLX拡張 「ワカリマシタ。DirectOpenGLコンテキストをあげます。もう私のサーバーに聞かなくてGPUが使えますよ。」
  • NVIDIAのlibGLはXgl向けのDirectOpenGLコンテキストを得た
NVIDIAのlibGL 「おーいXgl、あんたのOpenGL Contextゲットしたよん。」
Xgl 「どもども、これで俺の描画ができるぜ。」

Third step: Xglの準備完了と用意された新規Xserverの起動

  • Xgl は OpenGL 関数を使って ウインドウとルート(訳者注 X window system の root windowのことか?)を描写できるようになる。
  • Xgl は GLX 用X サーバ拡張 として xgl自身が持っている libglx をロードする。 (これからこれを「Xgl GLX Extension」と呼ぶ。).
  • Xgl は 非ダイレクト OpenGL コンテキスト を OpenGL クライアントに渡すことだけできる、なぜなら Xgl GLX Extension は Xgl に OpenGL コマンドを渡すからである。

Fourth step: OpenGLクライアントが開始される

Mesa libGLがXglセッション内部のOpenGLクライアントにリンクされるとき何が起こるか

"特別な"OpenGLクライアントが開始される

  • xgl を持った OpenGL client が開始。 (たとえば: Compiz).
  • OpenGL client は Mesa libGL にリンクする.
  • さて、 OpenGL client は OpenGL Contextが必要になりました.
Compiz :	「おーい、Mesa's libGL、 描写する OpenGL コンテキスト は無いかい?」
Mesa libGL: 	「ういっす、ちょっとサーバに聞いてくらぁ。」
  • Mesa libGL は GLX 関数 を使って Xgl GLX Extension に聞いてみた.
Mesa libGL: 	「ちわっす Xgl GLX Extension。うちの客(この場合は Compiz) がさ OpenGL コンテキストが欲しいってさ、無いかい?」
Xgl GLX Extension: 	「ほらよ、非ダイレクト OpenGL コンテキスト だ、受け取れ。 今からは GLX プロトコルを通して OpenGLの関数が使えるぞ。
  		(訳者注、いまいち意味がわかりません。help me 原文 Now you can use OpenGL functions through the GLX Protocol)」
  • Mesa libGL は客に 非ダイレクト OpenGL コンテキスト を持ってきた.
Mesa libGL: 	「おい Compiz, OpenGL コンテキストを持ってきてやったぞ。」
Compiz: 	「ありがと、これで書かけるよ。」
  • ここからCompiz は OpenGL 関数を使って コンテキストを描写したら、xgl が GLX プロトコルを使ってOpenGL 関数を受け取るはずです。
  • Compiz が使った OpenGL 関数を Xgl が受け取ったら、 xgl は NVIDIA's libGL をこのコンテキストを描写するのに使うわけです。

Appendix: 何故CompizはMesa libGLが必要なの?

CompizがMesa libGLを必要とするのはなぜか。それは、Mesaによって提供される GLXクライアント実装が、Compizが必要とするGLX_EXT_texture_from_pixmap拡張をすでに備えているからであり、またその実装が、Compizによって要求される関数をどのようにXglに受け渡すかを理解している、唯一の実装だからである。 Mesaがそれらの関数をXglに受け渡す場合は、Xgl GLX拡張は、一般的なOpenGLを使用する関数を実装している状態にあるので、レンダリングに際してはNVIDIAのlibGLを使うことができる。以上のようにして、Compizはアクセラレートされる。

注意! この効果はDRIドライバを使っているときに得られる

もしNVIDIAから提供されているものの代わりにDRIドライバを使っているのなら、Mesa libGLを使っているいろいろなアプリケーションを手動でリンクする必要はない。それは、DRIはMesa libGLをOpenGL/GLXライブラリとして使うからだ。

簡単な図式 (描いてくれたMark Czubinさんども~)

これらはX,AIGLX,Xglx,Xeglの簡単な図式である。 いくつか覚えておくことがある。 X11アプリケーションはlibX11を使ってサーバーと会話し、OpenGLアプリケーションは3DドライバのためにlibGLを使いGLX拡張と会話する。Xglx GLX ExtensionとAIGLXはlibGLを使って3Dドライバと会話するので、それらは"Direct Rendering OpenGL クライアント"である。 Direct Rendering ManagerであるDRMは全ての描画を調節するためのカーネルモジュールであり、DMAを設定する等の働きがある。それはグラフィックスカードの3D部分を管理する。 これらの図式はNVIDIAのドライバには完全には適合しない。NVIDIAはクローズドな実装をGLX拡張,libGL,直接と間接レンダリング,Xorgドライバ,DRMでしているためである。一般的には、ここに示したものと同じ動作であるが、少しの違いはあるだろう。

Xeglの構図

これはXeglについての私の持論だ。 CairoのアプリケーションはlibCairoを使ってCairoと会話し、そしてCairoは直接Glizと会話する。同じようにXeglもGlitzと会話する。

GlitzはlibGLと(OpenGLクライアントとして)リンクされ、libEGLに提供されたウインドウ機能が準備される。libEGLはlibEGLdriに提供された関数セットを使い、フレームバッファと3Dドライバの呼び出しを行うことで描画がアクセラレートされる。

用語について

XAA/EXA => 現在のXAA/EXA関数を使ったXorgのドライバ 3D driver => Mesa/DRIより提供された3Dが可能なカード向けのドライバ libEGLdri => DRI向けのEGLドライバ (フレームバッファと3Dドライバと通信するためのlibEGLレイヤを提供する) 2D CARD => これはXによってなんとかしてフレームバッファを提供するもので、根本的なカーネルではない framebuffer => カーネルより提供されたフレームバッファ

最終更新:2006年07月30日 13:03