41

Linux で X なしで OpenGL コンテキストを開きたいです。それを行う方法はまったくありますか?

ほとんどの人はシステムにNvidiaカードを持っていますが、統合されたIntelグラフィックスカードハードウェアで可能であることは知っています. Nvidia カードで動作するソリューションが欲しいです。

統合された Intel ハードウェアを使用する以外に方法がない場合は、それがどのように行われるかを知っていればよいと思います。

X11 プロトコル自体が大きすぎて複雑です。それが提供するマウス/キーボード/タブレット入力の多重化は、現代のプログラムにはあまりにも骨抜きにされています。Linux デスクトップの改善を妨げている最悪の障害だと思います。そのため、代替手段を探しています。

4

5 に答える 5

40

更新 (2017 年 9 月 17 日):

NVIDIA は最近、ヘッドレス システムで OpenGL を使用する方法を詳述した記事を公開しました。これは、質問で説明されている使用例と非常によく似ています。

要約すれば:

  • の代わりにlibOpenGL.soandにリンクします。(したがって、リンカー オプションはlibEGL.solibGL.so-lOpenGL -lEGL
  • を呼び出してeglGetDisplayから、eglInitializeEGL を初期化します。
  • eglChooseConfigconfig 属性のEGL_SURFACE_TYPE後に を付けて呼び出しますEGL_PBUFFER_BIT
  • eglCreatePbufferSurface、次にeglBindApi(EGL_OPENGL_API);、そしてeglCreateContextを呼び出しeglMakeCurrentます。

その時点から、通常どおり OpenGL レンダリングを実行すると、ピクセル バッファ サーフェスを好きな場所にブリットできます。この NVIDIA の補足記事には、基本的な例と複数の GPU の例が含まれています。アプリケーションのニーズに応じて、PBuffer サーフェスをウィンドウ サーフェスまたはピックスマップ サーフェスに置き換えることもできます。

以前の編集でこれについてこれ以上調査しなかったことを後悔していますが、まあまあです。より良い答えはより良い答えです。


2010 年の私の回答以来、Linux のグラフィックス スペースには多くの大きな変化がありました。したがって、更新された回答:

現在、nouveau およびその他の DRI ドライバーは、OpenGL ソフトウェアが安定し、一般的に十分に機能するところまで成熟しています。Mesa に EGL API が導入されたことで、Linux デスクトップでも OpenGL および OpenGL ES アプリケーションを作成できるようになりました。

EGL をターゲットとするアプリケーションを作成でき、ウィンドウ マネージャーやコンポジターさえも存在しなくても実行できます。これを行うには、同じことを行う通常の glx 呼び出しの代わりに、、、eglGetDisplayおよびeglInitialize最終的にeglCreateContextandを呼び出します。eglMakeCurrent

ディスプレイ サーバーなしで動作するための具体的なコード パスはわかりませんが、EGL は X11 ディスプレイと Wayland ディスプレイの両方を受け入れます。EGL がディスプレイ サーバーなしで動作できることはわかっています。GL ES 1.1、ES 2.0、ES 3.0 (Mesa 9.1 以降を使用している場合)、および OpenGL 3.1 (Mesa 9.0 以降) コンテキストを作成できます。Mesa は (2013 年 9 月現在) まだ OpenGL 3.2 Core を実装していません。

特に、Raspberry Pi と Android では、EGL と GL ES 2.0 (Android < 3.0 では 1.1) がデフォルトでサポートされています。Raspberry Pi では、Wayland はまだ動作しないと思います (2013 年 9 月現在) が、付属のバイナリ ドライバーを使用すると、ディスプレイ サーバーなしで EGL を取得できます。興味があれば、EGL コードは (最小限の変更で) iOS にも移植可能である必要があります。


以下は、以前に受け入れられた古い投稿です。

Linux で X なしで OpenGL コンテキストを開きたいです。それを行う方法はまったくありますか?

Mesa がフレームバッファ ターゲットを提供していると思います。なんらかのハードウェア アクセラレーションを提供する場合、そのような使用をサポートするように適合されたオープン ソース ドライバーが存在するハードウェアでのみ提供されます。

Gallium3D も未熟で、私の知る限り、これに対するサポートはロードマップにもありません。

nvidia カードで動作するソリューションを入手したいと思います。

1つもありません。限目。

NVIDIA は X ドライバーのみを提供しており、Nouveau プロジェクトはまだ未熟であり、現在 X11 ドライバーのみに焦点を当てているため、探している種類の使用をサポートしていません。

于 2010-07-26T01:40:40.373 に答える
8

Waylandというプロジェクトに興味があるかもしれません

http://en.wikipedia.org/wiki/Wayland_%28display_server%29

于 2010-07-25T00:39:22.093 に答える
4

このページはご覧になりましたか? http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_

少し古くなっている可能性があります。まだ試していませんが、このタイプのドキュメントをもっといただければ幸いです。

おそらく、今日の時点で、Wayland compositor-drm.c の実装に従うことをお勧めします: http://cgit.freedesktop.org/wayland/weston/tree/src/compositor-drm.c

于 2013-09-25T20:29:19.403 に答える
1

Androidがこの問題をどのように解決したかを見ることができます。Android-x86プロジェクトを参照してください。

Androidは、eglとopenglesでmesaを使用します。Androidには、モード設定とグラフィック割り当てのための独自のシンプルなGrallocコンポーネントがあります。その上、加速にOpenGLESを使用するコンポジションエンジンであるSurfaceFlingerコンポーネントがあります。

これらのコンポーネントを同様の方法で使用できず、Androidのグルーコードを再利用できない理由がわかりません。

于 2012-04-26T09:53:49.710 に答える