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