43 Stimmen

OpenGL ohne X.org unter Linux

Ich würde gerne einen OpenGL-Kontext ohne X in Linux öffnen. Gibt es irgendeine Möglichkeit, dies zu tun?

Ich weiß, dass es bei integrierter Intel-Grafikkarten-Hardware möglich ist, obwohl die meisten Leute Nvidia-Karten in ihrem System haben. Ich würde gerne eine Lösung finden, die mit Nvidia-Karten funktioniert.

Wenn es keinen anderen Weg als den über integrierte Intel-Hardware gibt, wäre es gut zu wissen, wie man das mit diesen Geräten macht.

Das X11-Protokoll selbst ist zu umfangreich und komplex. Das Maus/Tastatur/Tablet-Eingabe-Multiplexing, das es bietet, ist zu verwässert für moderne Programme. Ich denke, das ist das größte Hindernis, das eine Verbesserung des Linux-Desktops verhindert, weshalb ich nach Alternativen suche.

43voto

greyfade Punkte 24134

Update (17. Sep. 2017):

NVIDIA veröffentlichte kürzlich einen Artikel Detaillierte Beschreibung der Verwendung von OpenGL auf Headless-Systemen Das ist ein sehr ähnlicher Anwendungsfall wie in der Frage beschrieben.

Zusammengefasst:

  • Link zu libOpenGL.so y libEGL.so anstelle von libGL.so . (Ihre Linker-Optionen sollten daher sein -lOpenGL -lEGL
  • Rufen Sie an. eglGetDisplay entonces eglInitialize um EGL zu initialisieren.
  • Rufen Sie an. eglChooseConfig mit dem Attribut config EGL_SURFACE_TYPE gefolgt von EGL_PBUFFER_BIT .
  • Rufen Sie an. eglCreatePbufferSurface entonces eglBindApi(EGL_OPENGL_API); entonces eglCreateContext y eglMakeCurrent .

Von diesem Zeitpunkt an können Sie Ihr OpenGL-Rendering wie gewohnt durchführen und Ihre Pixelpufferoberfläche nach Belieben überblenden. Dieser ergänzende Artikel von NVIDIA enthält ein grundlegendes Beispiel und ein Beispiel für mehrere GPUs. Die PBuffer-Oberfläche kann auch durch eine Fensteroberfläche oder eine Pixmap-Oberfläche ersetzt werden, je nach den Bedürfnissen der Anwendung.

Ich bedaure, dass ich bei meiner letzten Bearbeitung nicht mehr darüber recherchiert habe, aber nun gut. Bessere Antworten sind bessere Antworten.


Seit meiner Antwort im Jahr 2010 gab es eine Reihe größerer Umwälzungen im Bereich der Linux-Grafik. Also, eine aktualisierte Antwort:

Heute sind Nouveau und die anderen DRI-Treiber so weit ausgereift, dass die OpenGL-Software stabil ist und im Allgemeinen recht gute Leistungen erbringt. Mit der Einführung der EGL-API in Mesa ist es nun möglich, OpenGL- und OpenGL ES-Anwendungen sogar auf Linux-Desktops zu schreiben.

Sie können Ihre Anwendung so schreiben, dass sie auf EGL abzielt, und sie kann ohne einen Fenstermanager oder sogar einen Compositor ausgeführt werden. Um dies zu tun, würden Sie eglGetDisplay , eglInitialize und schließlich eglCreateContext y eglMakeCurrent anstelle der üblichen glx-Aufrufe, um das Gleiche zu tun.

Ich weiß nicht, den spezifischen Code-Pfad für die Arbeit ohne einen Display-Server, aber EGL akzeptiert sowohl X11-Displays und Wayland-Displays, und ich weiß, dass es möglich ist, für EGL zu arbeiten, ohne eine. Sie können GL ES 1.1, ES 2.0, ES 3.0 (wenn Sie Mesa 9.1 oder später haben) und OpenGL 3.1 (Mesa 9.0 oder später) Kontexte erstellen. Mesa hat (Stand Sep. 2013) noch nicht OpenGL 3.2 Core implementiert.

Auf dem Raspberry Pi und auf Android werden standardmäßig EGL und GL ES 2.0 (1.1 auf Android < 3.0) unterstützt. Auf dem Raspberry Pi funktioniert Wayland noch nicht (Stand: September 2013), aber mit den mitgelieferten Binärtreibern erhalten Sie EGL ohne einen Display-Server. Ihre EGL-Code sollte auch portabel sein (mit minimalen Änderungen) zu iOS, wenn das Sie interessiert.


Nachstehend finden Sie den veralteten, zuvor akzeptierten Beitrag:

Ich würde gerne einen OpenGL-Kontext ohne X in Linux öffnen. Gibt es überhaupt eine Möglichkeit, dies zu tun?

Ich glaube, Mesa bietet ein Framebuffer-Ziel. Wenn es überhaupt Hardware-Beschleunigung bietet, dann nur mit Hardware, für die es Open-Source-Treiber gibt, die so angepasst wurden, dass sie eine solche Verwendung unterstützen.

Gallium3D ist auch unausgereift, und Unterstützung für diese ist nicht einmal auf der Roadmap, so weit ich weiß.

Ich würde gerne eine Lösung finden, die mit Nvidia-Karten funktioniert.

Es gibt keins. Punkt.

NVIDIA stellt nur einen X-Treiber zur Verfügung, und das Nouveau-Projekt ist noch nicht ausgereift und unterstützt nicht die Art der Nutzung, die Sie suchen, da sie sich derzeit nur auf den X11-Treiber konzentrieren.

8voto

Havoc P Punkte 8221

Ein Projekt namens Wayland könnte Sie interessieren

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

4voto

elmarco Punkte 29466

Haben Sie sich diese Seite angesehen? http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_

Sie ist wahrscheinlich ein wenig veraltet. Ich habe es noch nicht ausprobiert, aber ich würde mehr Dokumentation dieser Art begrüßen.

Wahrscheinlich ist es eine gute Idee, ab heute der Implementierung von Wayland compositor-drm.c zu folgen: http://cgit.freedesktop.org/wayland/weston/tree/src/compositor-drm.c

4voto

cqcallaw Punkte 1373

https://gitlab.freedesktop.org/mesa/kmscube/ ist eine gute Referenzimplementierung von OGL (oder OGLES) hardwarebeschleunigtem Rendering ohne eine X11- oder Wayland-Abhängigkeit.

1voto

user377178 Punkte 2293

Sie können sich ansehen, wie Android dieses Problem gelöst hat. Siehe Android-x86 Projekt.

Android verwendet Mesa mit Egl und Opengles. Android hat seine eigene einfache Gralloc-Komponente für die Moduseinstellung und Grafikzuweisungen. Darüber hinaus haben sie SurfaceFlinger Komponente, die eine Zusammensetzung Motor, der OpenGLES für die Beschleunigung verwendet ist.

Ich verstehe nicht, warum man diese Komponenten nicht in ähnlicher Weise verwenden und sogar den Android-Glue-Code wiederverwenden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X