viernes, 30 de abril de 2010

Problemas con drivers y gvSIG 3D en Ubuntu

Hace tiempo que la comunidad nos está reportando errores con la extensión 3D y algunas tarjetas gráficas: fundamentalmente con las ATI y las INTEL. Esto ocurre en sistemas operativos linux cuando se está utilizando el driver libre, también conocido como driver Mesa, y que viene por defecto. El error es grave, puesto que al intentar arrancar una vista 3d todo gvSIG se cierra sin dejar rastro[1].


Descripción del problema


Para entender bien el problema se debe valorar el efecto que tiene usar un determinado driver sobre el rendimiento gráfico del sistema. Si los drivers no están instalados correctamente o si no son los adecuados la carga recae sobre el procesador. Así una tarjeta de última generación apenas podría mover aplicaciones 3D complejas.

En sistemas operativos Windows esto no suele dar mayor problema, puesto que la instalación de drivers es una labor sencilla, y normalmente, los aporta el fabricante.

En linux la cosa cambia, hay drivers libres y drivers privados. Y según la tarjeta gráfica que tengas podrás utilizar unos u otros. Históricamente las tarjetas NVIDIA han tenido mejor soporte con su driver privado, aunque ahora esto está cambiando. Para aumentar la confusión, las tarjetas ATI disponen de drivers libres (llamados Mesa) y drivers privados (conocidos como fglrx). Los mismos drivers Mesa sirven también para una amplia gama de tarjetas, entre los que se incluyen las Intel. En Ubuntu si tienes una ATI o una Intel se activa por defecto el driver Mesa.

El modo de aportar aceleración gráfica en linux es mediante la adición del módulo DRI(direct rendering) y GLX en la carga de las X. Estos módulos suelen enlazar con una librería llamada libGL y que aporta la implementación de la API de OpenGL que es necesaria para obtener aceleración gráfica. De modo que cada driver aporta su implementación de OpenGL que está optimizado para un determinado tipo de tarjetas.

En gvSIG3D se hace un uso extenso de OpenGL desde el grafo de escena en el que se basa. Por lo que el driver utilizado es de suma importancia.

Por otro lado está el tema del manejo de memoria y la carga de librerías. En linux cada proceso tiene su espacio de memoria reservado, y a la vez comparte un espacio global con el resto del sistema. La carga de librerías dinámicas por parte de un proceso se realiza mediante la llamada dlopen (dynamic library open).

Por defecto cada proceso realiza la carga de librerías en su espacio de memoria. De esta manera un proceso no tendrá acceso al espacio de memoria de otro. Tampoco tendrá acceso a los símbolos que cargan sus librerías a no ser que estas librerías se carguen en el espacio global de memoria del sistema.

Retomando el hilo inicial (gvSIG3D hace crash! con mi tarjeta ATI o Intel en Ubuntu), parece ser que el problema reside en que las librerías DRI y GLX del driver Mesa, ya no enlazan con libGL directamente.

Por tanto esta librería ya no se encuentra cargada en el espacio global de memoria. En consecuencia el driver no es capaz de encontrar los símbolos de OpenGL requeridos a no ser que se carguen en el espacio global de memoria.

En C++ es posible arreglar este problema mediante el uso del flag RTDL_GLOBAL en la llamada dlopen() haciendo algo parecido a esto antes de levantar un contexto de render[2]:

/* Make sure libGL symbols will be visible to the driver */
glhandle = dlopen("libGL.so", RTLD_NOW | RTLD_GLOBAL);
/**para más info mirar en [3]**/

Sin embargo la problemática asociada con gvSIG3D va más allá. En nuestro caso es jogl (JavaOpenGL) el que levanta el contexto de render. Java carga la librería jogl mediante la llamada System.loadLibrary() e internamente lanza este dlopen() . Sin embargo la llamada no se realiza con el flag RTLD_GLOBAL (que haría visible al driver los símbolos requeridos). Como esta llamada la realiza Java internamente, nos impide poder definir los flags.


Soluciones


En este momento estamos decidiendo que solución adoptar, puesto que arreglar el fallo con mediación del usuario es bastante sencillo. Se trata de precargar la librería antes de ejecutar el programa, de este modo los símbolos estarán disponibles.

En caso de tener Ubuntu en una consola ejecutar :

1. glxinfo | grep rendering

Si en la consola aparece "direct rendering: Yes " puedes seguir el proceso . Si no, no tienes aceleración 3D, estás usando el procesador en lugar de la tarjeta gráfica. El rendimiento será muy bajo.

2. glxinfo | grep renderer

Si aparece algo como "OpenGL renderer string : Mesa DRI ..." estás utilizando los drivers mesa. Enhorabuena :D, quizá el fallo pueda solucionarse, aunque es posible que el rendimiento no sea muy alto.

3. export LD_PRELOAD=/usr/lib/libGL.so.1

y después en la misma consola (muy importante) ejecutar la aplicación gvSIG (mediante el script gvSIG.sh.) en la que tengas instalada la extensión 3D.

4. ./ruta-a-gvSIG_1.9/bin/gvSIG.sh

gvSIG debe de estar iniciándose....

5. Intenta abrir una vista 3D.

Sin embargo hacerlo de manera automática y para todos los usuarios (todas las tarjetas/drivers) ya no es tan sencillo. Entre las opciones que estamos discutiendo se encuentran las siguientes:

1. Levantar nosotros mismos el contexto de render, y así al mismo tiempo eliminamos la dependencia que tenemos con jogl.

2. Intentar averiguar mediante script que tipo de driver/tarjeta tiene el usuario y ejecutar el LD_PRELOAD en función de que implementación de libGL se esté usando.

3. Añadir este problema a la lista de problemas conocidos y dejar la solución en forma de parche, para aquel que se la quiera descargar.

Esperamos aportar la solución definitiva en el siguiente build (bn14). Para los que necesiten una solución inmediata pueden utilizar el procedimiento que se indica arriba.

Si el procedimiento no te ha funcionado, contacta con nosotros en las listas de gvSIG o en este mismo blog. Suerte!



[1]http://forge.osor.eu/tracker/?func=detail&group_id=89&aid=13153&atid=732
[2]http://www.xfree86.org/current/DRI11.html
[3]http://www.mail-archive.com/mesa3d-dev@lists.sourceforge.net/msg01152.html

14 comentarios:

  1. Muy útil e interesante. Saludos!

    ResponderEliminar
  2. hola y muchas gracias por adelantado por curraros esto y aportar los conocimientos...
    en el paso 1 he instalado mesa
    sin embargo, cuando decis de abrir desde la terminal el gvSIG me dice esto object '/usr/lib/libGL.so.1' from LD_PRELOAD cannot be preloaded: ignored.

    si pudierais ayudarme os lo agradecería un montón :)

    ResponderEliminar
  3. Hola de nuevo
    habia un error, y es que no estaba el archivo libGL en esa carpeta, sino en /usr/lib/x86_64-linux-gnu/mesa
    al pedirle de nuevo la glxinfo para el renderer me dice ahora si, sin informe de error, que se está usando mesa
    OpenGL renderer string: Mesa DRI Intel(R) Sandybridge Mobile
    pero al intentar abrir el gvSIG en la consola dice
    Detecting video driver...
    DRI active
    You are using driver Mesa
    find: «/usr/lib32/mesa»: No existe el archivo o el directorio
    /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2
    ./gvSIG_1.11.0_final/bin/gvSIG.sh: 32: export: /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2: bad variable name

    ResponderEliminar
  4. Hola Ameise,

    Creo que en tu caso lo que pasa es que no tienes instalados los drivers para mesa 32 bits, sino que los tienes para 64, Instálate el paquete de drivers de 32 bits.

    En principio no es necesario que hagas el LD_PRELOAD ya uqe esto se arregló en los builds posteriores. Osea que si te has instalado la versión final no deberías modificar nada.

    Un saludo.

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar

  7. hola, creo que lo he solucionado!!!! (he eliminado los comentarios anteriores)
    1. el ia32-libs me decia que ya estaba instalado
    2. el libglu1-mesa-dev:i386 me daba el mismo problema de antes. Parecia que seguia sin encontrar mesa en el directorio /usr/lib32, y por otro lado parece que se instala por defecto en usr/lib/x86-64-linux-gnu pero luego no encuentra la ruta o vaya usted a saber (no soy experta en esto de ubuntu(
    3, tras dar unas cuantas vueltas por la lista de correo he encontrado que podia funcionar con los driver de nvidia, y tras instalar el driver de Nvidia (sudo apt-get install nvidia-current) ya me deja abrir el gvSIG y me sale la parte de visión 3D y animaciones,

    Ahora no puedo ponerme a probar como va, pero os comento en cuanto pueda. Un saludo,

    ResponderEliminar
  8. Hola de nuevo,

    Me alegro de que lo hayas podido solucionar. De hecho este post estaba orientado a aquellos que tuvieran una tarjeta ATI o INTEL. Si tu tarjeta es Nvidia sus drivers para linux funcionan muy bien, y no deberías tener problemas con la extensión 3D.

    Saludos, y si encuentras algún problema más no dudes en comentarlo

    ResponderEliminar
  9. Hola otra vez
    vaya, lo primero lamentar que vuestro proyecto se haya quedado sin fondos, como he leido por este blog...
    Mi tarjeta efectivamente es Intel, no Nvidia. Espero no haber fastidiao nada al instalar estos drivers.
    Cuando vi que me sacaba los iconos de 3D y animaciones dije, ole yo, y me fui, pero hoy al juguetear vi que aquello iba muy lento y nada, le pedi el glxinfo:
    name of display: :0
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Error: couldn't find RGB GLX visual or fbconfig
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".
    Xlib: extension "GLX" missing on display ":0".

    Ahora he encontrado esto
    http://foro.ubuntu-guia.com/Instalacion-de-drivers-libres-Intel-Ati-y-Nvidia-Ubuntu-12-04-td4026602.html

    Muchas gracias por vuestra ayuda y respuestas. Por cierto, si lo preferís, cuando resolvamos lo ponemos en el foro gvSIG usuarios, para que este accesible alli :) saludos!

    ResponderEliminar
  10. Para Intel he encontrado este otro post
    http://www.techlw.com/2012/08/install-latest-intel-gpu-drivers-in.html
    el cual tampoco me funciona.

    He estado mirando y parece que los drivers de Nvidia podian darme problemas, los desinstalé e intenté lo que decía en los post anteriores.
    Sigo igual... sin poder usar el 3D por lo de las librerias usr/lib32 (no encuentra mesa en este directorio).
    De nuevo un saludo...

    ResponderEliminar
  11. hola,

    A ver puedes probar esto, busca tu libGL que tiene pinta de que sea este

    /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 y haz un enlace simbólico en /usr/lib32 con el comando ln -s. A ver si hay suerte.

    ResponderEliminar
  12. hola
    he intentado el comando
    sudo ln -s /usr/lib32 /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2

    seguimos igual :( (qué misterio)
    saludos y gracias de todos modos

    ResponderEliminar
  13. La orden correcta sería

    sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib32/libGL.so.1

    ResponderEliminar
  14. hola
    el resultado es el mismo :(
    You are using driver Mesa
    find: «/usr/lib32/mesa»: No existe el archivo o el directorio
    /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0
    ./gvSIG_1.11.0_final/bin/gvSIG.sh: 32: export: /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0: bad variable name

    ResponderEliminar