fbpx
Wikipedia

VirtualGL

VirtualGL es un programa de código abierto que redirige los comandos de procesamiento de aplicaciones 3D OpenGL de Unix y Linux para hardware acelerador 3D en un servidor dedicado y muestra el resultado representado interactivamente a un cliente liviano localizado en cualquier lugar de la red.

VirtualGL
Información general
Tipo de programa software de administración remota
Licencia GNU General Public License (GPL), wxWindows Library Licence
Estado actual en desarrollo
Idiomas inglés
Información técnica
Programado en C, C++, Shell de Unix
Versiones
Última versión estable 2.3 13 de diciembre de 2011 (9 años, 7 meses y 22 días)
Enlaces
Sitio web oficial

El problema

Normalmente, VNC y otros entornos de cliente ligero para Unix y Linux o no soportan las aplicaciones OpenGL para nada o fuerzan a las aplicaciones OpenGL a renderizarse sin el beneficio de aceleración por hardware OpenGL. Mostrar de forma remota aplicaciones 3D con aceleración de hardware tradicionalmente ha requerido el uso de "representación indirecta". La representación indirecta utiliza la extensión GLX de la Sistema x Window ("X11" o "X") para encapsular los comandos OpenGL dentro de la fuente de protocolo X11 y enviarlos desde una aplicación a una pantalla de X. Tradicionalmente, la aplicación se ejecuta en un servidor de aplicaciones de forma remota localizada y la visualización de x se ejecuta en el escritorio del usuario. En este escenario, todos los comandos de OpenGL son ejecutados por el equipo de escritorio del usuario, por lo que la máquina debe tener un acelerador de gráficos 3D rápido. Esto limita el tipo de máquina que remotamente puede mostrar una aplicación 3D utilizando este método.

La renderización indirecta puede demostrarse suficientemente funcional si la red es lo suficientemente rápida (si usa Gigabit Ethernet, por ejemplo), si la aplicación no modifica dinámicamente la geometría del objeto que se representa, si la aplicación utiliza listas de pantalla, y si la aplicación utiliza una gran cantidad de texturas. Sin embargo, muchas aplicaciones OpenGL no cumplen estos criterios. Para complicar aún más las cosas, algunas extensiones OpenGL no funcionan en un entorno de representación indirecta. Algunas de estas extensiones requieren la capacidad de acceder directamente en el hardware de gráficos 3D y por lo tanto nunca es posible trabajar indirectamente. En otros casos, la pantalla X del usuario no puede proporcionar apoyo explícito para una extensión de OpenGL necesaria o la extensión puede depender de una configuración de hardware específico que no está presente en el equipo de escritorio del usuario.

Renderizando (procesando) OpenGL en el servidor de aplicaciones se eluden los problemas introducidos por la representación indirecta, dado que la aplicación ahora dispone de un camino de acceso rápido y directo al hardware de procesamiento de 3D. Si la representación 3D se produce en el servidor de aplicaciones, solo las imágenes 2D resultantes deben enviarse al escritorio del usuario. Las imágenes pueden entregarse a la misma velocidad de fotograma independientemente del tamaño de los datos 3D que fueron utilizados para generarlos, así que realizar procesamiento (renderizado) de 3D en el servidor de aplicaciones efectivamente convierte el problema de rendimiento 3D en un problema de rendimiento en 2D. El problema se convierte en cómo tratar un flujo de 1-2 megapíxeles de datos de imagen en una red a velocidades de fotograma interactivas, pero las tecnologías de productos básicos (HDTV, por nombrar uno) ya abordan este problema.

La solución OpenGL

Biblioteca (informática) VirtualGL utiliza "GLX duplicidad" para realizar el procesamiento OpenGL en el servidor de aplicaciones. Normalmente, las aplicaciones UNIX y Linux OpenGL envían comandos GLX y ordinarias X 11 comandos al mismo x mostrar. Se utilizan los comandos GLX a contextos de procesamiento OpenGL se unen a un particular x ventana, obtener una lista de formatos de píxel que el x mostrar apoyos, etc.. VirtualGL aprovecha una característica en Unix y Linux que permite "cargar" una biblioteca en una aplicación, efectivamente interceptar (AKA "interposición") cierta función llama a que la aplicación podría realizar normalmente shared bibliotecas con la que está vinculado. Una vez que VirtualGL está precargado en una aplicación Unix o Linux OpenGL, intercepta las llamadas a funciones de la aplicación GLX y les reescribe tal que la GLX correspondiente comandos se envían al servidor de aplicaciones x display, que presumiblemente tiene un acelerador de hardware 3D conectado. Así, VirtualGL impide comandos GLX que se envían por la red x mostrar al usuario o a un virtual x pantalla ("X proxy"), como el VNC, que no admite GLX. En el proceso de reescritura de las llamadas GLX, VirtualGL también redirige el procesamiento OpenGL en búferes de píxeles fuera de la pantalla ("Pbuffers.") Mientras tanto, el resto de las llamadas de función de la aplicación, incluido el ordinario X 11 comandos utilizados para dibujar la interfaz de usuario de la aplicación, pueden pasar a través de VirtualGL sin modificaciones.

Internamente, el motor intermedio (interposer) del VirtualGL también mantiene un mapa de ventanas a Pbuffers, que relaciona atributos visuales entre la pantalla de destino X y la pantalla X en la que se producirá la representación 3D y realiza una serie de otras funciones de hash (hashing) para asegurar que la redirección GLX es transparente. Pero, esencialmente, una vez establecido el contexto de OpenGL en la pantalla del servidor de aplicaciones X, VirtualGL sale del camino y se permite a todos los comandos posteriores OpenGL pasar sin trabas al hardware 3D del servidor de aplicaciones. Así, la aplicación puede utilizar automáticamente las funciones OpenGL y extensiones proporcionadas por el hardware y controladores del servidor de aplicaciones.

Aparte del ordenamiento de comandos GLX y administración de Pbuffers, VirtualGL también lee hacia atrás los píxeles renderizados en el momento oportuno (generalmente por supervisión glXSwapBuffers() or glFinish()) y, a continuación, dibuja los píxeles en la ventana X de la aplicación utilizando x comandos de dibujo de imagen estándar X. Como VirtualGL redirige los comandos GLX fuera de la pantalla de destino X, puede utilizarse para agregar soporte 3D acelerado a servidores proxy X (como VNC) así como para prevenir el renderizado indirecto de OpenGL al usar una pantalla remota X.

 
Cuando se usa el X11 Image Transport (anteriormente "modo de Proxy"), los renderizados 3D y 2D se producen en el servidor de aplicaciones. VirtualGL redirige los comandos 3D desde la aplicación al hardware acelerador 3D, lee hacia atrás las imágenes procesadas y les dibuja como una serie de mapas de bits sin comprimir en el proxy X (VNC o sistema similar). Mientras, los comandos de dibujo 2D (comandos X11) de la aplicación se envían al servidor proxy X directamente. El proxy X es el único responsable de la compresión de las imágenes y su envío a los clientes remotos.

Usar VirtualGL en concierto con VNC u otro proxy X permite que varios usuarios simultáneamente ejecuten aplicaciones 3D en un servidor de aplicación único y varios clientes para compartir cada sesión. Sin embargo, VNC y su tropa están ajustados para manejar aplicaciones 2D con grandes áreas de color sólido, pocos colores y pocas diferencias inter-frame. Las aplicaciones 3D, por otra parte, generan imágenes con patrones de color complejo de grano fino, y mucha menos correlación entre los fotogramas posteriores. La carga de trabajo generado dibujando imágenes renderizadas desde una aplicación de OpenGL en una ventana X es esencialmente la misma carga de trabajo de un reproductor de vídeo, y un software de cliente ligero disponible normalmente carece de códecs de imagen suficientemente rápidos para poder manejar esta carga de trabajo con velocidades de fotograma interactivas.

VirtualGL trabaja en todo este problema de dos maneras:

  1. Mediante TurboVNC
  2. Mediante transporte de imagen CFR

TurboVNC

TurboVNC es una rama (offshoot) de TightVNC que acelera las rutas de codificación Tight y JPEG de éste, aprovechando las ventajas de libjpeg-turbo, una versión acelerada por SIMD de libjpeg. En redes de 100 megabits Ethernet, TurboVNC es capaz de mostrar imágenes de pantalla completa (1280 x 1024 píxeles) con calidad de imagen sin pérdidas perceptibles en más de 20 fotogramas por segundo. TurboVNC incluye optimizaciones adicionales que permiten mostrar las imágenes de pantalla completa en 7-10 fotogramas por segundo en banda ancha, con calidad de imagen notablemente menor pero utilizable. TurboVNC extiende también TightVNC para incluir doble búfer en el lado del cliente y otras características dirigidas a aplicaciones 3D, así como plena compatibilidad con plataformas Solaris. TurboVNC y VirtualGL son utilizados por el Centro Tejano de Cómputo Académico (TACC) de la Universidad de Texas en Austin para que los usuarios de TeraGrid puedan acceder remotamente a las capacidades de procesamiento 3D del clúster de visualización .

Transporte de imagen VGL (anteriormente "modo directo")

 
Cuando se utiliza el transporte de imagen de CFR (anteriormente "modo directo"), la representación 3D se produce en el servidor de aplicaciones, pero la representación 2D se produce en el equipo cliente. VirtualGL comprime las imágenes renderizadas desde la aplicación 3D y los envía como un flujo de vídeo para el cliente, que descomprime y muestra la secuencia de vídeo en tiempo real.

Cuando se utiliza el transporte de imagen VGL Image Transport, VirtualGL comprime imágenes 3D renderizadas en proceso utilizando el mismo códec JPEG optimizado que utiliza TurboVNC. VirtualGL, a continuación, envía las imágenes comprimidas sobre un socket TCP dedicado a una aplicación cliente de VirtualGL que se ejecuta en la máquina cliente. El cliente VirtualGL es responsable de la descompresión de las imágenes y de dibujar los píxeles en la ventana X apropiada. Mientras tanto, los elementos no OpenGL de pantalla de la aplicación son enviados a través de la red mediante el protocolo de control estándar remoto X11 y renderizados en el equipo cliente.

Este enfoque requiere que una pantalla X esté presente en el equipo cliente y que se confíe en el protocolo remoto X11 para llevar a cabo representación 2D, lo que significa que muchas aplicaciones se desempeñarán pobremente al utilizar el transporte de imagen VGL Image Transport en redes de alta latencia. Además, el transporte de imagen VGL no permite inherentemente la colaboración (varios clientes por sesión), ya que las imágenes son 'empujadas' a los equipos de los usuarios en lugar de tirarse de ellas. Pero el uso del transporte de imagen VGL ofrece una experiencia de aplicación completamente integrada, mediante el cual cada ventana de la aplicación corresponde a una única ventana del escritorio. El transporte de imagen VGL también reduce la carga de CPU del servidor, ya que el renderizado 2D se está produciendo en el ordenador/computador cliente y el transporte de imagen VGL permite el uso de funciones avanzadas de OpenGL, como estéreo cuadri-bufferado.

Los desarrolladores de VirtualGL visualizaron que los principales usuarios del transporte de imagen VGL serían los usuarios de portátiles con conexión inalámbrica a internet 802.11g o una conexión Ethernet rápida al servidor de aplicaciones.

Soluciones comerciales que usan VirtualGL

VirtualGL y TurboVNC fueron los componentes principales del producto Sistema de visualización de Sun de Sun Microsystems, que fue suspendido en abril de 2009. Los dos paquetes de código abierto se combinaron con un plugin de código cerrado que permite a VirtualGL a enviar imágenes comprimidas a clientes ligeros Sun Ray y otro paquete de código cerrado que integraba VirtualGL con Sun Grid Engine, proporcionando administración de recursos y la programación de trabajos 3D remotos. La combinación de estos paquetes, llamada "Sun Shared Visualization" ("Visualización compartida de Sun"), estaba disponible como descarga gratuita (Sun cobraba por asistencia de apoyo).

La versión v2.1 del software de HP también incluye componentes que se integran con VirtualGL y TurboVNC, permitiendo programar y mostrar remotamente desde un clúster de visualización trabajos en 3D.

La versión v3.0.0 de ThinLinc está diseñada para trabajar en conjunto con VirtualGL.

Referencias

Véase también

Enlaces externos

  • Sitio web oficial
  • VirtualGL en SourceForge (en inglés)
  •   Datos: Q2030613

virtualgl, programa, código, abierto, redirige, comandos, procesamiento, aplicaciones, opengl, unix, linux, para, hardware, acelerador, servidor, dedicado, muestra, resultado, representado, interactivamente, cliente, liviano, localizado, cualquier, lugar, info. VirtualGL es un programa de codigo abierto que redirige los comandos de procesamiento de aplicaciones 3D OpenGL de Unix y Linux para hardware acelerador 3D en un servidor dedicado y muestra el resultado representado interactivamente a un cliente liviano localizado en cualquier lugar de la red VirtualGLInformacion generalTipo de programasoftware de administracion remotaLicenciaGNU General Public License GPL wxWindows Library LicenceEstado actualen desarrolloIdiomasinglesInformacion tecnicaProgramado enC C Shell de UnixVersionesUltima version estable2 3 13 de diciembre de 2011 9 anos 7 meses y 22 dias EnlacesSitio web oficial editar datos en Wikidata Indice 1 El problema 2 La solucion OpenGL 2 1 TurboVNC 2 2 Transporte de imagen VGL anteriormente modo directo 3 Soluciones comerciales que usan VirtualGL 4 Referencias 5 Vease tambien 6 Enlaces externosEl problema EditarNormalmente VNC y otros entornos de cliente ligero para Unix y Linux o no soportan las aplicaciones OpenGL para nada o fuerzan a las aplicaciones OpenGL a renderizarse sin el beneficio de aceleracion por hardware OpenGL Mostrar de forma remota aplicaciones 3D con aceleracion de hardware tradicionalmente ha requerido el uso de representacion indirecta La representacion indirecta utiliza la extension GLX de la Sistema x Window X11 o X para encapsular los comandos OpenGL dentro de la fuente de protocolo X11 y enviarlos desde una aplicacion a una pantalla de X Tradicionalmente la aplicacion se ejecuta en un servidor de aplicaciones de forma remota localizada y la visualizacion de x se ejecuta en el escritorio del usuario En este escenario todos los comandos de OpenGL son ejecutados por el equipo de escritorio del usuario por lo que la maquina debe tener un acelerador de graficos 3D rapido Esto limita el tipo de maquina que remotamente puede mostrar una aplicacion 3D utilizando este metodo La renderizacion indirecta puede demostrarse suficientemente funcional si la red es lo suficientemente rapida si usa Gigabit Ethernet por ejemplo si la aplicacion no modifica dinamicamente la geometria del objeto que se representa si la aplicacion utiliza listas de pantalla y si la aplicacion utiliza una gran cantidad de texturas Sin embargo muchas aplicaciones OpenGL no cumplen estos criterios Para complicar aun mas las cosas algunas extensiones OpenGL no funcionan en un entorno de representacion indirecta Algunas de estas extensiones requieren la capacidad de acceder directamente en el hardware de graficos 3D y por lo tanto nunca es posible trabajar indirectamente En otros casos la pantalla X del usuario no puede proporcionar apoyo explicito para una extension de OpenGL necesaria o la extension puede depender de una configuracion de hardware especifico que no esta presente en el equipo de escritorio del usuario Renderizando procesando OpenGL en el servidor de aplicaciones se eluden los problemas introducidos por la representacion indirecta dado que la aplicacion ahora dispone de un camino de acceso rapido y directo al hardware de procesamiento de 3D Si la representacion 3D se produce en el servidor de aplicaciones solo las imagenes 2D resultantes deben enviarse al escritorio del usuario Las imagenes pueden entregarse a la misma velocidad de fotograma independientemente del tamano de los datos 3D que fueron utilizados para generarlos asi que realizar procesamiento renderizado de 3D en el servidor de aplicaciones efectivamente convierte el problema de rendimiento 3D en un problema de rendimiento en 2D El problema se convierte en como tratar un flujo de 1 2 megapixeles de datos de imagen en una red a velocidades de fotograma interactivas pero las tecnologias de productos basicos HDTV por nombrar uno ya abordan este problema La solucion OpenGL EditarBiblioteca informatica VirtualGL utiliza GLX duplicidad para realizar el procesamiento OpenGL en el servidor de aplicaciones Normalmente las aplicaciones UNIX y Linux OpenGL envian comandos GLX y ordinarias X 11 comandos al mismo x mostrar Se utilizan los comandos GLX a contextos de procesamiento OpenGL se unen a un particular x ventana obtener una lista de formatos de pixel que el x mostrar apoyos etc VirtualGL aprovecha una caracteristica en Unix y Linux que permite cargar una biblioteca en una aplicacion efectivamente interceptar AKA interposicion cierta funcion llama a que la aplicacion podria realizar normalmente shared bibliotecas con la que esta vinculado Una vez que VirtualGL esta precargado en una aplicacion Unix o Linux OpenGL intercepta las llamadas a funciones de la aplicacion GLX y les reescribe tal que la GLX correspondiente comandos se envian al servidor de aplicaciones x display que presumiblemente tiene un acelerador de hardware 3D conectado Asi VirtualGL impide comandos GLX que se envian por la red x mostrar al usuario o a un virtual x pantalla X proxy como el VNC que no admite GLX En el proceso de reescritura de las llamadas GLX VirtualGL tambien redirige el procesamiento OpenGL en buferes de pixeles fuera de la pantalla Pbuffers Mientras tanto el resto de las llamadas de funcion de la aplicacion incluido el ordinario X 11 comandos utilizados para dibujar la interfaz de usuario de la aplicacion pueden pasar a traves de VirtualGL sin modificaciones Internamente el motor intermedio interposer del VirtualGL tambien mantiene un mapa de ventanas a Pbuffers que relaciona atributos visuales entre la pantalla de destino X y la pantalla X en la que se producira la representacion 3D y realiza una serie de otras funciones de hash hashing para asegurar que la redireccion GLX es transparente Pero esencialmente una vez establecido el contexto de OpenGL en la pantalla del servidor de aplicaciones X VirtualGL sale del camino y se permite a todos los comandos posteriores OpenGL pasar sin trabas al hardware 3D del servidor de aplicaciones Asi la aplicacion puede utilizar automaticamente las funciones OpenGL y extensiones proporcionadas por el hardware y controladores del servidor de aplicaciones Aparte del ordenamiento de comandos GLX y administracion de Pbuffers VirtualGL tambien lee hacia atras los pixeles renderizados en el momento oportuno generalmente por supervision glXSwapBuffers or glFinish y a continuacion dibuja los pixeles en la ventana X de la aplicacion utilizando x comandos de dibujo de imagen estandar X Como VirtualGL redirige los comandos GLX fuera de la pantalla de destino X puede utilizarse para agregar soporte 3D acelerado a servidores proxy X como VNC asi como para prevenir el renderizado indirecto de OpenGL al usar una pantalla remota X Cuando se usa el X11 Image Transport anteriormente modo de Proxy los renderizados 3D y 2D se producen en el servidor de aplicaciones VirtualGL redirige los comandos 3D desde la aplicacion al hardware acelerador 3D lee hacia atras las imagenes procesadas y les dibuja como una serie de mapas de bits sin comprimir en el proxy X VNC o sistema similar Mientras los comandos de dibujo 2D comandos X11 de la aplicacion se envian al servidor proxy X directamente El proxy X es el unico responsable de la compresion de las imagenes y su envio a los clientes remotos Usar VirtualGL en concierto con VNC u otro proxy X permite que varios usuarios simultaneamente ejecuten aplicaciones 3D en un servidor de aplicacion unico y varios clientes para compartir cada sesion Sin embargo VNC y su tropa estan ajustados para manejar aplicaciones 2D con grandes areas de color solido pocos colores y pocas diferencias inter frame Las aplicaciones 3D por otra parte generan imagenes con patrones de color complejo de grano fino y mucha menos correlacion entre los fotogramas posteriores La carga de trabajo generado dibujando imagenes renderizadas desde una aplicacion de OpenGL en una ventana X es esencialmente la misma carga de trabajo de un reproductor de video y un software de cliente ligero disponible normalmente carece de codecs de imagen suficientemente rapidos para poder manejar esta carga de trabajo con velocidades de fotograma interactivas VirtualGL trabaja en todo este problema de dos maneras Mediante TurboVNC Mediante transporte de imagen CFRTurboVNC Editar TurboVNC es una rama offshoot de TightVNC que acelera las rutas de codificacion Tight y JPEG de este aprovechando las ventajas de libjpeg turbo una version acelerada por SIMD de libjpeg En redes de 100 megabits Ethernet TurboVNC es capaz de mostrar imagenes de pantalla completa 1280 x 1024 pixeles con calidad de imagen sin perdidas perceptibles en mas de 20 fotogramas por segundo TurboVNC incluye optimizaciones adicionales que permiten mostrar las imagenes de pantalla completa en 7 10 fotogramas por segundo en banda ancha con calidad de imagen notablemente menor pero utilizable TurboVNC extiende tambien TightVNC para incluir doble bufer en el lado del cliente y otras caracteristicas dirigidas a aplicaciones 3D asi como plena compatibilidad con plataformas Solaris TurboVNC y VirtualGL son utilizados por el Centro Tejano de Computo Academico TACC de la Universidad de Texas en Austin para que los usuarios de TeraGrid puedan acceder remotamente a las capacidades de procesamiento 3D del cluster de visualizacion Longhorn Transporte de imagen VGL anteriormente modo directo Editar Cuando se utiliza el transporte de imagen de CFR anteriormente modo directo la representacion 3D se produce en el servidor de aplicaciones pero la representacion 2D se produce en el equipo cliente VirtualGL comprime las imagenes renderizadas desde la aplicacion 3D y los envia como un flujo de video para el cliente que descomprime y muestra la secuencia de video en tiempo real Cuando se utiliza el transporte de imagen VGL Image Transport VirtualGL comprime imagenes 3D renderizadas en proceso utilizando el mismo codec JPEG optimizado que utiliza TurboVNC VirtualGL a continuacion envia las imagenes comprimidas sobre un socket TCP dedicado a una aplicacion cliente de VirtualGL que se ejecuta en la maquina cliente El cliente VirtualGL es responsable de la descompresion de las imagenes y de dibujar los pixeles en la ventana X apropiada Mientras tanto los elementos no OpenGL de pantalla de la aplicacion son enviados a traves de la red mediante el protocolo de control estandar remoto X11 y renderizados en el equipo cliente Este enfoque requiere que una pantalla X este presente en el equipo cliente y que se confie en el protocolo remoto X11 para llevar a cabo representacion 2D lo que significa que muchas aplicaciones se desempenaran pobremente al utilizar el transporte de imagen VGL Image Transport en redes de alta latencia Ademas el transporte de imagen VGL no permite inherentemente la colaboracion varios clientes por sesion ya que las imagenes son empujadas a los equipos de los usuarios en lugar de tirarse de ellas Pero el uso del transporte de imagen VGL ofrece una experiencia de aplicacion completamente integrada mediante el cual cada ventana de la aplicacion corresponde a una unica ventana del escritorio El transporte de imagen VGL tambien reduce la carga de CPU del servidor ya que el renderizado 2D se esta produciendo en el ordenador computador cliente y el transporte de imagen VGL permite el uso de funciones avanzadas de OpenGL como estereo cuadri bufferado Los desarrolladores de VirtualGL visualizaron que los principales usuarios del transporte de imagen VGL serian los usuarios de portatiles con conexion inalambrica a internet 802 11g o una conexion Ethernet rapida al servidor de aplicaciones Soluciones comerciales que usan VirtualGL EditarVirtualGL y TurboVNC fueron los componentes principales del producto Sistema de visualizacion de Sun de Sun Microsystems que fue suspendido en abril de 2009 Los dos paquetes de codigo abierto se combinaron con un plugin de codigo cerrado que permite a VirtualGL a enviar imagenes comprimidas a clientes ligeros Sun Ray y otro paquete de codigo cerrado que integraba VirtualGL con Sun Grid Engine proporcionando administracion de recursos y la programacion de trabajos 3D remotos La combinacion de estos paquetes llamada Sun Shared Visualization Visualizacion compartida de Sun estaba disponible como descarga gratuita Sun cobraba por asistencia de apoyo La version v2 1 del software Scalable Visualization Array matriz de visualizacion escalable de HP tambien incluye componentes que se integran con VirtualGL y TurboVNC permitiendo programar y mostrar remotamente desde un cluster de visualizacion trabajos en 3D La version v3 0 0 de ThinLinc esta disenada para trabajar en conjunto con VirtualGL Referencias EditarVease tambien Editar Portal Software libre Contenido relacionado con Software libre X Window System Xgl AIGLX VNC OpenGLEnlaces externos EditarSitio web oficial VirtualGL en SourceForge en ingles Datos Q2030613Obtenido de https es wikipedia org w index php title VirtualGL amp oldid 137145240, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos