Vielleicht interessieren Sie sich für ein Projekt namens Wayland
http://en.wikipedia.org/wiki/Wayland_%28display_server%29
Aktualisierung (17. September 2017):
NVIDIA hat kürzlich einen Artikel veröffentlicht, in dem ausführlich beschrieben wird, wie OpenGL auf Headless-Systemen verwendet wird, was ein sehr ähnlicher Anwendungsfall ist, wie in der Frage beschrieben.
Zusammengefasst:
- Link zu
libOpenGL.so
undlibEGL.so
stattlibGL.so
. (Ihre Linker-Optionen sollten daher-lOpenGL -lEGL
sein - Rufen Sie
eglGetDisplay
an , danneglInitialize
um EGL zu initialisieren. - Ruf
eglChooseConfig
an mit dem KonfigurationsattributEGL_SURFACE_TYPE
gefolgt vonEGL_PBUFFER_BIT
. - Rufen Sie
eglCreatePbufferSurface
an , danneglBindApi(EGL_OPENGL_API);
, danneglCreateContext
undeglMakeCurrent
.
Führen Sie von diesem Zeitpunkt an Ihr OpenGL-Rendering wie gewohnt durch, und Sie können Ihre Pixelpufferoberfläche an beliebiger Stelle blitten. Dieser ergänzende Artikel von NVIDIA enthält ein grundlegendes Beispiel und ein Beispiel für mehrere GPUs. Die PBuffer-Oberfläche kann je nach Anwendungsanforderungen auch durch eine Fensteroberfläche oder eine Pixmap-Oberfläche ersetzt werden.
Ich bedauere, dass ich bei meiner vorherigen Bearbeitung nicht mehr darüber recherchiert habe, aber na ja. Bessere Antworten sind bessere Antworten.
Seit meiner Antwort im Jahr 2010 hat es im Bereich der Linux-Grafik einige große Veränderungen gegeben. Also, eine aktualisierte Antwort:
Heute sind nouveau und die anderen DRI-Treiber so weit ausgereift, dass 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 für Ziel-EGL schreiben und sie kann ohne das Vorhandensein eines Fenstermanagers oder sogar eines Compositors ausgeführt werden. Dazu rufen Sie eglGetDisplay
auf , eglInitialize
und schließlich eglCreateContext
und eglMakeCurrent
, anstelle der üblichen glx-Aufrufe, um dasselbe zu tun.
Ich kenne den spezifischen Codepfad für das Arbeiten ohne einen Anzeigeserver nicht, aber EGL akzeptiert sowohl X11-Anzeigen als auch Wayland-Anzeigen, und ich weiß, dass EGL ohne Anzeigeserver arbeiten 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-Kontexte (Mesa 9.0 oder höher) erstellen. Mesa hat OpenGL 3.2 Core noch nicht implementiert (Stand September 2013).
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 funktioniert Wayland meiner Meinung nach noch nicht (Stand Sep. 2013), aber Sie erhalten EGL ohne Anzeigeserver mit den mitgelieferten Binärtreibern. Ihr EGL-Code sollte auch (mit minimalen Änderungen) auf iOS portierbar sein, falls Sie das interessiert.
Unten ist der veraltete, zuvor akzeptierte Beitrag:
Ich möchte einen OpenGL-Kontext ohne X in Linux öffnen. Gibt es dafür überhaupt eine Möglichkeit?
Ich glaube, Mesa bietet ein Framebuffer-Ziel. Wenn es überhaupt eine Hardwarebeschleunigung gibt, dann nur mit Hardware, für die es Open-Source-Treiber gibt, die angepasst wurden, um eine solche Verwendung zu unterstützen.
Gallium3D ist auch unausgereift, und soweit ich weiß, steht die Unterstützung dafür nicht einmal auf der Roadmap.
Ich hätte gerne eine Lösung, die mit NVIDIA-Karten funktioniert.
Es gibt keinen. Punkt.
NVIDIA stellt nur einen X-Treiber bereit, und das Nouveau-Projekt ist noch unausgereift und unterstützt die Art der Verwendung, nach der Sie suchen, nicht, da sie sich derzeit nur auf den X11-Treiber konzentrieren.