web-dev-qa-db-ja.com

LinuxでのX.orgなしのOpenGL

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

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

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

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

33
Cheery

アップデート(2017年9月17日):

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

要約すれば:

  • _libOpenGL.so_ではなく_libEGL.so_および_libGL.so_にリンクします。 (したがって、リンカーオプションは_-lOpenGL -lEGL_
  • EGLを初期化するには、eglGetDisplay、次にeglInitializeを呼び出します。
  • _EGL_SURFACE_TYPE_の後にconfig属性_EGL_PBUFFER_BIT_を付けてeglChooseConfigを呼び出します。
  • 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呼び出しではなく、eglGetDisplayeglInitialize、および最終的にはeglCreateContexteglMakeCurrentを呼び出します。

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

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


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

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

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

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

Nvidiaカードで動作するソリューションを入手したいのですが。

ありません。限目。

NVIDIAが提供するのはXドライバーのみであり、Nouveauプロジェクトはまだ未成熟であり、現在X11ドライバーのみに集中しているため、探している使用方法をサポートしていません。

31
greyfade

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

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

7
Havoc P

このページを見たことがありますか? 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

4
elmarco

Mesa を使用するだけです。

3
genpfault

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

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

同様の方法でこれらのコンポーネントを使用できなかった理由を確認できず、Androidグルーコードを再利用することもできません。

1
user377178

https://gitlab.freedesktop.org/mesa/kmscube/ は、X11またはウェイランドに依存しない、OGL(またはOGLES)ハードウェアアクセラレーションレンダリングのリファレンス実装として適しています。

0
cqcallaw