-//TODO
+# libgliar - a library that can fake the OpenGL context info returned by
+# the glGet OpenGL calls
+#
+# Copyright (C) 2013 Canonical Ltd
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Eleni Maria Stea <elene.mst@gmail.com>
+
+Installation:
+-------------
+Step 1: Configure
+./configure --prefix=<installation_path> or ./configure to install the library
+in the default directory (default prefix: /usr/local/lib)
+
+Step 2: Build
+Enter the libgliar source directory and run:
+make
+
+Step 3: Install
+Inside the source directory type:
+make install (or sudo make install if you used the default prefix)
+
+Uninstall:
+----------
+Enter the source directory and type:
+make uninstall (or sudo make uninstall if you used the default prefix)
+++ /dev/null
-src = $(wildcard src/*.c)
-obj = $(src:.c=.o)
-lib_so = libgliar.so
-
-CFLAGS = -pedantic -Wall -g -fPIC -D_GNU_SOURCE
-
-$(lib_so): $(obj)
- $(CC) -o $@ -shared $(obj) $(LDFLAGS)
-
-.PHONY: clean
-clean:
- rm -f $(obj) $(lib_so)
--- /dev/null
+src = $(wildcard src/*.c)
+obj = $(src:.c=.o)
+lib_so = libgliar.so
+gliar_sh = gliar
+
+CFLAGS = -pedantic -Wall -g -fPIC -D_GNU_SOURCE
+
+$(lib_so): $(obj)
+ $(CC) -o $@ -shared $(obj) $(LDFLAGS)
+
+.PHONY: clean
+clean:
+ rm -f $(obj) $(lib_so)
+
+.PHONY: install
+install: $(lib_so)
+ mkdir -p $(PREFIX)/lib
+ mkdir -p $(PREFIX)/bin
+ cp $(lib_so) $(PREFIX)/lib/$(lib_so)
+ cp $(gliar_sh) $(PREFIX)/bin/$(gliar_sh)
+ ldconfig
+
+.PHONY: uninstall
+uninstall:
+ rm -f $(PREFIX)/lib/$(lib_so)
+ rm -f $(PREFIX)/bin/$(gliar_sh)
Usage:
------
-LD_PRELOAD=./libgliar.so <opengl_executable>
+gliar <opengl_executable>
The library will read the gliar.conf file in the user's library directory or
the .gliar.conf file in the user's home directory.
valueN
Currently supported keys:
-"vendor" (the vendor string), "extensions" (the extensions string), "version" (the opengl version string),
-"sl version" (the shading language version), "renderer" (the renderer)
-
-Example:
----------
-gliar.conf:
-[vendor]
-Mutant Stargoat
-
-[extensions]
-GL_MSG_hikiko_ext
-GL_MSG_test
-
-$ LD_PRELOAD=./libgliar glxinfo | grep -A2 "OpenGL extensions"
-OpenGL extensions:
- GL_MSG_hikiko_ext, GL_MSG_test
-
+"vendor" (the vendor string), "extensions" (the list of the extensions), "version" (the opengl version string),
+"sl version" (the shading language version), "renderer" (the renderer), "max texture units", "max texture size"
+Example configuration files can be found in the directory examples.
+Example video: http://www.youtube.com/watch?v=v2UDGgb6AgA
+Note: The library can only restrict the capabilities of a GPU, not "emulate" non supported extensions for
+example. If the gliar.conf contains an extension that is not supported by the user's real GPU, the library
+will return a warning and the user's program might crash.
--- /dev/null
+#!/bin/sh
+
+PREFIX=/usr/local
+
+while [ $# != 0 ]
+do
+ case $1 in
+ --prefix=*)
+ PREFIX=`echo $1 | sed 's/--prefix=//'`
+ ;;
+ esac
+ shift
+done
+
+echo PREFIX=$PREFIX > Makefile
+cat Makefile.in >> Makefile
--- /dev/null
+# example GLIAR configuration that emulates the asus eee GPU
+# copyright: Canonical Ltd, 2013
+# author: Eleni Maria Stea <elene.mst@gmail.com>
+#
+# Instructions:
+# Copy this file to ~/.gliar.conf or to gliar.conf in the
+# libgliar directory. Then run:
+# LD_PRELOAD=./libgliar.so <opengl_program_name>
+#
+
+[vendor]
+VMWare, Inc
+
+[renderer]
+Gallium 0.4 on llvmpipe (LLVM 0x301)
+
+[version]
+2.1 Mesa 9.0.2
+
+[sl version]
+1.20
+
+[extensions]
+GL_ARB_multisample
+GL_EXT_abgr
+GL_EXT_bgra
+GL_EXT_blend_color
+GL_EXT_blend_minmax
+GL_EXT_blend_subtract
+GL_EXT_copy_texture
+GL_EXT_polygon_offset
+GL_EXT_subtexture
+GL_EXT_texture_object
+GL_EXT_vertex_array
+GL_EXT_compiled_vertex_array
+GL_EXT_texture
+GL_EXT_texture3D
+GL_IBM_rasterpos_clip
+GL_ARB_point_parameters
+GL_EXT_draw_range_elements
+GL_EXT_packed_pixels
+GL_EXT_point_parameters
+GL_EXT_rescale_normal
+GL_EXT_separate_specular_color
+GL_EXT_texture_edge_clamp
+GL_SGIS_generate_mipmap
+GL_SGIS_texture_border_clamp
+GL_SGIS_texture_edge_clamp
+GL_SGIS_texture_lod
+GL_ARB_multitexture
+GL_IBM_multimode_draw_arrays
+GL_IBM_texture_mirrored_repeat
+GL_ARB_texture_cube_map
+GL_ARB_texture_env_add
+GL_ARB_transpose_matrix
+GL_EXT_blend_func_separate
+GL_EXT_fog_coord
+GL_EXT_multi_draw_arrays
+GL_EXT_secondary_color
+GL_EXT_texture_env_add
+GL_EXT_texture_lod_bias
+GL_INGR_blend_func_separate
+GL_NV_blend_square
+GL_NV_light_max_exponent
+GL_NV_texgen_reflection
+GL_NV_texture_env_combine4
+GL_S3_s3tc
+GL_SUN_multi_draw_arrays
+GL_ARB_texture_border_clamp
+GL_ARB_texture_compression
+GL_EXT_framebuffer_object
+GL_EXT_texture_compression_s3tc
+GL_EXT_texture_env_combine
+GL_EXT_texture_env_dot3
+GL_MESA_window_pos
+GL_NV_packed_depth_stencil
+GL_NV_texture_rectangle
+GL_ARB_depth_texture
+GL_ARB_occlusion_query
+GL_ARB_shadow
+GL_ARB_texture_env_combine
+GL_ARB_texture_env_crossbar
+GL_ARB_texture_env_dot3
+GL_ARB_texture_mirrored_repeat
+GL_ARB_window_pos
+GL_EXT_stencil_two_side
+GL_EXT_texture_cube_map
+GL_NV_fog_distance
+GL_APPLE_packed_pixels
+GL_APPLE_vertex_array_object
+GL_ARB_draw_buffers
+GL_ARB_fragment_program
+GL_ARB_fragment_shader
+GL_ARB_shader_objects
+GL_ARB_vertex_program
+GL_ARB_vertex_shader
+GL_ATI_draw_buffers
+GL_ATI_texture_env_combine3
+GL_ATI_texture_float
+GL_EXT_shadow_funcs
+GL_EXT_stencil_wrap
+GL_MESA_pack_invert
+GL_MESA_ycbcr_texture
+GL_NV_primitive_restart
+GL_ARB_fragment_program_shadow
+GL_ARB_half_float_pixel
+GL_ARB_occlusion_query2
+GL_ARB_point_sprite
+GL_ARB_shading_language_100
+GL_ARB_sync
+GL_ARB_texture_non_power_of_two
+GL_ARB_vertex_buffer_object
+GL_ATI_blend_equation_separate
+GL_EXT_blend_equation_separate
+GL_OES_read_format
+GL_ARB_pixel_buffer_object
+GL_ARB_texture_compression_rgtc
+GL_ARB_texture_float
+GL_ARB_texture_rectangle
+GL_ATI_texture_compression_3dc
+GL_EXT_packed_float
+GL_EXT_pixel_buffer_object
+GL_EXT_texture_compression_s3tc
+GL_EXT_texture_env_combine
+GL_EXT_texture_env_dot3
+GL_MESA_window_pos
+GL_NV_packed_depth_stencil
+GL_NV_texture_rectangle
+GL_ARB_depth_texture
+GL_ARB_occlusion_query
+GL_ARB_shadow
+GL_ARB_texture_env_combine
+GL_ARB_texture_env_crossbar
+GL_ARB_texture_env_dot3
+GL_ARB_texture_mirrored_repeat
+GL_ARB_window_pos
+GL_EXT_stencil_two_side
+GL_EXT_texture_cube_map
+GL_NV_fog_distance
+GL_APPLE_packed_pixels
+GL_APPLE_vertex_array_object
+GL_ARB_draw_buffers
+GL_ARB_fragment_program
+GL_ARB_fragment_shader
+GL_ARB_shader_objects
+GL_ARB_vertex_program
+GL_ARB_vertex_shader
+GL_ATI_draw_buffers
+GL_ATI_texture_env_combine3
+GL_ATI_texture_float
+GL_EXT_shadow_funcs
+GL_EXT_stencil_wrap
+GL_MESA_pack_invert
+GL_MESA_ycbcr_texture
+GL_NV_primitive_restart
+GL_ARB_fragment_program_shadow
+GL_ARB_half_float_pixel
+GL_ARB_occlusion_query2
+GL_ARB_point_sprite
+GL_ARB_shading_language_100
+GL_ARB_sync
+GL_ARB_texture_non_power_of_two
+GL_ARB_vertex_buffer_object
+GL_ATI_blend_equation_separate
+GL_EXT_blend_equation_separate
+GL_OES_read_format
+GL_ARB_pixel_buffer_object,
+GL_ARB_texture_compression_rgtc
+GL_ARB_texture_float,
+GL_ARB_texture_rectangle
+GL_ATI_texture_compression_3dc,
+GL_EXT_packed_float
+GL_EXT_pixel_buffer_object,
+GL_EXT_texture_compression_dxt1
+GL_EXT_texture_compression_rgtc,
+GL_EXT_texture_mirror_clamp
+GL_EXT_texture_rectangle,
+GL_EXT_texture_sRGB
+GL_EXT_texture_shared_exponent,
+GL_ARB_framebuffer_object
+GL_EXT_framebuffer_blit,
+GL_EXT_framebuffer_multisample
+GL_EXT_packed_depth_stencil,
+GL_ARB_vertex_array_object
+GL_ATI_separate_stencil,
+GL_ATI_texture_mirror_once
+GL_EXT_draw_buffers2
+GL_EXT_draw_instanced,
+GL_EXT_gpu_program_parameters
+GL_EXT_texture_compression_latc,
+GL_EXT_texture_sRGB_decode
+GL_OES_EGL_image
+GL_ARB_copy_buffer,
+GL_ARB_draw_instanced
+GL_ARB_half_float_vertex
+GL_ARB_instanced_arrays,
+GL_ARB_map_buffer_range
+GL_ARB_texture_rg
+GL_ARB_texture_swizzle,
+GL_ARB_vertex_array_bgra
+GL_EXT_separate_shader_objects,
+GL_EXT_texture_swizzle
+GL_EXT_vertex_array_bgra,
+GL_NV_conditional_render
+GL_AMD_draw_buffers_blend,
+GL_ARB_ES2_compatibility
+GL_ARB_debug_output
+GL_ARB_draw_buffers_blend,
+GL_ARB_draw_elements_base_vertex
+GL_ARB_explicit_attrib_location,
+GL_ARB_fragment_coord_conventions
+GL_ARB_provoking_vertex,
+GL_ARB_sampler_objects
+GL_ARB_shader_texture_lod,
+GL_ARB_vertex_type_2_10_10_10_rev
+GL_EXT_provoking_vertex,
+GL_EXT_texture_snorm
+GL_MESA_texture_signed_rgba
+GL_ARB_robustness,
+GL_ARB_texture_storage
+GL_ARB_invalidate_subdata
+
+[max texture size]
+8192
+
+[max texture units]
+8
--- /dev/null
+# example GLIAR configuration that emulates the lenovo T430 GPU
+# copyright: Canonical Ltd, 2013
+# author: Eleni Maria Stea <elene.mst@gmail.com>
+#
+# Instructions:
+# Copy this file to ~/.gliar.conf or to gliar.conf in the
+# libgliar directory. Then run:
+# LD_PRELOAD=./libgliar.so <opengl_program_name>
+#
+
+[vendor]
+Intel Open Source Technology Center
+
+[renderer]
+Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2
+
+[version]
+3.0 Mesa 9.0.2
+
+[sl version]
+1.30
+
+[extensions]
+GL_ARB_multisample
+GL_EXT_abgr
+GL_EXT_bgra
+GL_EXT_blend_color
+GL_EXT_blend_minmax
+GL_EXT_blend_subtract
+GL_EXT_copy_texture
+GL_EXT_polygon_offset
+GL_EXT_subtexture
+GL_EXT_texture_object
+GL_EXT_vertex_array
+GL_EXT_compiled_vertex_array
+GL_EXT_texture
+GL_EXT_texture3D
+GL_IBM_rasterpos_clip
+GL_ARB_point_parameters
+GL_EXT_draw_range_elements
+GL_EXT_packed_pixels
+GL_EXT_point_parameters
+GL_EXT_rescale_normal
+GL_EXT_separate_specular_color
+GL_EXT_texture_edge_clamp
+GL_SGIS_generate_mipmap
+GL_SGIS_texture_border_clamp
+GL_SGIS_texture_edge_clamp
+GL_SGIS_texture_lod
+GL_ARB_framebuffer_sRGB
+GL_ARB_multitexture
+GL_EXT_framebuffer_sRGB
+GL_IBM_multimode_draw_arrays
+GL_IBM_texture_mirrored_repeat
+GL_3DFX_texture_compression_FXT1
+GL_ARB_texture_cube_map
+GL_ARB_texture_env_add
+GL_ARB_transpose_matrix
+GL_EXT_blend_func_separate
+GL_EXT_fog_coord
+GL_EXT_multi_draw_arrays
+GL_EXT_secondary_color
+GL_EXT_texture_env_add
+GL_EXT_texture_filter_anisotropic
+GL_EXT_texture_lod_bias
+GL_INGR_blend_func_separate
+GL_NV_blend_square
+GL_NV_light_max_exponent
+GL_NV_texgen_reflection
+GL_NV_texture_env_combine4
+GL_S3_s3tc
+GL_SUN_multi_draw_arrays
+GL_ARB_texture_border_clamp
+GL_ARB_texture_compression
+GL_EXT_framebuffer_object
+GL_EXT_texture_compression_s3tc
+GL_EXT_texture_env_combine
+GL_EXT_texture_env_dot3
+GL_MESA_window_pos
+GL_NV_packed_depth_stencil
+GL_NV_texture_rectangle
+GL_NV_vertex_program
+GL_ARB_depth_texture
+GL_ARB_occlusion_query
+GL_ARB_shadow
+GL_ARB_texture_env_combine
+GL_ARB_texture_env_crossbar
+GL_ARB_texture_env_dot3
+GL_ARB_texture_mirrored_repeat
+GL_ARB_window_pos
+GL_ATI_envmap_bumpmap
+GL_EXT_stencil_two_side
+GL_EXT_texture_cube_map
+GL_NV_depth_clamp
+GL_NV_vertex_program1_1
+GL_APPLE_packed_pixels
+GL_APPLE_vertex_array_object
+GL_ARB_draw_buffers
+GL_ARB_fragment_program
+GL_ARB_fragment_shader
+GL_ARB_shader_objects
+GL_ARB_vertex_program
+GL_ARB_vertex_shader
+GL_ATI_draw_buffers
+GL_ATI_texture_env_combine3
+GL_ATI_texture_float
+GL_EXT_shadow_funcs
+GL_EXT_stencil_wrap
+GL_MESA_pack_invert
+GL_MESA_ycbcr_texture
+GL_NV_primitive_restart
+GL_ARB_depth_clamp
+GL_ARB_fragment_program_shadow
+GL_ARB_half_float_pixel
+GL_ARB_occlusion_query2
+GL_ARB_point_sprite
+GL_ARB_shading_language_100
+GL_ARB_sync
+GL_ARB_texture_non_power_of_two
+GL_ARB_vertex_buffer_object
+GL_ATI_blend_equation_separate
+GL_EXT_blend_equation_separate
+GL_OES_read_format
+GL_ARB_color_buffer_float
+GL_ARB_pixel_buffer_object
+GL_ARB_texture_compression_rgtc
+GL_ARB_texture_float
+GL_ARB_texture_rectangle
+GL_EXT_packed_float
+GL_EXT_pixel_buffer_object
+GL_EXT_texture_compression_dxt1
+GL_EXT_texture_compression_rgtc
+GL_EXT_texture_rectangle
+GL_EXT_texture_sRGB
+GL_EXT_texture_shared_exponent
+GL_ARB_framebuffer_object
+GL_EXT_framebuffer_blit
+GL_EXT_framebuffer_multisample
+GL_EXT_packed_depth_stencil
+GL_APPLE_object_purgeable
+GL_ARB_vertex_array_object
+GL_ATI_separate_stencil
+GL_EXT_draw_buffers2
+GL_EXT_draw_instanced
+GL_EXT_gpu_program_parameters
+GL_EXT_texture_array
+GL_EXT_texture_integer
+GL_EXT_texture_sRGB_decode
+GL_EXT_timer_query
+GL_OES_EGL_image
+GL_MESA_texture_array
+GL_ARB_copy_buffer
+GL_ARB_depth_buffer_float
+GL_ARB_draw_instanced
+GL_ARB_half_float_vertex
+GL_ARB_instanced_arrays
+GL_ARB_map_buffer_range
+GL_ARB_texture_rg
+GL_ARB_texture_swizzle
+GL_ARB_vertex_array_bgra
+GL_EXT_separate_shader_objects
+GL_EXT_texture_swizzle
+GL_EXT_vertex_array_bgra
+GL_NV_conditional_render
+GL_AMD_draw_buffers_blend
+GL_ARB_ES2_compatibility
+GL_ARB_blend_func_extended
+GL_ARB_debug_output
+GL_ARB_draw_buffers_blend
+GL_ARB_draw_elements_base_vertex
+GL_ARB_explicit_attrib_location
+GL_ARB_fragment_coord_conventions
+GL_ARB_provoking_vertex
+GL_ARB_sampler_objects
+GL_ARB_seamless_cube_map
+GL_ARB_shader_texture_lod
+GL_ARB_texture_rgb10_a2ui
+GL_ARB_uniform_buffer_object
+GL_EXT_provoking_vertex
+GL_EXT_texture_snorm
+GL_MESA_texture_signed_rgba
+GL_ARB_robustness
+GL_ARB_shader_bit_encoding
+GL_ARB_timer_query
+GL_ARB_texture_storage
+GL_EXT_transform_feedback
+GL_ARB_invalidate_subdata
+
+[max texture size]
+8192
+
+[max texture units]
+8
--- /dev/null
+#!/bin/sh
+
+LD_PRELOAD=libgliar.so $*
-[vendor]
-Mutant Stargoat
+# Example GLIAR configuration
+# Copyright: Canonical Ltd, 2013
+# Author: Eleni Maria Stea <elene.mst@gmail.com>
+#
+# Instructions:
+# Copy this file to ~/.gliar.conf or to gliar.conf in the
+# libgliar directory. Then run:
+# LD_PRELOAD=./libgliar.so <opengl_program_name>
+#
-[extensions]
-GL_MSG_hikiko_ext
-GL_ARB_multitexture
-GL_MSG_test
+[vendor]
+VMWare, Inc
[renderer]
-fake_mesa
+Gallium 0.4 on llvmpipe (LLVM 0x301)
+
+[version]
+2.1 Mesa 9.0.2
[sl version]
-fake_sl
+1.20
-[max texture units]
-2
+[extensions]
+GL_ARB_multisample
+GL_EXT_abgr
+GL_EXT_bgra
+GL_EXT_blend_color
+GL_EXT_blend_minmax
+GL_EXT_blend_subtract
+GL_EXT_copy_texture
+GL_EXT_polygon_offset
+GL_EXT_subtexture
+GL_EXT_texture_object
+GL_EXT_vertex_array
+GL_EXT_compiled_vertex_array
+GL_EXT_texture
+GL_EXT_texture3D
+GL_IBM_rasterpos_clip
+GL_ARB_point_parameters
+GL_EXT_draw_range_elements
+GL_EXT_packed_pixels
+GL_EXT_point_parameters
+GL_EXT_rescale_normal
+GL_EXT_separate_specular_color
+GL_EXT_texture_edge_clamp
+GL_SGIS_generate_mipmap
+GL_SGIS_texture_border_clamp
+GL_SGIS_texture_edge_clamp
+GL_SGIS_texture_lod
+GL_ARB_multitexture
+GL_IBM_multimode_draw_arrays
+GL_IBM_texture_mirrored_repeat
+GL_ARB_texture_cube_map
+GL_ARB_texture_env_add
+GL_ARB_transpose_matrix
+GL_EXT_blend_func_separate
+GL_EXT_fog_coord
+GL_EXT_multi_draw_arrays
+GL_EXT_secondary_color
+GL_EXT_texture_env_add
+GL_EXT_texture_lod_bias
+GL_INGR_blend_func_separate
+GL_NV_blend_square
+GL_NV_light_max_exponent
+GL_NV_texgen_reflection
+GL_NV_texture_env_combine4
+GL_S3_s3tc
+GL_SUN_multi_draw_arrays
+GL_ARB_texture_border_clamp
+GL_ARB_texture_compression
+GL_EXT_framebuffer_object
+GL_EXT_texture_compression_s3tc
+GL_EXT_texture_env_combine
+GL_EXT_texture_env_dot3
+GL_MESA_window_pos
+GL_NV_packed_depth_stencil
+GL_NV_texture_rectangle
+GL_ARB_depth_texture
+GL_ARB_occlusion_query
+GL_ARB_shadow
+GL_ARB_texture_env_combine
+GL_ARB_texture_env_crossbar
+GL_ARB_texture_env_dot3
+GL_ARB_texture_mirrored_repeat
+GL_ARB_window_pos
+GL_EXT_stencil_two_side
+GL_EXT_texture_cube_map
+GL_NV_fog_distance
+GL_APPLE_packed_pixels
+GL_APPLE_vertex_array_object
+GL_ARB_draw_buffers
+GL_ARB_fragment_program
+GL_ARB_fragment_shader
+GL_ARB_shader_objects
+GL_ARB_vertex_program
+GL_ARB_vertex_shader
+GL_ATI_draw_buffers
+GL_ATI_texture_env_combine3
+GL_ATI_texture_float
+GL_EXT_shadow_funcs
+GL_EXT_stencil_wrap
+GL_MESA_pack_invert
+GL_MESA_ycbcr_texture
+GL_NV_primitive_restart
+GL_ARB_fragment_program_shadow
+GL_ARB_half_float_pixel
+GL_ARB_occlusion_query2
+GL_ARB_point_sprite
+GL_ARB_shading_language_100
+GL_ARB_sync
+GL_ARB_texture_non_power_of_two
+GL_ARB_vertex_buffer_object
+GL_ATI_blend_equation_separate
+GL_EXT_blend_equation_separate
+GL_OES_read_format
+GL_ARB_pixel_buffer_object
+GL_ARB_texture_compression_rgtc
+GL_ARB_texture_float
+GL_ARB_texture_rectangle
+GL_ATI_texture_compression_3dc
+GL_EXT_packed_float
+GL_EXT_pixel_buffer_object
+GL_EXT_texture_compression_s3tc
+GL_EXT_texture_env_combine
+GL_EXT_texture_env_dot3
+GL_MESA_window_pos
+GL_NV_packed_depth_stencil
+GL_NV_texture_rectangle
+GL_ARB_depth_texture
+GL_ARB_occlusion_query
+GL_ARB_shadow
+GL_ARB_texture_env_combine
+GL_ARB_texture_env_crossbar
+GL_ARB_texture_env_dot3
+GL_ARB_texture_mirrored_repeat
+GL_ARB_window_pos
+GL_EXT_stencil_two_side
+GL_EXT_texture_cube_map
+GL_NV_fog_distance
+GL_APPLE_packed_pixels
+GL_APPLE_vertex_array_object
+GL_ARB_draw_buffers
+GL_ARB_fragment_program
+GL_ARB_fragment_shader
+GL_ARB_shader_objects
+GL_ARB_vertex_program
+GL_ARB_vertex_shader
+GL_ATI_draw_buffers
+GL_ATI_texture_env_combine3
+GL_ATI_texture_float
+GL_EXT_shadow_funcs
+GL_EXT_stencil_wrap
+GL_MESA_pack_invert
+GL_MESA_ycbcr_texture
+GL_NV_primitive_restart
+GL_ARB_fragment_program_shadow
+GL_ARB_half_float_pixel
+GL_ARB_occlusion_query2
+GL_ARB_point_sprite
+GL_ARB_shading_language_100
+GL_ARB_sync
+GL_ARB_texture_non_power_of_two
+GL_ARB_vertex_buffer_object
+GL_ATI_blend_equation_separate
+GL_EXT_blend_equation_separate
+GL_OES_read_format
+GL_ARB_pixel_buffer_object,
+GL_ARB_texture_compression_rgtc
+GL_ARB_texture_float,
+GL_ARB_texture_rectangle
+GL_ATI_texture_compression_3dc,
+GL_EXT_packed_float
+GL_EXT_pixel_buffer_object,
+GL_EXT_texture_compression_dxt1
+GL_EXT_texture_compression_rgtc,
+GL_EXT_texture_mirror_clamp
+GL_EXT_texture_rectangle,
+GL_EXT_texture_sRGB
+GL_EXT_texture_shared_exponent,
+GL_ARB_framebuffer_object
+GL_EXT_framebuffer_blit,
+GL_EXT_framebuffer_multisample
+GL_EXT_packed_depth_stencil,
+GL_ARB_vertex_array_object
+GL_ATI_separate_stencil,
+GL_ATI_texture_mirror_once
+GL_EXT_draw_buffers2
+GL_EXT_draw_instanced,
+GL_EXT_gpu_program_parameters
+GL_EXT_texture_compression_latc,
+GL_EXT_texture_sRGB_decode
+GL_OES_EGL_image
+GL_ARB_copy_buffer,
+GL_ARB_draw_instanced
+GL_ARB_half_float_vertex
+GL_ARB_instanced_arrays,
+GL_ARB_map_buffer_range
+GL_ARB_texture_rg
+GL_ARB_texture_swizzle,
+GL_ARB_vertex_array_bgra
+GL_EXT_separate_shader_objects,
+GL_EXT_texture_swizzle
+GL_EXT_vertex_array_bgra,
+GL_NV_conditional_render
+GL_AMD_draw_buffers_blend,
+GL_ARB_ES2_compatibility
+GL_ARB_debug_output
+GL_ARB_draw_buffers_blend,
+GL_ARB_draw_elements_base_vertex
+GL_ARB_explicit_attrib_location,
+GL_ARB_fragment_coord_conventions
+GL_ARB_provoking_vertex,
+GL_ARB_sampler_objects
+GL_ARB_shader_texture_lod,
+GL_ARB_vertex_type_2_10_10_10_rev
+GL_EXT_provoking_vertex,
+GL_EXT_texture_snorm
+GL_MESA_texture_signed_rgba
+GL_ARB_robustness,
+GL_ARB_texture_storage
+GL_ARB_invalidate_subdata
[max texture size]
-2048
+8192
+
+[max texture units]
+8