OpenGL sin X.org en Linux
x11 nvidia (5)
¿Has mirado esta página? http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_
Es probable que esté un poco desactualizado. No lo he intentado todavía, pero agradecería más documentación de este tipo.
Probablemente una buena idea, a partir de hoy, es seguir la implementación de Wayland compositor-drm.c: http://cgit.freedesktop.org/wayland/weston/tree/src/compositor-drm.c
Me gustaría abrir un contexto OpenGL sin X en Linux. ¿Hay alguna forma de hacerlo?
Sé que es responsable del hardware integrado de la tarjeta gráfica Intel, aunque la mayoría de las personas tienen tarjetas nvidia en su sistema. Me gustaría obtener una solución que funcione con las tarjetas nvidia.
Si no hay otra manera que a través del hardware integrado de Intel, creo que estaría bien saber cómo se hace con eso.
El protocolo X11 y el protocolo en sí mismo son demasiado grandes y complejos. La multiplexación de entrada de mouse / teclado / tableta que proporciona también se descarga para programas modernos. Creo que es el peor obstáculo que impide que Linux Desktop mejore, por lo que busco alternativas.
Actualización (17 de septiembre de 2017):
NVIDIA publicó recientemente un artículo que detalla cómo usar OpenGL en sistemas sin cabeza , que es un caso de uso muy similar a como lo describe la pregunta.
En resumen:
- Enlace a
libOpenGL.so
ylibEGL.so
lugar delibGL.so
. (Por lo tanto, las opciones del vinculador deben ser-lOpenGL -lEGL
- Llame a
eglGetDisplay
, luegoeglInitialize
para inicializar EGL. - Llame a
eglChooseConfig
con el atributo de configuraciónEGL_SURFACE_TYPE
seguido deEGL_PBUFFER_BIT
. - Llame a
eglCreatePbufferSurface
, luegoeglBindApi(EGL_OPENGL_API);
, luegoeglCreateContext
yeglMakeCurrent
.
A partir de ese momento, haga su renderizado OpenGL como de costumbre, y puede modificar la superficie del buffer de píxeles donde lo desee. Este artículo complementario de NVIDIA incluye un ejemplo básico y un ejemplo para múltiples GPU. La superficie de PBuffer también se puede reemplazar con una superficie de ventana o una superficie de mapa de píxeles, de acuerdo con las necesidades de la aplicación.
Lamento no haber investigado más sobre esto en mi edición anterior, pero bueno. Mejores respuestas son mejores respuestas.
Desde mi respuesta en 2010, ha habido una serie de sacudidas importantes en el espacio de gráficos de Linux. Entonces, una respuesta actualizada:
Hoy en día, nouveau y los otros controladores DRI han madurado hasta el punto en que el software OpenGL es estable y funciona razonablemente bien en general. Con la introducción de la API EGL en Mesa, ahora es posible escribir aplicaciones OpenGL y OpenGL ES incluso en escritorios Linux.
Puede escribir su aplicación en EGL objetivo, y puede ejecutarse sin la presencia de un administrador de ventanas o incluso un compositor. Para hacerlo, debería llamar a eglGetDisplay
, eglInitialize
y finalmente a eglCreateContext
y eglMakeCurrent
, en lugar de las llamadas glx habituales para hacer lo mismo.
No conozco la ruta específica del código para trabajar sin un servidor de visualización, pero EGL acepta ambas pantallas X11 y Wayland, y sé que es posible que EGL funcione sin una. Puede crear contextos GL ES 1.1, ES 2.0, ES 3.0 (si tiene Mesa 9.1 o posterior) y OpenGL 3.1 (Mesa 9.0 o posterior). Mesa no (hasta septiembre de 2013) implementó OpenGL 3.2 Core.
Notablemente, en Raspberry Pi y en Android, EGL y GL ES 2.0 (1.1 en Android <3.0) son compatibles por defecto. En Raspberry Pi, no creo que Wayland funcione (a partir de septiembre de 2013), pero obtienes EGL sin un servidor de visualización con los controladores binarios incluidos. Su código EGL también debe ser portátil (con modificaciones mínimas) para iOS, si eso le interesa.
A continuación se muestra la publicación obsoleta previamente aceptada:
Me gustaría abrir un contexto OpenGL sin X en Linux. ¿Hay alguna forma de hacerlo?
Creo que Mesa proporciona un objetivo framebuffer. Si proporciona alguna aceleración de hardware, solo será con hardware para el que haya controladores de código abierto que se hayan adaptado para admitir tal uso.
Gallium3D también es inmaduro y, hasta donde yo sé, el soporte para esto ni siquiera está en la hoja de ruta.
Me gustaría obtener una solución que funcione con las tarjetas nvidia.
No hay uno. Período.
NVIDIA solo proporciona un controlador X, y el proyecto Nouveau aún no está maduro y no es compatible con el tipo de uso que está buscando, ya que actualmente solo se enfoca en el controlador X11.
Puedes ver cómo Android ha resuelto estos problemas. Ver proyecto Android-x86.
Android usa mesa con egl y opengles. Android tiene su propio componente simple de Gralloc para la configuración de modo y las asignaciones gráficas. Además de eso, tienen el componente SurfaceFlinger, que es un motor de composición, que usa OpenGLES para la aceleración.
No veo por qué no podría usar estos componentes de forma similar e incluso reutilizar el código de pegamento de Android.
Quizás te interese un proyecto llamado Wayland
Solo usa Mesa .