2010-07-24 12 views
24

Ich würde gerne einen OpenGL-Kontext ohne X in Linux öffnen. Gibt es überhaupt einen Weg dies zu tun?OpenGL ohne X.org in Linux

Ich weiß, dass es für integrierte Intel Grafikkartenhardware möglich ist, obwohl die meisten Leute nvidia Karten in ihrem System haben. Ich würde gerne eine Lösung bekommen, die mit Nvidia-Karten funktioniert.

Wenn es keinen anderen Weg als integrierte Intel-Hardware gibt, denke ich, es wäre in Ordnung zu wissen, wie es mit denen gemacht wird.

X11 Protokoll und Protokoll selbst ist zu groß und komplex. Maus/Tastatur/Tablet-Eingabe-Multiplexing ist für moderne Programme zu wenig geeignet. Ich denke, es ist der schlimmste Roadblock, der die Verbesserung von Linux Desktop verhindert, weshalb ich nach Alternativen suche.

+0

Warum Sie mit X11 zu tun brauchen? Die meisten Toolkits und Bibliotheken (wie zum Beispiel libSDL) kümmern sich um alle Low-Level-Goo für Sie. – nos

+1

@nos: libSDL nimmt die gleichen Einschränkungen an, die X11 auferlegt.Zum Beispiel: Das wacom Tablet wird auf die Bildschirmauflösung beschränkt, während das Tablet selbst eine zehnmal größere Auflösung als das Display hat! Große dpi-Mäuse haben ähnliche Probleme, die ich gehört habe. – Cheery

+0

@nos: Ich würde auch gerne eine Desktop-Umgebung machen. Nicht daran interessiert, Programme zu schreiben. Ich sehe X11 ist eine überschüssige Schnittstelle, die meine Ziele beim Schreiben einer Desktop-Umgebung nicht hilft. Es gibt mir eine große und überladene Schnittstelle im Austausch mit zu wenigen nützlichen Funktionen. – Cheery

Antwort

26

Update (17. September 2017):

NVIDIA vor kurzem einen Artikel detailing how to use OpenGL on headless systems veröffentlicht, die ein sehr ähnlicher beschreibt Anwendungsfall, wie die Frage.

Zusammengefasst:

  • Link zu libOpenGL.so und libEGL.so statt libGL.so. (Ihre Linker-Optionen sollten daher -lOpenGL -lEGL
  • Anruf eglGetDisplay, werden dann eglInitialize EGL zu initialisieren.
  • Anruf eglChooseConfig mit dem Config-Attribute EGL_SURFACE_TYPE mit EGL_PBUFFER_BIT gefolgt.
  • Anruf eglCreatePbufferSurface, dann eglBindApi(EGL_OPENGL_API);, dann eglCreateContext und eglMakeCurrent.

Von diesem Punkt an, machen Sie Ihre OpenGL-Rendering wie gewohnt, und Sie können Ihre Pixel-Puffer-Oberfläche, wo immer Sie möchten, blit This supplementary article from NVIDIA enthält ein grundlegendes Beispiel und ein Beispiel für mehrere GPUs. Die PBuffer-Oberfläche kann je nach den Anforderungen der Anwendung auch durch eine Fensteroberfläche oder eine Pixmap-Oberfläche ersetzt werden.

Ich bereute, dass nicht mehr Forschung zu diesem auf meinem vorherigen Schnitt, aber oh gut. Bessere Antworten sind bessere Antworten.


Seit meiner Antwort im Jahr 2010 gab es eine Reihe von größeren Umbrüchen in der Linux-Grafik-Bereich. Also, eine aktualisierte Antwort:

Heute sind Nouveau und die anderen DRI-Treiber zu dem Punkt gereift, wo OpenGL-Software stabil ist und im Allgemeinen recht gut funktioniert. Mit der Einführung der EGL-API in Mesa ist es jetzt möglich, OpenGL- und OpenGL-ES-Anwendungen sogar auf Linux-Desktops zu schreiben.

Sie können Ihre Anwendung in Ziel-EGL schreiben und sie kann ohne den Vorhandensein eines Fenstermanagers oder sogar eines Compositors ausgeführt werden.Um dies zu tun, würden Sie eglGetDisplay, eglInitialize und schließlich eglCreateContext und eglMakeCurrent statt der üblichen glx aufrufen, um das gleiche zu tun.

Ich kenne 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 EGL ohne eine funktionieren kann. Sie können GL ES 1.1, ES 2.0, ES 3.0 (wenn Sie über Mesa 9.1 oder höher verfügen) und OpenGL 3.1 (Mesa 9.0 oder höher) Kontexte erstellen. Mesa hat den OpenGL 3.2 Core (Stand September 2013) noch nicht implementiert.

Insbesondere auf dem Raspberry Pi und auf Android werden EGL und GL ES 2.0 (1.1 auf Android < 3.0) standardmäßig unterstützt. Auf dem Raspberry Pi glaube ich nicht, dass Wayland noch funktioniert (Stand September 2013), aber Sie erhalten EGL ohne einen Display-Server, der die enthaltenen Binärtreiber verwendet. Ihr EGL-Code sollte auch portabel (mit minimaler Änderung) auf iOS sein, wenn Sie das interessiert.


Unten ist der veraltete, zuvor akzeptiert Beitrag:

Ich mag würde einen OpenGL-Kontext unter Linux ohne X zu öffnen. Gibt es überhaupt einen Weg dies zu tun?

Ich glaube, Mesa bietet ein Framebuffer-Ziel. Wenn es überhaupt eine Hardwarebeschleunigung gibt, wird es nur mit Hardware sein, für die es Open-Source-Treiber gibt, die angepasst wurden, um eine solche Verwendung zu unterstützen.

Gallium3D ist auch unreif, und die Unterstützung dafür ist nicht einmal auf der Roadmap, soweit ich weiß.

Ich möchte eine Lösung, die mit Nvidia-Karten funktioniert.

Es gibt keins. Zeitraum.

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

+0

Ich denke nicht, dass dies eine gute Antwort ist, da sie nicht mehr zutrifft und keine Lösung bietet. Weston/Wayland arbeitet mit Nouveau, daher arbeitet opengl mit NVIDIA-Karten ohne X. Und auch Kommentare über Unreife strebender Projekte tendieren dazu, schnell zu altern. – elmarco

+0

@elmarco Ich werde meine Antwort revidieren, wenn ich später Zeit habe. Du hast recht; Meine Antwort ist ziemlich veraltet. Aber um fair zu sein, habe ich es Mitte 2010 gepostet, als Wayland noch ein Prototyp war. – greyfade

3

Verwenden Sie einfach Mesa genannt Wayland interessiert.

1

Sie können sehen, wie Android diese Probleme gelöst hat. Siehe Android-x86-Projekt.

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

Kann nicht sehen, warum Sie diese Komponenten nicht in ähnlicher Weise verwenden und sogar den Android-Klebecode wiederverwenden können.

Verwandte Themen