Virtualización de OpenGL en VirtualBox

Cuando leí por primera vez que VirtualBox 3.0 agregaría soporte para OpenGL 2.0 quedé impactado. Me preguntaba cómo lograrían que las aplicaciones que ejecutaban en la máquina virtual pudieran acceder al Hardware de video disponible en el Host.

Resulta que la forma en que lograron esto es extremadamente elegante. Lo que hicieron fué programar un driver de video que implemente OpenGL 2.0 y delegue todos los comandos recibidos al “verdadero” OpenGL fuera de la VM. De momento existen tres drivers: uno para Windows, uno para Linux y uno para Solaris, por lo cual estos tres sistemas operativos pueden sacar provecho al Hardware de video al ser virtualizados.

En mi experiencia, tuve unos problemas habilitando el soporte para OpenGL. Resulta que por más que instalé VirtualBox 3.0, la máquina virtual que estaba utilizando había sido creada con una versión 2.x y tenía instalados los VirtualBoxAdditions viejos (versión 1.x). Para poder habilitar OpenGL tuve que desinstalar los Additions viejos en el SO virtual, reiniciar la VM, luego apagala y volver a iniciarla. Recién en ese punto se me permitió instalar los Additions nuevos (versión 3.x).

Dándole un poco de palo al OpenGL virtual, éste parece caminar bastante bien, más allá de que parece tener problemas de refresh (a veces la porción de la pantalla que es dibujada con OpenGL no se refresca) así como problemas de desperdicio de recursos (leaks), ya que en varias oportunidades descubrí que mi programa hacía uso de Shaders ya eliminados de la GPU.

Les dejo un listado de las características de la versión de OpenGL virtualizada. “Casualmente” las características reportadas son las mismas disponibles en el Hardware real. El listado está generado con una herramienta interna de Algorithmia:

OpenGL Version: 2.0 Chromium 1.9
Vendor: Humper

Available Extensions:
GL_ARB_depth_texture
GL_ARB_fragment_program
GL_ARB_multisample
GL_ARB_multitexture
GL_ARB_occlusion_query
GL_ARB_point_parameters
GL_ARB_point_sprite
GL_ARB_shadow
GL_ARB_texture_border_clamp
GL_ARB_texture_compression
GL_ARB_texture_cube_map
GL_ARB_texture_env_add
GL_ARB_texture_env_combine
GL_EXT_texture_env_combine
GL_ARB_texture_env_dot3
GL_EXT_texture_env_dot3
GL_ARB_texture_mirrored_repeat
GL_ARB_texture_non_power_of_two
GL_ARB_transpose_matrix
GL_ARB_vertex_buffer_object
GL_ARB_vertex_program
GL_ARB_window_pos
GL_EXT_blend_color
GL_EXT_blend_minmax
GL_EXT_blend_func_separate
GL_EXT_blend_subtract
GL_EXT_texture_env_add
GL_EXT_fog_coord
GL_EXT_multi_draw_arrays
GL_EXT_secondary_color
GL_EXT_shadow_funcs
GL_EXT_stencil_wrap
GL_EXT_texture_cube_map
GL_EXT_texture_edge_clamp
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_lod_bias
GL_EXT_texture_object
GL_EXT_texture3D
GL_IBM_rasterpos_clip
GL_NV_fog_distance
GL_NV_fragment_program
GL_NV_register_combiners
GL_NV_register_combiners2
GL_NV_texgen_reflection
GL_NV_texture_rectangle
GL_NV_vertex_program
GL_NV_vertex_program1_1
GL_NV_vertex_program2
GL_SGIS_generate_mipmap
GL_CR_state_parameter
GL_CR_cursor_position
GL_CR_bounding_box
GL_CR_print_string
GL_CR_tilesort_info
GL_CR_synchronization
GL_CR_head_spu_name
GL_CR_performance_info
GL_CR_window_size
GL_CR_tile_info
GL_CR_saveframe
GL_CR_readback_barrier_size
GL_CR_server_id_sharing
GL_CR_server_matrix
GL_ARB_shading_language_100
GL_ARB_shader_objects
GL_ARB_vertex_shader
GL_ARB_fragment_shader

Shader Support: YES

Maximum Vertex Attributes: 16
Maximum Vertex Uniforms: 4.096
Maximum Fragment Uniforms: 2.048

Vertex Texture Units: 32
Fragment Texture Units: 32
Combined Texture Units: 32
Maximum Texture Coordinates: 8

Maximum Varying Floats: 60
This entry was posted in Computación Gráfica, Sistemas Operativos, Tutoriales. Bookmark the permalink.