2010-07-24 15 views
24

Me gustaría abrir un contexto OpenGL sin X en linux. ¿Hay alguna forma de hacerlo?OpenGL sin X.org en Linux

Sé que es responsable del hardware integrado de la tarjeta gráfica Intel, aunque la mayoría de las personas tiene 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 de hardware intel integrado, creo que estaría bien saber cómo se hace con eso.

El protocolo X11 y el protocolo en sí 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.

+0

¿Por qué necesita para hacer frente a X11? La mayoría de los kits de herramientas y bibliotecas (como, por ejemplo, libSDL) se ocupan de todos los aspectos básicos de bajo nivel para usted. – nos

+1

@nos: libSDL adopta las mismas limitaciones que X11 impone.Por ejemplo: ¡la tableta wacom se limita a la resolución de la pantalla, mientras que la tableta tiene una resolución diez veces mayor que la que tiene la pantalla! Ratones grandes de dpi tienen problemas similares que he escuchado. – Cheery

+0

@nos: Además, me gustaría hacer un entorno de escritorio. No estoy interesado en escribir programas. Veo que X11 es una interfaz excedente que no ayuda a mis objetivos al escribir un entorno de escritorio. Me da una interfaz grande y desordenada a cambio de muy pocas características útiles. – Cheery

Respuesta

26

Actualización (17 de Sep. de, 2017):

NVIDIA ha publicado recientemente un artículo detailing how to use OpenGL on headless systems, que es un caso de uso muy similar a la pregunta describe.

En resumen:

  • Enlace a libOpenGL.so y libEGL.so en lugar de libGL.so. (Las opciones de enlazador deben por lo tanto ser -lOpenGL -lEGL
  • llamada eglGetDisplay, a continuación, eglInitialize para inicializar EGL.
  • llamada eglChooseConfig con el atributo de configuración EGL_SURFACE_TYPE siguió con EGL_PBUFFER_BIT.
  • llamada eglCreatePbufferSurface, entonces eglBindApi(EGL_OPENGL_API);, entonces eglCreateContext y eglMakeCurrent.

A partir de ese momento, haga su renderizado OpenGL como de costumbre, y puede modificar la superficie de su búfer de píxeles donde desee. This supplementary article from 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 el año 2010, se han producido una serie de importantes reorganizaciones 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, debe llamar al eglGetDisplay, eglInitialize y finalmente a eglCreateContext y eglMakeCurrent, en lugar de las llamadas glx habituales para hacer lo mismo.

No conozco la ruta de código específica para trabajar sin un servidor de pantalla, 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 la 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 obsoleta, puesto 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 el soporte para esto ni siquiera está en la hoja de ruta, hasta donde yo sé.

Me gustaría obtener una solución que funcione con tarjetas nvidia.

No hay ninguna. Período.

NVIDIA solo proporciona un controlador X, y el proyecto Nouveau sigue siendo inmaduro, y no admite el tipo de uso que está buscando, ya que actualmente se centran solo en el controlador X11.

+0

No creo que esta sea una buena respuesta, ya que ya no es verdad y no proporciona una solución. Weston/wayland trabaja con nouveau, por lo que opengl funciona con tarjetas NVIDIA sin X. Y los comentarios sobre la inmadurez de los proyectos de lucha también tienden a envejecer rápidamente. – elmarco

+0

@elmarco Revisaré mi respuesta cuando tenga tiempo más tarde hoy. Tienes razón; mi respuesta es bastante anticuada. Pero para ser justos, lo publiqué a mediados de 2010, cuando Wayland todavía era un prototipo. – greyfade

1

Puede 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 puedo ver por qué no podría usar estos componentes de manera similar e incluso reutilizar el código de pegamento de Android.

Cuestiones relacionadas