本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

X-Window なしで OpenGL ES2 を使う

今まで Linux で OpenGL を使うといえば、 X Window (X11, Xorg) が必須と考えていました。組み込みな何かならフレームバッファ直指定で OpenGL が使えると思いますが、デスクトップ環境においては使えないと思っていました。
 しかし、割と最近になって Linux 側のほうで KMS (KernelModeSetting), DRM が進化して、X Windowなしでも OpenGL(ES2) を初期化して使用することが可能になっていたようです。 kernel 3.x 以降で /dev/dri/card0 などが存在している環境で使えるようです。
もちろん従来の方法で、EGL+GLES2 を X11 上で使うことも可能です。(このEGL,GLES2 を X11 で動かした日記はこちらに)

必要なもの

Fedora や Ubuntu なら以下のパッケージらが必要です。

 * Fedora
 *  dnf install mesa-libgdm-devel libdrm-devel mesa-libGL-devel mesa-libEGL-devel mesa-libGLES-devel
 * Debian / Ubuntu
 *  apt-get install libgbm-dev libdrm-dev libegl1-mesa-dev libgles2-mesa-dev

X-Window が起動している必要はありませんでしたが、ライブラリは必要なようです。詳しく確認出来ていませんが、EGL,GLESv2 らが要求してしまうのかもしれません。

結果

X-Window なしで動いているのですが、スクリーンショットではわからないですね。VMware の中で動作させています。
kms-gles2-cube

実装方法など

X関連のコードは不要になのですが、代わりに色々と必要になるものがあります。ひとつは DRM (Direct Rendering Manager), もうひとつが GBM (Graphics Buffer Manager) です。これらの初期化が必要になります。

今回試しに Gist によるコード貼り付けで以下を説明していきます。

DRM 関連初期化

以下のようにして初期化します。
ドライバのモジュール名を元にして drm の初期化をおこないます。モニターとの接続状況を調査しつつ、現在使用可能なものを選択していきます。 libdrm を調査してみたところ、備えているコネクタ情報や、モニターとの接続状態を知ることができるようです。

GBM 関連初期化

続いて GBM の初期化です。 こちらでは画面に表示するバッファの待機系になるようです。 DirectX を知っている人向けにいえば、スワップバッファのチェインに相当する部分のようです。

GLES2の設定

通常の EGL 初期化して OpenGL ES の API をバインドする設定を行います。定番コードだと思いますので割愛します。

eglBindAPI( EGL_OPENGL_ES_API );

描画のためのスワップバッファ処理

描画したデータを画面に表示するためにはバッファフリップおよび登録作業が必要です。 GBM では flip ハンドラ、drm への フレームバッファ登録が必要な処理となります。
 eglSwapBuffers で GL関連のバッファが処理したあとで、GBM 側のバッファ処理を行うようにするようです。

アプリケーション部分(メインループ部分)

単に OpenGL ES 2.0 で描画処理をしているだけなので詳細は割愛します。
構造としては以下のようにしているだけです。

void mainLoop() {
  /* シェーダーの設定 */
  /* 描画コード */

  /* バッファのフリップ処理 */
  flip_graphics();
}

終了処理など

GLES2,EGL の終了処理後に、 GBM, DRM の終了処理を呼び出していきます。

まとめ

駆け足でしたが、X-Window(X11) なしの状態で OpenGL ES 2.0 を使うまでの説明をしました。Gistを初めて使ってみましたが、記事を書く側がちょっとつらいですね。見苦しい点多いかと思いますが、ご了承願います。

OpenGLプログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました