Blob Blame History Raw
--- lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h	2013-11-13 17:55:29.000000000 -0600
+++ lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h	2014-10-15 09:24:51.307589643 -0500
@@ -1,2591 +1,2597 @@
-// Copyright (C) 2002-2012 Nikolaus Gebhardt
-// This file is part of the "Irrlicht Engine".
-// For conditions of distribution and use, see copyright notice in Irrlicht.h
-
-#ifndef __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
-#define __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
-
-#include "IrrCompileConfig.h"
-#ifdef _IRR_COMPILE_WITH_OPENGL_
-
-#include "EDriverFeatures.h"
-#include "irrTypes.h"
-#include "os.h"
-
-#if defined(_IRR_WINDOWS_API_)
-	// include windows headers for HWND
-	#define WIN32_LEAN_AND_MEAN
-	#include <windows.h>
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#define GL_GLEXT_LEGACY 1
-	#endif
-	#include <GL/gl.h>
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#include "glext.h"
-	#endif
-	#include "wglext.h"
-
-	#ifdef _MSC_VER
-		#pragma comment(lib, "OpenGL32.lib")
-	#endif
-
-#elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
-	#include "CIrrDeviceMacOSX.h"
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#define GL_GLEXT_LEGACY 1
-	#endif
-	#include <OpenGL/gl.h>
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#include "glext.h"
-	#endif
-#elif defined(_IRR_COMPILE_WITH_SDL_DEVICE_) && !defined(_IRR_COMPILE_WITH_X11_DEVICE_)
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#define GL_GLEXT_LEGACY 1
-		#define GLX_GLXEXT_LEGACY 1
-	#else
-		#define GL_GLEXT_PROTOTYPES 1
-		#define GLX_GLXEXT_PROTOTYPES 1
-	#endif
-	#define NO_SDL_GLEXT
-	#include <SDL/SDL_video.h>
-	#include <SDL/SDL_opengl.h>
-	#include "glext.h"
-#else
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		#define GL_GLEXT_LEGACY 1
-		#define GLX_GLXEXT_LEGACY 1
-	#else
-		#define GL_GLEXT_PROTOTYPES 1
-		#define GLX_GLXEXT_PROTOTYPES 1
-	#endif
-	#include <GL/gl.h>
-	#include <GL/glx.h>
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-	#include "glext.h"
-	#undef GLX_ARB_get_proc_address // avoid problems with local glxext.h
-	#include "glxext.h"
-	#endif
-#endif
-
-#ifndef GL_ARB_shader_objects
-/* GL types for program/shader text and shader object handles */
-typedef char GLcharARB;
-typedef unsigned int GLhandleARB;
-#endif
-
-#ifndef GL_VERSION_2_0
-/* GL type for program/shader text */
-typedef char GLchar;
-#endif
-
-
-namespace irr
-{
-namespace video
-{
-
-
-static const char* const OpenGLFeatureStrings[] = {
-	"GL_3DFX_multisample",
-	"GL_3DFX_tbuffer",
-	"GL_3DFX_texture_compression_FXT1",
-	"GL_AMD_blend_minmax_factor",
-	"GL_AMD_conservative_depth",
-	"GL_AMD_debug_output",
-	"GL_AMD_depth_clamp_separate",
-	"GL_AMD_draw_buffers_blend",
-	"GL_AMD_multi_draw_indirect",
-	"GL_AMD_name_gen_delete",
-	"GL_AMD_performance_monitor",
-	"GL_AMD_sample_positions",
-	"GL_AMD_seamless_cubemap_per_texture",
-	"GL_AMD_shader_stencil_export",
-	"GL_AMD_texture_texture4",
-	"GL_AMD_transform_feedback3_lines_triangles",
-	"GL_AMD_vertex_shader_tesselator",
-	"GL_APPLE_aux_depth_stencil",
-	"GL_APPLE_client_storage",
-	"GL_APPLE_element_array",
-	"GL_APPLE_fence",
-	"GL_APPLE_float_pixels",
-	"GL_APPLE_flush_buffer_range",
-	"GL_APPLE_object_purgeable",
-	"GL_APPLE_rgb_422",
-	"GL_APPLE_row_bytes",
-	"GL_APPLE_specular_vector",
-	"GL_APPLE_texture_range",
-	"GL_APPLE_transform_hint",
-	"GL_APPLE_vertex_array_object",
-	"GL_APPLE_vertex_array_range",
-	"GL_APPLE_vertex_program_evaluators",
-	"GL_APPLE_ycbcr_422",
-	"GL_ARB_base_instance",
-	"GL_ARB_blend_func_extended",
-	"GL_ARB_cl_event",
-	"GL_ARB_color_buffer_float",
-	"GL_ARB_compatibility",
-	"GL_ARB_compressed_texture_pixel_storage",
-	"GL_ARB_conservative_depth",
-	"GL_ARB_copy_buffer",
-	"GL_ARB_debug_output",
-	"GL_ARB_depth_buffer_float",
-	"GL_ARB_depth_clamp",
-	"GL_ARB_depth_texture",
-	"GL_ARB_draw_buffers",
-	"GL_ARB_draw_buffers_blend",
-	"GL_ARB_draw_elements_base_vertex",
-	"GL_ARB_draw_indirect",
-	"GL_ARB_draw_instanced",
-	"GL_ARB_ES2_compatibility",
-	"GL_ARB_explicit_attrib_location",
-	"GL_ARB_fragment_coord_conventions",
-	"GL_ARB_fragment_program",
-	"GL_ARB_fragment_program_shadow",
-	"GL_ARB_fragment_shader",
-	"GL_ARB_framebuffer_object",
-	"GL_ARB_framebuffer_sRGB",
-	"GL_ARB_get_program_binary",
-	"GL_ARB_geometry_shader4",
-	"GL_ARB_gpu_shader5",
-	"GL_ARB_gpu_shader_fp64",
-	"GL_ARB_half_float_pixel",
-	"GL_ARB_half_float_vertex",
-	"GL_ARB_imaging",
-	"GL_ARB_instanced_arrays",
-	"GL_ARB_internalformat_query",
-	"GL_ARB_map_buffer_alignment",
-	"GL_ARB_map_buffer_range",
-	"GL_ARB_matrix_palette",
-	"GL_ARB_multisample",
-	"GL_ARB_multitexture",
-	"GL_ARB_occlusion_query",
-	"GL_ARB_occlusion_query2",
-	"GL_ARB_pixel_buffer_object",
-	"GL_ARB_point_parameters",
-	"GL_ARB_point_sprite",
-	"GL_ARB_provoking_vertex",
-	"GL_ARB_robustness",
-	"GL_ARB_sample_shading",
-	"GL_ARB_sampler_objects",
-	"GL_ARB_seamless_cube_map",
-	"GL_ARB_separate_shader_objects",
-	"GL_ARB_shader_atomic_counters",
-	"GL_ARB_shader_bit_encoding",
-	"GL_ARB_shader_image_load_store",
-	"GL_ARB_shader_objects",
-	"GL_ARB_shader_precision",
-	"GL_ARB_shader_stencil_export",
-	"GL_ARB_shader_subroutine",
-	"GL_ARB_shader_texture_lod",
-	"GL_ARB_shading_language_100",
-	"GL_ARB_shading_language_420pack",
-	"GL_ARB_shading_language_include",
-	"GL_ARB_shading_language_packing",
-	"GL_ARB_shadow",
-	"GL_ARB_shadow_ambient",
-	"GL_ARB_sync",
-	"GL_ARB_tessellation_shader",
-	"GL_ARB_texture_border_clamp",
-	"GL_ARB_texture_buffer_object",
-	"GL_ARB_texture_buffer_object_rgb32",
-	"GL_ARB_texture_compression",
-	"GL_ARB_texture_compression_bptc",
-	"GL_ARB_texture_compression_rgtc",
-	"GL_ARB_texture_cube_map",
-	"GL_ARB_texture_cube_map_array",
-	"GL_ARB_texture_env_add",
-	"GL_ARB_texture_env_combine",
-	"GL_ARB_texture_env_crossbar",
-	"GL_ARB_texture_env_dot3",
-	"GL_ARB_texture_float",
-	"GL_ARB_texture_gather",
-	"GL_ARB_texture_mirrored_repeat",
-	"GL_ARB_texture_multisample",
-	"GL_ARB_texture_non_power_of_two",
-	"GL_ARB_texture_query_lod",
-	"GL_ARB_texture_rectangle",
-	"GL_ARB_texture_rg",
-	"GL_ARB_texture_rgb10_a2ui",
-	"GL_ARB_texture_storage",
-	"GL_ARB_texture_swizzle",
-	"GL_ARB_timer_query",
-	"GL_ARB_transform_feedback2",
-	"GL_ARB_transform_feedback3",
-	"GL_ARB_transform_feedback_instanced",
-	"GL_ARB_transpose_matrix",
-	"GL_ARB_uniform_buffer_object",
-	"GL_ARB_vertex_array_bgra",
-	"GL_ARB_vertex_array_object",
-	"GL_ARB_vertex_attrib_64bit",
-	"GL_ARB_vertex_blend",
-	"GL_ARB_vertex_buffer_object",
-	"GL_ARB_vertex_program",
-	"GL_ARB_vertex_shader",
-	"GL_ARB_vertex_type_2_10_10_10_rev",
-	"GL_ARB_viewport_array",
-	"GL_ARB_window_pos",
-	"GL_ATI_draw_buffers",
-	"GL_ATI_element_array",
-	"GL_ATI_envmap_bumpmap",
-	"GL_ATI_fragment_shader",
-	"GL_ATI_map_object_buffer",
-	"GL_ATI_meminfo",
-	"GL_ATI_pixel_format_float",
-	"GL_ATI_pn_triangles",
-	"GL_ATI_separate_stencil",
-	"GL_ATI_text_fragment_shader",
-	"GL_ATI_texture_env_combine3",
-	"GL_ATI_texture_float",
-	"GL_ATI_texture_mirror_once",
-	"GL_ATI_vertex_array_object",
-	"GL_ATI_vertex_attrib_array_object",
-	"GL_ATI_vertex_streams",
-	"GL_EXT_422_pixels",
-	"GL_EXT_abgr",
-	"GL_EXT_bgra",
-	"GL_EXT_bindable_uniform",
-	"GL_EXT_blend_color",
-	"GL_EXT_blend_equation_separate",
-	"GL_EXT_blend_func_separate",
-	"GL_EXT_blend_logic_op",
-	"GL_EXT_blend_minmax",
-	"GL_EXT_blend_subtract",
-	"GL_EXT_clip_volume_hint",
-	"GL_EXT_cmyka",
-	"GL_EXT_color_subtable",
-	"GL_EXT_compiled_vertex_array",
-	"GL_EXT_convolution",
-	"GL_EXT_coordinate_frame",
-	"GL_EXT_copy_texture",
-	"GL_EXT_cull_vertex",
-	"GL_EXT_depth_bounds_test",
-	"GL_EXT_direct_state_access",
-	"GL_EXT_draw_buffers2",
-	"GL_EXT_draw_instanced",
-	"GL_EXT_draw_range_elements",
-	"GL_EXT_fog_coord",
-	"GL_EXT_framebuffer_blit",
-	"GL_EXT_framebuffer_multisample",
-	"GL_EXT_framebuffer_multisample_blit_scaled",
-	"GL_EXT_framebuffer_object",
-	"GL_EXT_framebuffer_sRGB",
-	"GL_EXT_geometry_shader4",
-	"GL_EXT_gpu_program_parameters",
-	"GL_EXT_gpu_shader4",
-	"GL_EXT_histogram",
-	"GL_EXT_index_array_formats",
-	"GL_EXT_index_func",
-	"GL_EXT_index_material",
-	"GL_EXT_index_texture",
-	"GL_EXT_light_texture",
-	"GL_EXT_misc_attribute",
-	"GL_EXT_multi_draw_arrays",
-	"GL_EXT_multisample",
-	"GL_EXT_packed_depth_stencil",
-	"GL_EXT_packed_float",
-	"GL_EXT_packed_pixels",
-	"GL_EXT_paletted_texture",
-	"GL_EXT_pixel_buffer_object",
-	"GL_EXT_pixel_transform",
-	"GL_EXT_pixel_transform_color_table",
-	"GL_EXT_point_parameters",
-	"GL_EXT_polygon_offset",
-	"GL_EXT_provoking_vertex",
-	"GL_EXT_rescale_normal",
-	"GL_EXT_secondary_color",
-	"GL_EXT_separate_shader_objects",
-	"GL_EXT_separate_specular_color",
-	"GL_EXT_shader_image_load_store",
-	"GL_EXT_shadow_funcs",
-	"GL_EXT_shared_texture_palette",
-	"GL_EXT_stencil_clear_tag",
-	"GL_EXT_stencil_two_side",
-	"GL_EXT_stencil_wrap",
-	"GL_EXT_subtexture",
-	"GL_EXT_texture",
-	"GL_EXT_texture3D",
-	"GL_EXT_texture_array",
-	"GL_EXT_texture_buffer_object",
-	"GL_EXT_texture_compression_latc",
-	"GL_EXT_texture_compression_rgtc",
-	"GL_EXT_texture_compression_s3tc",
-	"GL_EXT_texture_cube_map",
-	"GL_EXT_texture_env_add",
-	"GL_EXT_texture_env_combine",
-	"GL_EXT_texture_env_dot3",
-	"GL_EXT_texture_filter_anisotropic",
-	"GL_EXT_texture_integer",
-	"GL_EXT_texture_lod_bias",
-	"GL_EXT_texture_mirror_clamp",
-	"GL_EXT_texture_object",
-	"GL_EXT_texture_perturb_normal",
-	"GL_EXT_texture_shared_exponent",
-	"GL_EXT_texture_snorm",
-	"GL_EXT_texture_sRGB",
-	"GL_EXT_texture_sRGB_decode",
-	"GL_EXT_texture_swizzle",
-	"GL_EXT_timer_query",
-	"GL_EXT_transform_feedback",
-	"GL_EXT_vertex_array",
-	"GL_EXT_vertex_array_bgra",
-	"GL_EXT_vertex_attrib_64bit",
-	"GL_EXT_vertex_shader",
-	"GL_EXT_vertex_weighting",
-	"GL_EXT_x11_sync_object",
-	"GL_FfdMaskSGIX",
-	"GL_GREMEDY_frame_terminator",
-	"GL_GREMEDY_string_marker",
-	"GL_HP_convolution_border_modes",
-	"GL_HP_image_transform",
-	"GL_HP_occlusion_test",
-	"GL_HP_texture_lighting",
-	"GL_IBM_cull_vertex",
-	"GL_IBM_multimode_draw_arrays",
-	"GL_IBM_rasterpos_clip",
-	"GL_IBM_texture_mirrored_repeat",
-	"GL_IBM_vertex_array_lists",
-	"GL_INGR_blend_func_separate",
-	"GL_INGR_color_clamp",
-	"GL_INGR_interlace_read",
-	"GL_INGR_palette_buffer",
-	"GL_INTEL_parallel_arrays",
-	"GL_INTEL_texture_scissor",
-	"GL_MESA_pack_invert",
-	"GL_MESA_resize_buffers",
-	"GL_MESA_window_pos",
-	"GL_MESAX_texture_stack",
-	"GL_MESA_ycbcr_texture",
-	"GL_NV_blend_square",
-	"GL_NV_conditional_render",
-	"GL_NV_copy_depth_to_color",
-	"GL_NV_copy_image",
-	"GL_NV_depth_buffer_float",
-	"GL_NV_depth_clamp",
-	"GL_NV_evaluators",
-	"GL_NV_explicit_multisample",
-	"GL_NV_fence",
-	"GL_NV_float_buffer",
-	"GL_NV_fog_distance",
-	"GL_NV_fragment_program",
-	"GL_NV_fragment_program2",
-	"GL_NV_fragment_program4",
-	"GL_NV_fragment_program_option",
-	"GL_NV_framebuffer_multisample_coverage",
-	"GL_NV_geometry_program4",
-	"GL_NV_geometry_shader4",
-	"GL_NV_gpu_program4",
-	"GL_NV_gpu_program5",
-	"GL_NV_gpu_shader5",
-	"GL_NV_half_float",
-	"GL_NV_light_max_exponent",
-	"GL_NV_multisample_coverage",
-	"GL_NV_multisample_filter_hint",
-	"GL_NV_occlusion_query",
-	"GL_NV_packed_depth_stencil",
-	"GL_NV_parameter_buffer_object",
-	"GL_NV_parameter_buffer_object2",
-	"GL_NV_pixel_data_range",
-	"GL_NV_point_sprite",
-	"GL_NV_present_video",
-	"GL_NV_primitive_restart",
-	"GL_NV_register_combiners",
-	"GL_NV_register_combiners2",
-	"GL_NV_shader_buffer_load",
-	"GL_NV_shader_buffer_store",
-	"GL_NV_tessellation_program5",
-	"GL_NV_texgen_emboss",
-	"GL_NV_texgen_reflection",
-	"GL_NV_texture_barrier",
-	"GL_NV_texture_compression_vtc",
-	"GL_NV_texture_env_combine4",
-	"GL_NV_texture_expand_normal",
-	"GL_NV_texture_multisample",
-	"GL_NV_texture_rectangle",
-	"GL_NV_texture_shader",
-	"GL_NV_texture_shader2",
-	"GL_NV_texture_shader3",
-	"GL_NV_transform_feedback",
-	"GL_NV_transform_feedback2",
-	"GL_NV_vdpau_interop",
-	"GL_NV_vertex_array_range",
-	"GL_NV_vertex_array_range2",
-	"GL_NV_vertex_attrib_integer_64bit",
-	"GL_NV_vertex_buffer_unified_memory",
-	"GL_NV_vertex_program",
-	"GL_NV_vertex_program1_1",
-	"GL_NV_vertex_program2",
-	"GL_NV_vertex_program2_option",
-	"GL_NV_vertex_program3",
-	"GL_NV_vertex_program4",
-	"GL_NV_video_capture",
-	"GL_OES_read_format",
-	"GL_OML_interlace",
-	"GL_OML_resample",
-	"GL_OML_subsample",
-	"GL_PGI_misc_hints",
-	"GL_PGI_vertex_hints",
-	"GL_REND_screen_coordinates",
-	"GL_S3_s3tc",
-	"GL_SGI_color_matrix",
-	"GL_SGI_color_table",
-	"GL_SGI_depth_pass_instrument",
-	"GL_SGIS_detail_texture",
-	"GL_SGIS_fog_function",
-	"GL_SGIS_generate_mipmap",
-	"GL_SGIS_multisample",
-	"GL_SGIS_pixel_texture",
-	"GL_SGIS_point_line_texgen",
-	"GL_SGIS_point_parameters",
-	"GL_SGIS_sharpen_texture",
-	"GL_SGIS_texture4D",
-	"GL_SGIS_texture_border_clamp",
-	"GL_SGIS_texture_color_mask",
-	"GL_SGIS_texture_edge_clamp",
-	"GL_SGIS_texture_filter4",
-	"GL_SGIS_texture_lod",
-	"GL_SGIS_texture_select",
-	"GL_SGI_texture_color_table",
-	"GL_SGIX_async",
-	"GL_SGIX_async_histogram",
-	"GL_SGIX_async_pixel",
-	"GL_SGIX_blend_alpha_minmax",
-	"GL_SGIX_calligraphic_fragment",
-	"GL_SGIX_clipmap",
-	"GL_SGIX_convolution_accuracy",
-	"GL_SGIX_depth_pass_instrument",
-	"GL_SGIX_depth_texture",
-	"GL_SGIX_flush_raster",
-	"GL_SGIX_fog_offset",
-	"GL_SGIX_fog_scale",
-	"GL_SGIX_fragment_lighting",
-	"GL_SGIX_framezoom",
-	"GL_SGIX_igloo_interface",
-	"GL_SGIX_impact_pixel_texture",
-	"GL_SGIX_instruments",
-	"GL_SGIX_interlace",
-	"GL_SGIX_ir_instrument1",
-	"GL_SGIX_list_priority",
-	"GL_SGIX_pixel_texture",
-	"GL_SGIX_pixel_tiles",
-	"GL_SGIX_polynomial_ffd",
-	"GL_SGIX_reference_plane",
-	"GL_SGIX_resample",
-	"GL_SGIX_scalebias_hint",
-	"GL_SGIX_shadow",
-	"GL_SGIX_shadow_ambient",
-	"GL_SGIX_sprite",
-	"GL_SGIX_subsample",
-	"GL_SGIX_tag_sample_buffer",
-	"GL_SGIX_texture_add_env",
-	"GL_SGIX_texture_coordinate_clamp",
-	"GL_SGIX_texture_lod_bias",
-	"GL_SGIX_texture_multi_buffer",
-	"GL_SGIX_texture_scale_bias",
-	"GL_SGIX_texture_select",
-	"GL_SGIX_vertex_preclip",
-	"GL_SGIX_ycrcb",
-	"GL_SGIX_ycrcba",
-	"GL_SGIX_ycrcb_subsample",
-	"GL_SUN_convolution_border_modes",
-	"GL_SUN_global_alpha",
-	"GL_SUN_mesh_array",
-	"GL_SUN_slice_accum",
-	"GL_SUN_triangle_list",
-	"GL_SUN_vertex",
-	"GL_SUNX_constant_data",
-	"GL_WIN_phong_shading",
-	"GL_WIN_specular_fog",
-	// unofficial stuff
-	"GL_NVX_gpu_memory_info"
-};
-
-
-class COpenGLExtensionHandler
-{
-	public:
-	enum EOpenGLFeatures {
-		IRR_3DFX_multisample = 0,
-		IRR_3DFX_tbuffer,
-		IRR_3DFX_texture_compression_FXT1,
-		IRR_AMD_blend_minmax_factor,
-		IRR_AMD_conservative_depth,
-		IRR_AMD_debug_output,
-		IRR_AMD_depth_clamp_separate,
-		IRR_AMD_draw_buffers_blend,
-		IRR_AMD_multi_draw_indirect,
-		IRR_AMD_name_gen_delete,
-		IRR_AMD_performance_monitor,
-		IRR_AMD_sample_positions,
-		IRR_AMD_seamless_cubemap_per_texture,
-		IRR_AMD_shader_stencil_export,
-		IRR_AMD_texture_texture4,
-		IRR_AMD_transform_feedback3_lines_triangles,
-		IRR_AMD_vertex_shader_tesselator,
-		IRR_APPLE_aux_depth_stencil,
-		IRR_APPLE_client_storage,
-		IRR_APPLE_element_array,
-		IRR_APPLE_fence,
-		IRR_APPLE_float_pixels,
-		IRR_APPLE_flush_buffer_range,
-		IRR_APPLE_object_purgeable,
-		IRR_APPLE_rgb_422,
-		IRR_APPLE_row_bytes,
-		IRR_APPLE_specular_vector,
-		IRR_APPLE_texture_range,
-		IRR_APPLE_transform_hint,
-		IRR_APPLE_vertex_array_object,
-		IRR_APPLE_vertex_array_range,
-		IRR_APPLE_vertex_program_evaluators,
-		IRR_APPLE_ycbcr_422,
-		IRR_ARB_base_instance,
-		IRR_ARB_blend_func_extended,
-		IRR_ARB_cl_event,
-		IRR_ARB_color_buffer_float,
-		IRR_ARB_compatibility,
-		IRR_ARB_compressed_texture_pixel_storage,
-		IRR_ARB_conservative_depth,
-		IRR_ARB_copy_buffer,
-		IRR_ARB_debug_output,
-		IRR_ARB_depth_buffer_float,
-		IRR_ARB_depth_clamp,
-		IRR_ARB_depth_texture,
-		IRR_ARB_draw_buffers,
-		IRR_ARB_draw_buffers_blend,
-		IRR_ARB_draw_elements_base_vertex,
-		IRR_ARB_draw_indirect,
-		IRR_ARB_draw_instanced,
-		IRR_ARB_ES2_compatibility,
-		IRR_ARB_explicit_attrib_location,
-		IRR_ARB_fragment_coord_conventions,
-		IRR_ARB_fragment_program,
-		IRR_ARB_fragment_program_shadow,
-		IRR_ARB_fragment_shader,
-		IRR_ARB_framebuffer_object,
-		IRR_ARB_framebuffer_sRGB,
-		IRR_ARB_get_program_binary,
-		IRR_ARB_geometry_shader4,
-		IRR_ARB_gpu_shader5,
-		IRR_ARB_gpu_shader_fp64,
-		IRR_ARB_half_float_pixel,
-		IRR_ARB_half_float_vertex,
-		IRR_ARB_imaging,
-		IRR_ARB_instanced_arrays,
-		IRR_ARB_internalformat_query,
-		IRR_ARB_map_buffer_alignment,
-		IRR_ARB_map_buffer_range,
-		IRR_ARB_matrix_palette,
-		IRR_ARB_multisample,
-		IRR_ARB_multitexture,
-		IRR_ARB_occlusion_query,
-		IRR_ARB_occlusion_query2,
-		IRR_ARB_pixel_buffer_object,
-		IRR_ARB_point_parameters,
-		IRR_ARB_point_sprite,
-		IRR_ARB_provoking_vertex,
-		IRR_ARB_robustness,
-		IRR_ARB_sample_shading,
-		IRR_ARB_sampler_objects,
-		IRR_ARB_seamless_cube_map,
-		IRR_ARB_separate_shader_objects,
-		IRR_ARB_shader_atomic_counters,
-		IRR_ARB_shader_bit_encoding,
-		IRR_ARB_shader_image_load_store,
-		IRR_ARB_shader_objects,
-		IRR_ARB_shader_precision,
-		IRR_ARB_shader_stencil_export,
-		IRR_ARB_shader_subroutine,
-		IRR_ARB_shader_texture_lod,
-		IRR_ARB_shading_language_100,
-		IRR_ARB_shading_language_420pack,
-		IRR_ARB_shading_language_include,
-		IRR_ARB_shading_language_packing,
-		IRR_ARB_shadow,
-		IRR_ARB_shadow_ambient,
-		IRR_ARB_sync,
-		IRR_ARB_tessellation_shader,
-		IRR_ARB_texture_border_clamp,
-		IRR_ARB_texture_buffer_object,
-		IRR_ARB_texture_buffer_object_rgb32,
-		IRR_ARB_texture_compression,
-		IRR_ARB_texture_compression_bptc,
-		IRR_ARB_texture_compression_rgtc,
-		IRR_ARB_texture_cube_map,
-		IRR_ARB_texture_cube_map_array,
-		IRR_ARB_texture_env_add,
-		IRR_ARB_texture_env_combine,
-		IRR_ARB_texture_env_crossbar,
-		IRR_ARB_texture_env_dot3,
-		IRR_ARB_texture_float,
-		IRR_ARB_texture_gather,
-		IRR_ARB_texture_mirrored_repeat,
-		IRR_ARB_texture_multisample,
-		IRR_ARB_texture_non_power_of_two,
-		IRR_ARB_texture_query_lod,
-		IRR_ARB_texture_rectangle,
-		IRR_ARB_texture_rg,
-		IRR_ARB_texture_rgb10_a2ui,
-		IRR_ARB_texture_storage,
-		IRR_ARB_texture_swizzle,
-		IRR_ARB_timer_query,
-		IRR_ARB_transform_feedback2,
-		IRR_ARB_transform_feedback3,
-		IRR_ARB_transform_feedback_instanced,
-		IRR_ARB_transpose_matrix,
-		IRR_ARB_uniform_buffer_object,
-		IRR_ARB_vertex_array_bgra,
-		IRR_ARB_vertex_array_object,
-		IRR_ARB_vertex_attrib_64bit,
-		IRR_ARB_vertex_blend,
-		IRR_ARB_vertex_buffer_object,
-		IRR_ARB_vertex_program,
-		IRR_ARB_vertex_shader,
-		IRR_ARB_vertex_type_2_10_10_10_rev,
-		IRR_ARB_viewport_array,
-		IRR_ARB_window_pos,
-		IRR_ATI_draw_buffers,
-		IRR_ATI_element_array,
-		IRR_ATI_envmap_bumpmap,
-		IRR_ATI_fragment_shader,
-		IRR_ATI_map_object_buffer,
-		IRR_ATI_meminfo,
-		IRR_ATI_pixel_format_float,
-		IRR_ATI_pn_triangles,
-		IRR_ATI_separate_stencil,
-		IRR_ATI_text_fragment_shader,
-		IRR_ATI_texture_env_combine3,
-		IRR_ATI_texture_float,
-		IRR_ATI_texture_mirror_once,
-		IRR_ATI_vertex_array_object,
-		IRR_ATI_vertex_attrib_array_object,
-		IRR_ATI_vertex_streams,
-		IRR_EXT_422_pixels,
-		IRR_EXT_abgr,
-		IRR_EXT_bgra,
-		IRR_EXT_bindable_uniform,
-		IRR_EXT_blend_color,
-		IRR_EXT_blend_equation_separate,
-		IRR_EXT_blend_func_separate,
-		IRR_EXT_blend_logic_op,
-		IRR_EXT_blend_minmax,
-		IRR_EXT_blend_subtract,
-		IRR_EXT_clip_volume_hint,
-		IRR_EXT_cmyka,
-		IRR_EXT_color_subtable,
-		IRR_EXT_compiled_vertex_array,
-		IRR_EXT_convolution,
-		IRR_EXT_coordinate_frame,
-		IRR_EXT_copy_texture,
-		IRR_EXT_cull_vertex,
-		IRR_EXT_depth_bounds_test,
-		IRR_EXT_direct_state_access,
-		IRR_EXT_draw_buffers2,
-		IRR_EXT_draw_instanced,
-		IRR_EXT_draw_range_elements,
-		IRR_EXT_fog_coord,
-		IRR_EXT_framebuffer_blit,
-		IRR_EXT_framebuffer_multisample,
-		IRR_EXT_framebuffer_multisample_blit_scaled,
-		IRR_EXT_framebuffer_object,
-		IRR_EXT_framebuffer_sRGB,
-		IRR_EXT_geometry_shader4,
-		IRR_EXT_gpu_program_parameters,
-		IRR_EXT_gpu_shader4,
-		IRR_EXT_histogram,
-		IRR_EXT_index_array_formats,
-		IRR_EXT_index_func,
-		IRR_EXT_index_material,
-		IRR_EXT_index_texture,
-		IRR_EXT_light_texture,
-		IRR_EXT_misc_attribute,
-		IRR_EXT_multi_draw_arrays,
-		IRR_EXT_multisample,
-		IRR_EXT_packed_depth_stencil,
-		IRR_EXT_packed_float,
-		IRR_EXT_packed_pixels,
-		IRR_EXT_paletted_texture,
-		IRR_EXT_pixel_buffer_object,
-		IRR_EXT_pixel_transform,
-		IRR_EXT_pixel_transform_color_table,
-		IRR_EXT_point_parameters,
-		IRR_EXT_polygon_offset,
-		IRR_EXT_provoking_vertex,
-		IRR_EXT_rescale_normal,
-		IRR_EXT_secondary_color,
-		IRR_EXT_separate_shader_objects,
-		IRR_EXT_separate_specular_color,
-		IRR_EXT_shader_image_load_store,
-		IRR_EXT_shadow_funcs,
-		IRR_EXT_shared_texture_palette,
-		IRR_EXT_stencil_clear_tag,
-		IRR_EXT_stencil_two_side,
-		IRR_EXT_stencil_wrap,
-		IRR_EXT_subtexture,
-		IRR_EXT_texture,
-		IRR_EXT_texture3D,
-		IRR_EXT_texture_array,
-		IRR_EXT_texture_buffer_object,
-		IRR_EXT_texture_compression_latc,
-		IRR_EXT_texture_compression_rgtc,
-		IRR_EXT_texture_compression_s3tc,
-		IRR_EXT_texture_cube_map,
-		IRR_EXT_texture_env_add,
-		IRR_EXT_texture_env_combine,
-		IRR_EXT_texture_env_dot3,
-		IRR_EXT_texture_filter_anisotropic,
-		IRR_EXT_texture_integer,
-		IRR_EXT_texture_lod_bias,
-		IRR_EXT_texture_mirror_clamp,
-		IRR_EXT_texture_object,
-		IRR_EXT_texture_perturb_normal,
-		IRR_EXT_texture_shared_exponent,
-		IRR_EXT_texture_snorm,
-		IRR_EXT_texture_sRGB,
-		IRR_EXT_texture_sRGB_decode,
-		IRR_EXT_texture_swizzle,
-		IRR_EXT_timer_query,
-		IRR_EXT_transform_feedback,
-		IRR_EXT_vertex_array,
-		IRR_EXT_vertex_array_bgra,
-		IRR_EXT_vertex_attrib_64bit,
-		IRR_EXT_vertex_shader,
-		IRR_EXT_vertex_weighting,
-		IRR_EXT_x11_sync_object,
-		IRR_FfdMaskSGIX,
-		IRR_GREMEDY_frame_terminator,
-		IRR_GREMEDY_string_marker,
-		IRR_HP_convolution_border_modes,
-		IRR_HP_image_transform,
-		IRR_HP_occlusion_test,
-		IRR_HP_texture_lighting,
-		IRR_IBM_cull_vertex,
-		IRR_IBM_multimode_draw_arrays,
-		IRR_IBM_rasterpos_clip,
-		IRR_IBM_texture_mirrored_repeat,
-		IRR_IBM_vertex_array_lists,
-		IRR_INGR_blend_func_separate,
-		IRR_INGR_color_clamp,
-		IRR_INGR_interlace_read,
-		IRR_INGR_palette_buffer,
-		IRR_INTEL_parallel_arrays,
-		IRR_INTEL_texture_scissor,
-		IRR_MESA_pack_invert,
-		IRR_MESA_resize_buffers,
-		IRR_MESA_window_pos,
-		IRR_MESAX_texture_stack,
-		IRR_MESA_ycbcr_texture,
-		IRR_NV_blend_square,
-		IRR_NV_conditional_render,
-		IRR_NV_copy_depth_to_color,
-		IRR_NV_copy_image,
-		IRR_NV_depth_buffer_float,
-		IRR_NV_depth_clamp,
-		IRR_NV_evaluators,
-		IRR_NV_explicit_multisample,
-		IRR_NV_fence,
-		IRR_NV_float_buffer,
-		IRR_NV_fog_distance,
-		IRR_NV_fragment_program,
-		IRR_NV_fragment_program2,
-		IRR_NV_fragment_program4,
-		IRR_NV_fragment_program_option,
-		IRR_NV_framebuffer_multisample_coverage,
-		IRR_NV_geometry_program4,
-		IRR_NV_geometry_shader4,
-		IRR_NV_gpu_program4,
-		IRR_NV_gpu_program5,
-		IRR_NV_gpu_shader5,
-		IRR_NV_half_float,
-		IRR_NV_light_max_exponent,
-		IRR_NV_multisample_coverage,
-		IRR_NV_multisample_filter_hint,
-		IRR_NV_occlusion_query,
-		IRR_NV_packed_depth_stencil,
-		IRR_NV_parameter_buffer_object,
-		IRR_NV_parameter_buffer_object2,
-		IRR_NV_pixel_data_range,
-		IRR_NV_point_sprite,
-		IRR_NV_present_video,
-		IRR_NV_primitive_restart,
-		IRR_NV_register_combiners,
-		IRR_NV_register_combiners2,
-		IRR_NV_shader_buffer_load,
-		IRR_NV_shader_buffer_store,
-		IRR_NV_tessellation_program5,
-		IRR_NV_texgen_emboss,
-		IRR_NV_texgen_reflection,
-		IRR_NV_texture_barrier,
-		IRR_NV_texture_compression_vtc,
-		IRR_NV_texture_env_combine4,
-		IRR_NV_texture_expand_normal,
-		IRR_NV_texture_multisample,
-		IRR_NV_texture_rectangle,
-		IRR_NV_texture_shader,
-		IRR_NV_texture_shader2,
-		IRR_NV_texture_shader3,
-		IRR_NV_transform_feedback,
-		IRR_NV_transform_feedback2,
-		IRR_NV_vdpau_interop,
-		IRR_NV_vertex_array_range,
-		IRR_NV_vertex_array_range2,
-		IRR_NV_vertex_attrib_integer_64bit,
-		IRR_NV_vertex_buffer_unified_memory,
-		IRR_NV_vertex_program,
-		IRR_NV_vertex_program1_1,
-		IRR_NV_vertex_program2,
-		IRR_NV_vertex_program2_option,
-		IRR_NV_vertex_program3,
-		IRR_NV_vertex_program4,
-		IRR_NV_video_capture,
-		IRR_OES_read_format,
-		IRR_OML_interlace,
-		IRR_OML_resample,
-		IRR_OML_subsample,
-		IRR_PGI_misc_hints,
-		IRR_PGI_vertex_hints,
-		IRR_REND_screen_coordinates,
-		IRR_S3_s3tc,
-		IRR_SGI_color_matrix,
-		IRR_SGI_color_table,
-		IRR_SGI_depth_pass_instrument,
-		IRR_SGIS_detail_texture,
-		IRR_SGIS_fog_function,
-		IRR_SGIS_generate_mipmap,
-		IRR_SGIS_multisample,
-		IRR_SGIS_pixel_texture,
-		IRR_SGIS_point_line_texgen,
-		IRR_SGIS_point_parameters,
-		IRR_SGIS_sharpen_texture,
-		IRR_SGIS_texture4D,
-		IRR_SGIS_texture_border_clamp,
-		IRR_SGIS_texture_color_mask,
-		IRR_SGIS_texture_edge_clamp,
-		IRR_SGIS_texture_filter4,
-		IRR_SGIS_texture_lod,
-		IRR_SGIS_texture_select,
-		IRR_SGI_texture_color_table,
-		IRR_SGIX_async,
-		IRR_SGIX_async_histogram,
-		IRR_SGIX_async_pixel,
-		IRR_SGIX_blend_alpha_minmax,
-		IRR_SGIX_calligraphic_fragment,
-		IRR_SGIX_clipmap,
-		IRR_SGIX_convolution_accuracy,
-		IRR_SGIX_depth_pass_instrument,
-		IRR_SGIX_depth_texture,
-		IRR_SGIX_flush_raster,
-		IRR_SGIX_fog_offset,
-		IRR_SGIX_fog_scale,
-		IRR_SGIX_fragment_lighting,
-		IRR_SGIX_framezoom,
-		IRR_SGIX_igloo_interface,
-		IRR_SGIX_impact_pixel_texture,
-		IRR_SGIX_instruments,
-		IRR_SGIX_interlace,
-		IRR_SGIX_ir_instrument1,
-		IRR_SGIX_list_priority,
-		IRR_SGIX_pixel_texture,
-		IRR_SGIX_pixel_tiles,
-		IRR_SGIX_polynomial_ffd,
-		IRR_SGIX_reference_plane,
-		IRR_SGIX_resample,
-		IRR_SGIX_scalebias_hint,
-		IRR_SGIX_shadow,
-		IRR_SGIX_shadow_ambient,
-		IRR_SGIX_sprite,
-		IRR_SGIX_subsample,
-		IRR_SGIX_tag_sample_buffer,
-		IRR_SGIX_texture_add_env,
-		IRR_SGIX_texture_coordinate_clamp,
-		IRR_SGIX_texture_lod_bias,
-		IRR_SGIX_texture_multi_buffer,
-		IRR_SGIX_texture_scale_bias,
-		IRR_SGIX_texture_select,
-		IRR_SGIX_vertex_preclip,
-		IRR_SGIX_ycrcb,
-		IRR_SGIX_ycrcba,
-		IRR_SGIX_ycrcb_subsample,
-		IRR_SUN_convolution_border_modes,
-		IRR_SUN_global_alpha,
-		IRR_SUN_mesh_array,
-		IRR_SUN_slice_accum,
-		IRR_SUN_triangle_list,
-		IRR_SUN_vertex,
-		IRR_SUNX_constant_data,
-		IRR_WIN_phong_shading,
-		IRR_WIN_specular_fog,
-		IRR_NVX_gpu_memory_info,
-		IRR_OpenGL_Feature_Count
-	};
-
-
-	// constructor
-	COpenGLExtensionHandler();
-
-	// deferred initialization
-	void initExtensions(bool stencilBuffer);
-
-	//! queries the features of the driver, returns true if feature is available
-	bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const;
-
-	//! queries the features of the driver, returns true if feature is available
-	bool queryOpenGLFeature(EOpenGLFeatures feature) const
-	{
-		return FeatureAvailable[feature];
-	}
-
-	//! show all features with availablity
-	void dump() const;
-
-	void dumpFramebufferFormats() const;
-
-	// Some variables for properties
-	bool StencilBuffer;
-	bool MultiTextureExtension;
-	bool TextureCompressionExtension;
-
-	// Some non-boolean properties
-	//! Maxmimum texture layers supported by the fixed pipeline
-	u8 MaxSupportedTextures;
-	//! Maxmimum texture layers supported by the engine
-	u8 MaxTextureUnits;
-	//! Maximum hardware lights supported
-	u8 MaxLights;
-	//! Maximal Anisotropy
-	u8 MaxAnisotropy;
-	//! Number of user clipplanes
-	u8 MaxUserClipPlanes;
-	//! Number of auxiliary buffers
-	u8 MaxAuxBuffers;
-	//! Number of rendertargets available as MRTs
-	u8 MaxMultipleRenderTargets;
-	//! Optimal number of indices per meshbuffer
-	u32 MaxIndices;
-	//! Maximal texture dimension
-	u32 MaxTextureSize;
-	//! Maximal vertices handled by geometry shaders
-	u32 MaxGeometryVerticesOut;
-	//! Maximal LOD Bias
-	f32 MaxTextureLODBias;
-	//! Minimal and maximal supported thickness for lines without smoothing
-	GLfloat DimAliasedLine[2];
-	//! Minimal and maximal supported thickness for points without smoothing
-	GLfloat DimAliasedPoint[2];
-	//! Minimal and maximal supported thickness for lines with smoothing
-	GLfloat DimSmoothedLine[2];
-	//! Minimal and maximal supported thickness for points with smoothing
-	GLfloat DimSmoothedPoint[2];
-
-	//! OpenGL version as Integer: 100*Major+Minor, i.e. 2.1 becomes 201
-	u16 Version;
-	//! GLSL version as Integer: 100*Major+Minor
-	u16 ShaderLanguageVersion;
-
-	bool OcclusionQuerySupport;
-
-	// public access to the (loaded) extensions.
-	// general functions
-	void extGlActiveTexture(GLenum texture);
-	void extGlClientActiveTexture(GLenum texture);
-	void extGlPointParameterf(GLint loc, GLfloat f);
-	void extGlPointParameterfv(GLint loc, const GLfloat *v);
-	void extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-	void extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-	void extGlCompressedTexImage2D(GLenum target, GLint level,
-		GLenum internalformat, GLsizei width, GLsizei height,
-		GLint border, GLsizei imageSize, const void* data);
-
-	// shader programming
-	void extGlGenPrograms(GLsizei n, GLuint *programs);
-	void extGlBindProgram(GLenum target, GLuint program);
-	void extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
-	void extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string);
-	void extGlDeletePrograms(GLsizei n, const GLuint *programs);
-	void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);
-	GLhandleARB extGlCreateShaderObject(GLenum shaderType);
-	GLuint extGlCreateShader(GLenum shaderType);
-	// note: Due to the type confusion between shader_objects and OpenGL 2.0
-	// we have to add the ARB extension for proper method definitions in case
-	// that handleARB and uint are the same type
-	void extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
-	void extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
-	// note: Due to the type confusion between shader_objects and OpenGL 2.0
-	// we have to add the ARB extension for proper method definitions in case
-	// that handleARB and uint are the same type
-	void extGlCompileShaderARB(GLhandleARB shader);
-	void extGlCompileShader(GLuint shader);
-	GLhandleARB extGlCreateProgramObject(void);
-	GLuint extGlCreateProgram(void);
-	void extGlAttachObject(GLhandleARB program, GLhandleARB shader);
-	void extGlAttachShader(GLuint program, GLuint shader);
-	void extGlLinkProgramARB(GLhandleARB program);
-	// note: Due to the type confusion between shader_objects and OpenGL 2.0
-	// we have to add the ARB extension for proper method definitions in case
-	// that handleARB and uint are the same type
-	void extGlLinkProgram(GLuint program);
-	void extGlUseProgramObject(GLhandleARB prog);
-	void extGlUseProgram(GLuint prog);
-	void extGlDeleteObject(GLhandleARB object);
-	void extGlDeleteProgram(GLuint object);
-	void extGlDeleteShader(GLuint shader);
-	void extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-	void extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders);
-	void extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
-	void extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
-	void extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
-	void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param);
-	void extGlGetShaderiv(GLuint shader, GLenum type, GLint *param);
-	void extGlGetProgramiv(GLuint program, GLenum type, GLint *param);
-	GLint extGlGetUniformLocationARB(GLhandleARB program, const char *name);
-	GLint extGlGetUniformLocation(GLuint program, const char *name);
-	void extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v);
-	void extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v);
-	void extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v);
-	void extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v);
-	void extGlUniform1bv(GLint loc, GLsizei count, const bool *v);
-	void extGlUniform2bv(GLint loc, GLsizei count, const bool *v);
-	void extGlUniform3bv(GLint loc, GLsizei count, const bool *v);
-	void extGlUniform4bv(GLint loc, GLsizei count, const bool *v);
-	void extGlUniform1iv(GLint loc, GLsizei count, const GLint *v);
-	void extGlUniform2iv(GLint loc, GLsizei count, const GLint *v);
-	void extGlUniform3iv(GLint loc, GLsizei count, const GLint *v);
-	void extGlUniform4iv(GLint loc, GLsizei count, const GLint *v);
-	void extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
-	void extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
-	void extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
-	void extGlGetActiveUniformARB(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
-	void extGlGetActiveUniform(GLuint program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-
-	// framebuffer objects
-	void extGlBindFramebuffer(GLenum target, GLuint framebuffer);
-	void extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
-	void extGlGenFramebuffers(GLsizei n, GLuint *framebuffers);
-	GLenum extGlCheckFramebufferStatus(GLenum target);
-	void extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-	void extGlBindRenderbuffer(GLenum target, GLuint renderbuffer);
-	void extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
-	void extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
-	void extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-	void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-	void extGlGenerateMipmap(GLenum target);
-	void extGlActiveStencilFace(GLenum face);
-	void extGlDrawBuffers(GLsizei n, const GLenum *bufs);
-
-	// vertex buffer object
-	void extGlGenBuffers(GLsizei n, GLuint *buffers);
-	void extGlBindBuffer(GLenum target, GLuint buffer);
-	void extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
-	void extGlDeleteBuffers(GLsizei n, const GLuint *buffers);
-	void extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
-	void extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
-	void *extGlMapBuffer (GLenum target, GLenum access);
-	GLboolean extGlUnmapBuffer (GLenum target);
-	GLboolean extGlIsBuffer (GLuint buffer);
-	void extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
-	void extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params);
-	void extGlProvokingVertex(GLenum mode);
-	void extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
-	void extGlEnableIndexed(GLenum target, GLuint index);
-	void extGlDisableIndexed(GLenum target, GLuint index);
-	void extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst);
-	void extGlBlendEquationIndexed(GLuint buf, GLenum mode);
-	void extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value);
-
-	// occlusion query
-	void extGlGenQueries(GLsizei n, GLuint *ids);
-	void extGlDeleteQueries(GLsizei n, const GLuint *ids);
-	GLboolean extGlIsQuery(GLuint id);
-	void extGlBeginQuery(GLenum target, GLuint id);
-	void extGlEndQuery(GLenum target);
-	void extGlGetQueryiv(GLenum target, GLenum pname, GLint *params);
-	void extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
-	void extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
-
-	// generic vsync setting method for several extensions
-	void extGlSwapInterval(int interval);
-
-	// blend operations
-	void extGlBlendEquation(GLenum mode);
-
-	// the global feature array
-	bool FeatureAvailable[IRR_OpenGL_Feature_Count];
-
-	protected:
-	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-		PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB;
-		PFNGLCLIENTACTIVETEXTUREARBPROC	pGlClientActiveTextureARB;
-		PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;
-		PFNGLGENPROGRAMSNVPROC pGlGenProgramsNV;
-		PFNGLBINDPROGRAMARBPROC pGlBindProgramARB;
-		PFNGLBINDPROGRAMNVPROC pGlBindProgramNV;
-		PFNGLDELETEPROGRAMSARBPROC pGlDeleteProgramsARB;
-		PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsNV;
-		PFNGLPROGRAMSTRINGARBPROC pGlProgramStringARB;
-		PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;
-		PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;
-		PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;
-		PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;
-		PFNGLCOMPILESHADERARBPROC pGlCompileShaderARB;
-		PFNGLCREATEPROGRAMOBJECTARBPROC pGlCreateProgramObjectARB;
-		PFNGLATTACHOBJECTARBPROC pGlAttachObjectARB;
-		PFNGLLINKPROGRAMARBPROC pGlLinkProgramARB;
-		PFNGLUSEPROGRAMOBJECTARBPROC pGlUseProgramObjectARB;
-		PFNGLDELETEOBJECTARBPROC pGlDeleteObjectARB;
-		PFNGLCREATEPROGRAMPROC pGlCreateProgram;
-		PFNGLUSEPROGRAMPROC pGlUseProgram;
-		PFNGLDELETEPROGRAMPROC pGlDeleteProgram;
-		PFNGLDELETESHADERPROC pGlDeleteShader;
-		PFNGLGETATTACHEDOBJECTSARBPROC pGlGetAttachedObjectsARB;
-		PFNGLGETATTACHEDSHADERSPROC pGlGetAttachedShaders;
-		PFNGLCREATESHADERPROC pGlCreateShader;
-		PFNGLSHADERSOURCEPROC pGlShaderSource;
-		PFNGLCOMPILESHADERPROC pGlCompileShader;
-		PFNGLATTACHSHADERPROC pGlAttachShader;
-		PFNGLLINKPROGRAMPROC pGlLinkProgram;
-		PFNGLGETINFOLOGARBPROC pGlGetInfoLogARB;
-		PFNGLGETSHADERINFOLOGPROC pGlGetShaderInfoLog;
-		PFNGLGETPROGRAMINFOLOGPROC pGlGetProgramInfoLog;
-		PFNGLGETOBJECTPARAMETERIVARBPROC pGlGetObjectParameterivARB;
-		PFNGLGETSHADERIVPROC pGlGetShaderiv;
-		PFNGLGETSHADERIVPROC pGlGetProgramiv;
-		PFNGLGETUNIFORMLOCATIONARBPROC pGlGetUniformLocationARB;
-		PFNGLGETUNIFORMLOCATIONPROC pGlGetUniformLocation;
-		PFNGLUNIFORM1FVARBPROC pGlUniform1fvARB;
-		PFNGLUNIFORM2FVARBPROC pGlUniform2fvARB;
-		PFNGLUNIFORM3FVARBPROC pGlUniform3fvARB;
-		PFNGLUNIFORM4FVARBPROC pGlUniform4fvARB;
-		PFNGLUNIFORM1IVARBPROC pGlUniform1ivARB;
-		PFNGLUNIFORM2IVARBPROC pGlUniform2ivARB;
-		PFNGLUNIFORM3IVARBPROC pGlUniform3ivARB;
-		PFNGLUNIFORM4IVARBPROC pGlUniform4ivARB;
-		PFNGLUNIFORMMATRIX2FVARBPROC pGlUniformMatrix2fvARB;
-		PFNGLUNIFORMMATRIX3FVARBPROC pGlUniformMatrix3fvARB;
-		PFNGLUNIFORMMATRIX4FVARBPROC pGlUniformMatrix4fvARB;
-		PFNGLGETACTIVEUNIFORMARBPROC pGlGetActiveUniformARB;
-		PFNGLGETACTIVEUNIFORMPROC pGlGetActiveUniform;
-		PFNGLPOINTPARAMETERFARBPROC  pGlPointParameterfARB;
-		PFNGLPOINTPARAMETERFVARBPROC pGlPointParameterfvARB;
-		PFNGLSTENCILFUNCSEPARATEPROC pGlStencilFuncSeparate;
-		PFNGLSTENCILOPSEPARATEPROC pGlStencilOpSeparate;
-		PFNGLSTENCILFUNCSEPARATEATIPROC pGlStencilFuncSeparateATI;
-		PFNGLSTENCILOPSEPARATEATIPROC pGlStencilOpSeparateATI;
-		PFNGLCOMPRESSEDTEXIMAGE2DPROC pGlCompressedTexImage2D;
-		// ARB framebuffer object
-		PFNGLBINDFRAMEBUFFERPROC pGlBindFramebuffer;
-		PFNGLDELETEFRAMEBUFFERSPROC pGlDeleteFramebuffers;
-		PFNGLGENFRAMEBUFFERSPROC pGlGenFramebuffers;
-		PFNGLCHECKFRAMEBUFFERSTATUSPROC pGlCheckFramebufferStatus;
-		PFNGLFRAMEBUFFERTEXTURE2DPROC pGlFramebufferTexture2D;
-		PFNGLBINDRENDERBUFFERPROC pGlBindRenderbuffer;
-		PFNGLDELETERENDERBUFFERSPROC pGlDeleteRenderbuffers;
-		PFNGLGENRENDERBUFFERSPROC pGlGenRenderbuffers;
-		PFNGLRENDERBUFFERSTORAGEPROC pGlRenderbufferStorage;
-		PFNGLFRAMEBUFFERRENDERBUFFERPROC pGlFramebufferRenderbuffer;
-		PFNGLGENERATEMIPMAPPROC pGlGenerateMipmap;
-		// EXT framebuffer object
-		PFNGLBINDFRAMEBUFFEREXTPROC pGlBindFramebufferEXT;
-		PFNGLDELETEFRAMEBUFFERSEXTPROC pGlDeleteFramebuffersEXT;
-		PFNGLGENFRAMEBUFFERSEXTPROC pGlGenFramebuffersEXT;
-		PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC pGlCheckFramebufferStatusEXT;
-		PFNGLFRAMEBUFFERTEXTURE2DEXTPROC pGlFramebufferTexture2DEXT;
-		PFNGLBINDRENDERBUFFEREXTPROC pGlBindRenderbufferEXT;
-		PFNGLDELETERENDERBUFFERSEXTPROC pGlDeleteRenderbuffersEXT;
-		PFNGLGENRENDERBUFFERSEXTPROC pGlGenRenderbuffersEXT;
-		PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;
-		PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;
-		PFNGLGENERATEMIPMAPEXTPROC pGlGenerateMipmapEXT;
-		PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT;
-		PFNGLDRAWBUFFERSARBPROC pGlDrawBuffersARB;
-		PFNGLDRAWBUFFERSATIPROC pGlDrawBuffersATI;
-		PFNGLGENBUFFERSARBPROC pGlGenBuffersARB;
-		PFNGLBINDBUFFERARBPROC pGlBindBufferARB;
-		PFNGLBUFFERDATAARBPROC pGlBufferDataARB;
-		PFNGLDELETEBUFFERSARBPROC pGlDeleteBuffersARB;
-		PFNGLBUFFERSUBDATAARBPROC pGlBufferSubDataARB;
-		PFNGLGETBUFFERSUBDATAARBPROC pGlGetBufferSubDataARB;
-		PFNGLMAPBUFFERARBPROC pGlMapBufferARB;
-		PFNGLUNMAPBUFFERARBPROC pGlUnmapBufferARB;
-		PFNGLISBUFFERARBPROC pGlIsBufferARB;
-		PFNGLGETBUFFERPARAMETERIVARBPROC pGlGetBufferParameterivARB;
-		PFNGLGETBUFFERPOINTERVARBPROC pGlGetBufferPointervARB;
-		PFNGLPROVOKINGVERTEXPROC pGlProvokingVertexARB;
-		PFNGLPROVOKINGVERTEXEXTPROC pGlProvokingVertexEXT;
-		PFNGLCOLORMASKINDEXEDEXTPROC pGlColorMaskIndexedEXT;
-		PFNGLENABLEINDEXEDEXTPROC pGlEnableIndexedEXT;
-		PFNGLDISABLEINDEXEDEXTPROC pGlDisableIndexedEXT;
-		PFNGLBLENDFUNCINDEXEDAMDPROC pGlBlendFuncIndexedAMD;
-		PFNGLBLENDFUNCIPROC pGlBlendFunciARB;
-		PFNGLBLENDEQUATIONINDEXEDAMDPROC pGlBlendEquationIndexedAMD;
-		PFNGLBLENDEQUATIONIPROC pGlBlendEquationiARB;
-		PFNGLPROGRAMPARAMETERIARBPROC pGlProgramParameteriARB;
-		PFNGLPROGRAMPARAMETERIEXTPROC pGlProgramParameteriEXT;
-		PFNGLGENQUERIESARBPROC pGlGenQueriesARB;
-		PFNGLDELETEQUERIESARBPROC pGlDeleteQueriesARB;
-		PFNGLISQUERYARBPROC pGlIsQueryARB;
-		PFNGLBEGINQUERYARBPROC pGlBeginQueryARB;
-		PFNGLENDQUERYARBPROC pGlEndQueryARB;
-		PFNGLGETQUERYIVARBPROC pGlGetQueryivARB;
-		PFNGLGETQUERYOBJECTIVARBPROC pGlGetQueryObjectivARB;
-		PFNGLGETQUERYOBJECTUIVARBPROC pGlGetQueryObjectuivARB;
-		PFNGLGENOCCLUSIONQUERIESNVPROC pGlGenOcclusionQueriesNV;
-		PFNGLDELETEOCCLUSIONQUERIESNVPROC pGlDeleteOcclusionQueriesNV;
-		PFNGLISOCCLUSIONQUERYNVPROC pGlIsOcclusionQueryNV;
-		PFNGLBEGINOCCLUSIONQUERYNVPROC pGlBeginOcclusionQueryNV;
-		PFNGLENDOCCLUSIONQUERYNVPROC pGlEndOcclusionQueryNV;
-		PFNGLGETOCCLUSIONQUERYIVNVPROC pGlGetOcclusionQueryivNV;
-		PFNGLGETOCCLUSIONQUERYUIVNVPROC pGlGetOcclusionQueryuivNV;
-		PFNGLBLENDEQUATIONEXTPROC pGlBlendEquationEXT;
-		PFNGLBLENDEQUATIONPROC pGlBlendEquation;
-		#if defined(WGL_EXT_swap_control)
-		PFNWGLSWAPINTERVALEXTPROC pWglSwapIntervalEXT;
-		#endif
-		#if defined(GLX_SGI_swap_control)
-		PFNGLXSWAPINTERVALSGIPROC pGlxSwapIntervalSGI;
-		#endif
-		#if defined(GLX_EXT_swap_control)
-		PFNGLXSWAPINTERVALEXTPROC pGlxSwapIntervalEXT;
-		#endif
-		#if defined(GLX_MESA_swap_control)
-		PFNGLXSWAPINTERVALMESAPROC pGlxSwapIntervalMESA;
-		#endif
-	#endif
-};
-
-inline void COpenGLExtensionHandler::extGlActiveTexture(GLenum texture)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (MultiTextureExtension && pGlActiveTextureARB)
-		pGlActiveTextureARB(texture);
-#else
-	if (MultiTextureExtension)
-#ifdef GL_ARB_multitexture
-		glActiveTextureARB(texture);
-#else
-		glActiveTexture(texture);
-#endif
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlClientActiveTexture(GLenum texture)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (MultiTextureExtension && pGlClientActiveTextureARB)
-		pGlClientActiveTextureARB(texture);
-#else
-	if (MultiTextureExtension)
-		glClientActiveTextureARB(texture);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGenPrograms(GLsizei n, GLuint *programs)
-{
-	if (programs)
-		memset(programs,0,n*sizeof(GLuint));
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenProgramsARB)
-		pGlGenProgramsARB(n, programs);
-	else if (pGlGenProgramsNV)
-		pGlGenProgramsNV(n, programs);
-#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
-	glGenProgramsARB(n,programs);
-#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
-	glGenProgramsNV(n,programs);
-#else
-	os::Printer::log("glGenPrograms not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBindProgram(GLenum target, GLuint program)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBindProgramARB)
-		pGlBindProgramARB(target, program);
-	else if (pGlBindProgramNV)
-		pGlBindProgramNV(target, program);
-#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
-	glBindProgramARB(target, program);
-#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
-	glBindProgramNV(target, program);
-#else
-	os::Printer::log("glBindProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlProgramStringARB)
-		pGlProgramStringARB(target, format, len, string);
-#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
-	glProgramStringARB(target,format,len,string);
-#else
-	os::Printer::log("glProgramString not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlLoadProgramNV)
-		pGlLoadProgramNV(target, id, len, string);
-#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
-	glLoadProgramNV(target,id,len,string);
-#else
-	os::Printer::log("glLoadProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeletePrograms(GLsizei n, const GLuint *programs)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteProgramsARB)
-		pGlDeleteProgramsARB(n, programs);
-	else if (pGlDeleteProgramsNV)
-		pGlDeleteProgramsNV(n, programs);
-#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
-	glDeleteProgramsARB(n,programs);
-#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
-	glDeleteProgramsNV(n,programs);
-#else
-	os::Printer::log("glDeletePrograms not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlProgramLocalParameter4fv(GLenum n, GLuint i, const GLfloat *f)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlProgramLocalParameter4fvARB)
-		pGlProgramLocalParameter4fvARB(n,i,f);
-#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
-	glProgramLocalParameter4fvARB(n,i,f);
-#else
-	os::Printer::log("glProgramLocalParameter4fv not supported", ELL_ERROR);
-#endif
-}
-
-inline GLhandleARB COpenGLExtensionHandler::extGlCreateShaderObject(GLenum shaderType)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCreateShaderObjectARB)
-		return pGlCreateShaderObjectARB(shaderType);
-#elif defined(GL_ARB_shader_objects)
-	return glCreateShaderObjectARB(shaderType);
-#else
-	os::Printer::log("glCreateShaderObject not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline GLuint COpenGLExtensionHandler::extGlCreateShader(GLenum shaderType)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCreateShader)
-		return pGlCreateShader(shaderType);
-#elif defined(GL_VERSION_2_0)
-	return glCreateShader(shaderType);
-#else
-	os::Printer::log("glCreateShader not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline void COpenGLExtensionHandler::extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlShaderSourceARB)
-		pGlShaderSourceARB(shader, numOfStrings, strings, lenOfStrings);
-#elif defined(GL_ARB_shader_objects)
-	glShaderSourceARB(shader, numOfStrings, strings, (GLint *)lenOfStrings);
-#else
-	os::Printer::log("glShaderSource not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlShaderSource)
-		pGlShaderSource(shader, numOfStrings, strings, lenOfStrings);
-#elif defined(GL_VERSION_2_0)
-	glShaderSource(shader, numOfStrings, strings, (GLint *)lenOfStrings);
-#else
-	os::Printer::log("glShaderSource not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlCompileShaderARB(GLhandleARB shader)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCompileShaderARB)
-		pGlCompileShaderARB(shader);
-#elif defined(GL_ARB_shader_objects)
-	glCompileShaderARB(shader);
-#else
-	os::Printer::log("glCompileShader not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlCompileShader(GLuint shader)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCompileShader)
-		pGlCompileShader(shader);
-#elif defined(GL_VERSION_2_0)
-	glCompileShader(shader);
-#else
-	os::Printer::log("glCompileShader not supported", ELL_ERROR);
-#endif
-}
-
-inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCreateProgramObjectARB)
-		return pGlCreateProgramObjectARB();
-#elif defined(GL_ARB_shader_objects)
-	return glCreateProgramObjectARB();
-#else
-	os::Printer::log("glCreateProgramObject not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline GLuint COpenGLExtensionHandler::extGlCreateProgram(void)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCreateProgram)
-		return pGlCreateProgram();
-#elif defined(GL_VERSION_2_0)
-	return glCreateProgram();
-#else
-	os::Printer::log("glCreateProgram not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLhandleARB shader)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlAttachObjectARB)
-		pGlAttachObjectARB(program, shader);
-#elif defined(GL_ARB_shader_objects)
-	glAttachObjectARB(program, shader);
-#else
-	os::Printer::log("glAttachObject not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlAttachShader(GLuint program, GLuint shader)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlAttachShader)
-		pGlAttachShader(program, shader);
-#elif defined(GL_VERSION_2_0)
-	glAttachShader(program, shader);
-#else
-	os::Printer::log("glAttachShader not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlLinkProgramARB(GLhandleARB program)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlLinkProgramARB)
-		pGlLinkProgramARB(program);
-#elif defined(GL_ARB_shader_objects)
-	glLinkProgramARB(program);
-#else
-	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlLinkProgram(GLuint program)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlLinkProgram)
-		pGlLinkProgram(program);
-#elif defined(GL_VERSION_2_0)
-	glLinkProgram(program);
-#else
-	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUseProgramObjectARB)
-		pGlUseProgramObjectARB(prog);
-#elif defined(GL_ARB_shader_objects)
-	glUseProgramObjectARB(prog);
-#else
-	os::Printer::log("glUseProgramObject not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUseProgram(GLuint prog)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUseProgram)
-		pGlUseProgram(prog);
-#elif defined(GL_VERSION_2_0)
-	glUseProgram(prog);
-#else
-	os::Printer::log("glUseProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteObjectARB)
-		pGlDeleteObjectARB(object);
-#elif defined(GL_ARB_shader_objects)
-	glDeleteObjectARB(object);
-#else
-	os::Printer::log("glDeleteObject not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteProgram(GLuint object)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteProgram)
-		pGlDeleteProgram(object);
-#elif defined(GL_VERSION_2_0)
-	glDeleteProgram(object);
-#else
-	os::Printer::log("glDeleteProgram not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteShader(GLuint shader)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteShader)
-		pGlDeleteShader(shader);
-#elif defined(GL_VERSION_2_0)
-	glDeleteShader(shader);
-#else
-	os::Printer::log("glDeleteShader not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders)
-{
-	if (count)
-		*count=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetAttachedObjectsARB)
-		pGlGetAttachedObjectsARB(program, maxcount, count, shaders);
-#elif defined(GL_ARB_shader_objects)
-	glGetAttachedObjectsARB(program, maxcount, count, shaders);
-#else
-	os::Printer::log("glGetAttachedObjects not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
-{
-	if (count)
-		*count=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetAttachedShaders)
-		pGlGetAttachedShaders(program, maxcount, count, shaders);
-#elif defined(GL_VERSION_2_0)
-	glGetAttachedShaders(program, maxcount, count, shaders);
-#else
-	os::Printer::log("glGetAttachedShaders not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
-{
-	if (length)
-		*length=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetInfoLogARB)
-		pGlGetInfoLogARB(object, maxLength, length, infoLog);
-#elif defined(GL_ARB_shader_objects)
-	glGetInfoLogARB(object, maxLength, length, infoLog);
-#else
-	os::Printer::log("glGetInfoLog not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
-{
-	if (length)
-		*length=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetShaderInfoLog)
-		pGlGetShaderInfoLog(shader, maxLength, length, infoLog);
-#elif defined(GL_VERSION_2_0)
-	glGetShaderInfoLog(shader, maxLength, length, infoLog);
-#else
-	os::Printer::log("glGetShaderInfoLog not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
-{
-	if (length)
-		*length=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetProgramInfoLog)
-		pGlGetProgramInfoLog(program, maxLength, length, infoLog);
-#elif defined(GL_VERSION_2_0)
-	glGetProgramInfoLog(program, maxLength, length, infoLog);
-#else
-	os::Printer::log("glGetProgramInfoLog not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetObjectParameterivARB)
-		pGlGetObjectParameterivARB(object, type, param);
-#elif defined(GL_ARB_shader_objects)
-	glGetObjectParameterivARB(object, type, param);
-#else
-	os::Printer::log("glGetObjectParameteriv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetShaderiv(GLuint shader, GLenum type, GLint *param)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetShaderiv)
-		pGlGetShaderiv(shader, type, param);
-#elif defined(GL_VERSION_2_0)
-	glGetShaderiv(shader, type, param);
-#else
-	os::Printer::log("glGetShaderiv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetProgramiv(GLuint program, GLenum type, GLint *param)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetProgramiv)
-		pGlGetProgramiv(program, type, param);
-#elif defined(GL_VERSION_2_0)
-	glGetProgramiv(program, type, param);
-#else
-	os::Printer::log("glGetProgramiv not supported", ELL_ERROR);
-#endif
-}
-
-inline GLint COpenGLExtensionHandler::extGlGetUniformLocationARB(GLhandleARB program, const char *name)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetUniformLocationARB)
-		return pGlGetUniformLocationARB(program, name);
-#elif defined(GL_ARB_shader_objects)
-	return glGetUniformLocationARB(program, name);
-#else
-	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLuint program, const char *name)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetUniformLocation)
-		return pGlGetUniformLocation(program, name);
-#elif defined(GL_VERSION_2_0)
-	return glGetUniformLocation(program, name);
-#else
-	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
-#endif
-	return 0;
-}
-
-inline void COpenGLExtensionHandler::extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform1fvARB)
-		pGlUniform1fvARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform1fvARB(loc, count, v);
-#else
-	os::Printer::log("glUniform1fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform2fvARB)
-		pGlUniform2fvARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform2fvARB(loc, count, v);
-#else
-	os::Printer::log("glUniform2fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform3fvARB)
-		pGlUniform3fvARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform3fvARB(loc, count, v);
-#else
-	os::Printer::log("glUniform3fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform4fvARB)
-		pGlUniform4fvARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform4fvARB(loc, count, v);
-#else
-	os::Printer::log("glUniform4fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform1iv(GLint loc, GLsizei count, const GLint *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform1ivARB)
-		pGlUniform1ivARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform1ivARB(loc, count, v);
-#else
-	os::Printer::log("glUniform1iv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform2iv(GLint loc, GLsizei count, const GLint *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform2ivARB)
-		pGlUniform2ivARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform2ivARB(loc, count, v);
-#else
-	os::Printer::log("glUniform2iv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform3iv(GLint loc, GLsizei count, const GLint *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform3ivARB)
-		pGlUniform3ivARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform3ivARB(loc, count, v);
-#else
-	os::Printer::log("glUniform3iv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniform4iv(GLint loc, GLsizei count, const GLint *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniform4ivARB)
-		pGlUniform4ivARB(loc, count, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniform4ivARB(loc, count, v);
-#else
-	os::Printer::log("glUniform4iv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniformMatrix2fvARB)
-		pGlUniformMatrix2fvARB(loc, count, transpose, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniformMatrix2fvARB(loc, count, transpose, v);
-#else
-	os::Printer::log("glUniformMatrix2fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniformMatrix3fvARB)
-		pGlUniformMatrix3fvARB(loc, count, transpose, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniformMatrix3fvARB(loc, count, transpose, v);
-#else
-	os::Printer::log("glUniformMatrix3fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUniformMatrix4fvARB)
-		pGlUniformMatrix4fvARB(loc, count, transpose, v);
-#elif defined(GL_ARB_shader_objects)
-	glUniformMatrix4fvARB(loc, count, transpose, v);
-#else
-	os::Printer::log("glUniformMatrix4fv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetActiveUniformARB(GLhandleARB program,
-		GLuint index, GLsizei maxlength, GLsizei *length,
-		GLint *size, GLenum *type, GLcharARB *name)
-{
-	if (length)
-		*length=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetActiveUniformARB)
-		pGlGetActiveUniformARB(program, index, maxlength, length, size, type, name);
-#elif defined(GL_ARB_shader_objects)
-	glGetActiveUniformARB(program, index, maxlength, length, size, type, name);
-#else
-	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLuint program,
-		GLuint index, GLsizei maxlength, GLsizei *length,
-		GLint *size, GLenum *type, GLchar *name)
-{
-	if (length)
-		*length=0;
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetActiveUniform)
-		pGlGetActiveUniform(program, index, maxlength, length, size, type, name);
-#elif defined(GL_VERSION_2_0)
-	glGetActiveUniform(program, index, maxlength, length, size, type, name);
-#else
-	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlPointParameterf(GLint loc, GLfloat f)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlPointParameterfARB)
-		pGlPointParameterfARB(loc, f);
-#elif defined(GL_ARB_point_parameters)
-	glPointParameterfARB(loc, f);
-#else
-	os::Printer::log("glPointParameterf not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlPointParameterfv(GLint loc, const GLfloat *v)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlPointParameterfvARB)
-		pGlPointParameterfvARB(loc, v);
-#elif defined(GL_ARB_point_parameters)
-	glPointParameterfvARB(loc, v);
-#else
-	os::Printer::log("glPointParameterfv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlStencilFuncSeparate)
-		pGlStencilFuncSeparate(frontfunc, backfunc, ref, mask);
-	else if (pGlStencilFuncSeparateATI)
-		pGlStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
-#elif defined(GL_VERSION_2_0)
-	glStencilFuncSeparate(frontfunc, backfunc, ref, mask);
-#elif defined(GL_ATI_separate_stencil)
-	glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
-#else
-	os::Printer::log("glStencilFuncSeparate not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlStencilOpSeparate)
-		pGlStencilOpSeparate(face, fail, zfail, zpass);
-	else if (pGlStencilOpSeparateATI)
-		pGlStencilOpSeparateATI(face, fail, zfail, zpass);
-#elif defined(GL_VERSION_2_0)
-	glStencilOpSeparate(face, fail, zfail, zpass);
-#elif defined(GL_ATI_separate_stencil)
-	glStencilOpSeparateATI(face, fail, zfail, zpass);
-#else
-	os::Printer::log("glStencilOpSeparate not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width,
-		GLsizei height, GLint border, GLsizei imageSize, const void* data)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCompressedTexImage2D)
-		pGlCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-#elif defined(GL_ARB_texture_compression)
-	glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-#else
-	os::Printer::log("glCompressedTexImage2D not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBindFramebuffer(GLenum target, GLuint framebuffer)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBindFramebuffer)
-		pGlBindFramebuffer(target, framebuffer);
-	else if (pGlBindFramebufferEXT)
-		pGlBindFramebufferEXT(target, framebuffer);
-#elif defined(GL_ARB_framebuffer_object)
-	glBindFramebuffer(target, framebuffer);
-#elif defined(GL_EXT_framebuffer_object)
-	glBindFramebufferEXT(target, framebuffer);
-#else
-	os::Printer::log("glBindFramebuffer not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteFramebuffers)
-		pGlDeleteFramebuffers(n, framebuffers);
-	else if (pGlDeleteFramebuffersEXT)
-		pGlDeleteFramebuffersEXT(n, framebuffers);
-#elif defined(GL_ARB_framebuffer_object)
-	glDeleteFramebuffers(n, framebuffers);
-#elif defined(GL_EXT_framebuffer_object)
-	glDeleteFramebuffersEXT(n, framebuffers);
-#else
-	os::Printer::log("glDeleteFramebuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGenFramebuffers(GLsizei n, GLuint *framebuffers)
-{
-	if (framebuffers)
-		memset(framebuffers,0,n*sizeof(GLuint));
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenFramebuffers)
-		pGlGenFramebuffers(n, framebuffers);
-	else if (pGlGenFramebuffersEXT)
-		pGlGenFramebuffersEXT(n, framebuffers);
-#elif defined(GL_ARB_framebuffer_object)
-	glGenFramebuffers(n, framebuffers);
-#elif defined(GL_EXT_framebuffer_object)
-	glGenFramebuffersEXT(n, framebuffers);
-#else
-	os::Printer::log("glGenFramebuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline GLenum COpenGLExtensionHandler::extGlCheckFramebufferStatus(GLenum target)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlCheckFramebufferStatus)
-		return pGlCheckFramebufferStatus(target);
-	else if (pGlCheckFramebufferStatusEXT)
-		return pGlCheckFramebufferStatusEXT(target);
-	else
-		return 0;
-#elif defined(GL_ARB_framebuffer_object)
-	return glCheckFramebufferStatus(target);
-#elif defined(GL_EXT_framebuffer_object)
-	return glCheckFramebufferStatusEXT(target);
-#else
-	os::Printer::log("glCheckFramebufferStatus not supported", ELL_ERROR);
-	return 0;
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlFramebufferTexture2D)
-		pGlFramebufferTexture2D(target, attachment, textarget, texture, level);
-	else if (pGlFramebufferTexture2DEXT)
-		pGlFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
-#elif defined(GL_ARB_framebuffer_object)
-	glFramebufferTexture2D(target, attachment, textarget, texture, level);
-#elif defined(GL_EXT_framebuffer_object)
-	glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
-#else
-	os::Printer::log("glFramebufferTexture2D not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBindRenderbuffer(GLenum target, GLuint renderbuffer)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBindRenderbuffer)
-		pGlBindRenderbuffer(target, renderbuffer);
-	else if (pGlBindRenderbufferEXT)
-		pGlBindRenderbufferEXT(target, renderbuffer);
-#elif defined(GL_ARB_framebuffer_object)
-	glBindRenderbuffer(target, renderbuffer);
-#elif defined(GL_EXT_framebuffer_object)
-	glBindRenderbufferEXT(target, renderbuffer);
-#else
-	os::Printer::log("glBindRenderbuffer not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteRenderbuffers)
-		pGlDeleteRenderbuffers(n, renderbuffers);
-	else if (pGlDeleteRenderbuffersEXT)
-		pGlDeleteRenderbuffersEXT(n, renderbuffers);
-#elif defined(GL_ARB_framebuffer_object)
-	glDeleteRenderbuffers(n, renderbuffers);
-#elif defined(GL_EXT_framebuffer_object)
-	glDeleteRenderbuffersEXT(n, renderbuffers);
-#else
-	os::Printer::log("glDeleteRenderbuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
-{
-	if (renderbuffers)
-		memset(renderbuffers,0,n*sizeof(GLuint));
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenRenderbuffers)
-		pGlGenRenderbuffers(n, renderbuffers);
-	else if (pGlGenRenderbuffersEXT)
-		pGlGenRenderbuffersEXT(n, renderbuffers);
-#elif defined(GL_ARB_framebuffer_object)
-	glGenRenderbuffers(n, renderbuffers);
-#elif defined(GL_EXT_framebuffer_object)
-	glGenRenderbuffersEXT(n, renderbuffers);
-#else
-	os::Printer::log("glGenRenderbuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlRenderbufferStorage)
-		pGlRenderbufferStorage(target, internalformat, width, height);
-	else if (pGlRenderbufferStorageEXT)
-		pGlRenderbufferStorageEXT(target, internalformat, width, height);
-#elif defined(GL_ARB_framebuffer_object)
-	glRenderbufferStorage(target, internalformat, width, height);
-#elif defined(GL_EXT_framebuffer_object)
-	glRenderbufferStorageEXT(target, internalformat, width, height);
-#else
-	os::Printer::log("glRenderbufferStorage not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlFramebufferRenderbuffer)
-		pGlFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-	else if (pGlFramebufferRenderbufferEXT)
-		pGlFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
-#elif defined(GL_ARB_framebuffer_object)
-	glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-#elif defined(GL_EXT_framebuffer_object)
-	glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
-#else
-	os::Printer::log("glFramebufferRenderbuffer not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGenerateMipmap(GLenum target)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenerateMipmap)
-		pGlGenerateMipmap(target);
-	else if (pGlGenerateMipmapEXT)
-		pGlGenerateMipmapEXT(target);
-#elif defined(GL_ARB_framebuffer_object)
-	glGenerateMipmap(target);
-#elif defined(GL_EXT_framebuffer_object)
-	glGenerateMipmapEXT(target);
-#else
-	os::Printer::log("glGenerateMipmap not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlActiveStencilFace(GLenum face)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlActiveStencilFaceEXT)
-		pGlActiveStencilFaceEXT(face);
-#elif defined(GL_EXT_stencil_two_side)
-	glActiveStencilFaceEXT(face);
-#else
-	os::Printer::log("glActiveStencilFace not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDrawBuffers(GLsizei n, const GLenum *bufs)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDrawBuffersARB)
-		pGlDrawBuffersARB(n, bufs);
-	else if (pGlDrawBuffersATI)
-		pGlDrawBuffersATI(n, bufs);
-#elif defined(GL_ARB_draw_buffers)
-	glDrawBuffersARB(n, bufs);
-#elif defined(GL_ATI_draw_buffers)
-	glDrawBuffersATI(n, bufs);
-#else
-	os::Printer::log("glDrawBuffers not supported", ELL_ERROR);
-#endif
-}
-
-
-inline void COpenGLExtensionHandler::extGlGenBuffers(GLsizei n, GLuint *buffers)
-{
-	if (buffers)
-		memset(buffers,0,n*sizeof(GLuint));
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenBuffersARB)
-		pGlGenBuffersARB(n, buffers);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glGenBuffers(n, buffers);
-#else
-	os::Printer::log("glGenBuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBindBuffer(GLenum target, GLuint buffer)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBindBufferARB)
-		pGlBindBufferARB(target, buffer);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glBindBuffer(target, buffer);
-#else
-	os::Printer::log("glBindBuffer not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBufferDataARB)
-		pGlBufferDataARB(target, size, data, usage);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glBufferData(target, size, data, usage);
-#else
-	os::Printer::log("glBufferData not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteBuffers(GLsizei n, const GLuint *buffers)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteBuffersARB)
-		pGlDeleteBuffersARB(n, buffers);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glDeleteBuffers(n, buffers);
-#else
-	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBufferSubDataARB)
-		pGlBufferSubDataARB(target, offset, size, data);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glBufferSubData(target, offset, size, data);
-#else
-	os::Printer::log("glBufferSubData not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetBufferSubDataARB)
-		pGlGetBufferSubDataARB(target, offset, size, data);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glGetBufferSubData(target, offset, size, data);
-#else
-	os::Printer::log("glGetBufferSubData not supported", ELL_ERROR);
-#endif
-}
-
-inline void *COpenGLExtensionHandler::extGlMapBuffer(GLenum target, GLenum access)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlMapBufferARB)
-		return pGlMapBufferARB(target, access);
-	return 0;
-#elif defined(GL_ARB_vertex_buffer_object)
-	return glMapBuffer(target, access);
-#else
-	os::Printer::log("glMapBuffer not supported", ELL_ERROR);
-	return 0;
-#endif
-}
-
-inline GLboolean COpenGLExtensionHandler::extGlUnmapBuffer(GLenum target)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlUnmapBufferARB)
-		return pGlUnmapBufferARB(target);
-	return false;
-#elif defined(GL_ARB_vertex_buffer_object)
-	return glUnmapBuffer(target);
-#else
-	os::Printer::log("glUnmapBuffer not supported", ELL_ERROR);
-	return false;
-#endif
-}
-
-inline GLboolean COpenGLExtensionHandler::extGlIsBuffer(GLuint buffer)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlIsBufferARB)
-		return pGlIsBufferARB(buffer);
-	return false;
-#elif defined(GL_ARB_vertex_buffer_object)
-	return glIsBuffer(buffer);
-#else
-	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
-	return false;
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetBufferParameterivARB)
-		pGlGetBufferParameterivARB(target, pname, params);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glGetBufferParameteriv(target, pname, params);
-#else
-	os::Printer::log("glGetBufferParameteriv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetBufferPointervARB)
-		pGlGetBufferPointervARB(target, pname, params);
-#elif defined(GL_ARB_vertex_buffer_object)
-	glGetBufferPointerv(target, pname, params);
-#else
-	os::Printer::log("glGetBufferPointerv not supported", ELL_ERROR);
-#endif
-}
-
-
-inline void COpenGLExtensionHandler::extGlProvokingVertex(GLenum mode)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_ARB_provoking_vertex] && pGlProvokingVertexARB)
-		pGlProvokingVertexARB(mode);
-	else if (FeatureAvailable[IRR_EXT_provoking_vertex] && pGlProvokingVertexEXT)
-		pGlProvokingVertexEXT(mode);
-#elif defined(GL_ARB_provoking_vertex)
-	glProvokingVertex(mode);
-#elif defined(GL_EXT_provoking_vertex)
-	glProvokingVertexEXT(mode);
-#else
-	os::Printer::log("glProvokingVertex not supported", ELL_ERROR);
-#endif
-}
-
-
-inline void COpenGLExtensionHandler::extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlColorMaskIndexedEXT)
-		pGlColorMaskIndexedEXT(buf, r, g, b, a);
-#elif defined(GL_EXT_draw_buffers2)
-	glColorMaskIndexedEXT(buf, r, g, b, a);
-#else
-	os::Printer::log("glColorMaskIndexed not supported", ELL_ERROR);
-#endif
-}
-
-
-inline void COpenGLExtensionHandler::extGlEnableIndexed(GLenum target, GLuint index)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlEnableIndexedEXT)
-		pGlEnableIndexedEXT(target, index);
-#elif defined(GL_EXT_draw_buffers2)
-	glEnableIndexedEXT(target, index);
-#else
-	os::Printer::log("glEnableIndexed not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDisableIndexed(GLenum target, GLuint index)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlDisableIndexedEXT)
-		pGlDisableIndexedEXT(target, index);
-#elif defined(GL_EXT_draw_buffers2)
-	glDisableIndexedEXT(target, index);
-#else
-	os::Printer::log("glDisableIndexed not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendFunciARB)
-		pGlBlendFunciARB(buf, src, dst);
-	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendFuncIndexedAMD)
-		pGlBlendFuncIndexedAMD(buf, src, dst);
-#elif defined(GL_ARB_draw_buffers_blend)
-	glBlendFunciARB(buf, src, dst);
-#elif defined(GL_AMD_draw_buffers_blend)
-	glBlendFuncIndexedAMD(buf, src, dst);
-#else
-	os::Printer::log("glBlendFuncIndexed not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBlendEquationIndexed(GLuint buf, GLenum mode)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendEquationiARB)
-		pGlBlendEquationiARB(buf, mode);
-	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendEquationIndexedAMD)
-		pGlBlendEquationIndexedAMD(buf, mode);
-#elif defined(GL_ARB_draw_buffers_blend)
-	glBlendEquationiARB(buf, mode);
-#elif defined(GL_AMD_draw_buffers_blend)
-	glBlendEquationIndexedAMD(buf, mode);
-#else
-	os::Printer::log("glBlendEquationIndexed not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value)
-{
-#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
-	if (queryFeature(EVDF_GEOMETRY_SHADER))
-	{
-		if (pGlProgramParameteriARB)
-			pGlProgramParameteriARB(program, pname, value);
-		else if (pGlProgramParameteriEXT)
-			pGlProgramParameteriEXT(program, pname, value);
-	}
-#elif defined(GL_ARB_geometry_shader4)
-	glProgramParameteriARB(program, pname, value);
-#elif defined(GL_EXT_geometry_shader4)
-    #ifdef __clang__
-    glProgramParameteriEXT((long)program, pname, value);
-    #else
-	glProgramParameteriEXT((long GLuint)program, pname, value);
-    #endif
-#elif defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4)
-	glProgramParameteriNV(program, pname, value);
-#else
-	os::Printer::log("glProgramParameteri not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGenQueries(GLsizei n, GLuint *ids)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGenQueriesARB)
-		pGlGenQueriesARB(n, ids);
-	else if (pGlGenOcclusionQueriesNV)
-		pGlGenOcclusionQueriesNV(n, ids);
-#elif defined(GL_ARB_occlusion_query)
-	glGenQueriesARB(n, ids);
-#elif defined(GL_NV_occlusion_query)
-	glGenOcclusionQueriesNV(n, ids);
-#else
-	os::Printer::log("glGenQueries not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlDeleteQueries(GLsizei n, const GLuint *ids)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlDeleteQueriesARB)
-		pGlDeleteQueriesARB(n, ids);
-	else if (pGlDeleteOcclusionQueriesNV)
-		pGlDeleteOcclusionQueriesNV(n, ids);
-#elif defined(GL_ARB_occlusion_query)
-	glDeleteQueriesARB(n, ids);
-#elif defined(GL_NV_occlusion_query)
-	glDeleteOcclusionQueriesNV(n, ids);
-#else
-	os::Printer::log("glDeleteQueries not supported", ELL_ERROR);
-#endif
-}
-
-inline GLboolean COpenGLExtensionHandler::extGlIsQuery(GLuint id)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlIsQueryARB)
-		return pGlIsQueryARB(id);
-	else if (pGlIsOcclusionQueryNV)
-		return pGlIsOcclusionQueryNV(id);
-	return false;
-#elif defined(GL_ARB_occlusion_query)
-	return glIsQueryARB(id);
-#elif defined(GL_NV_occlusion_query)
-	return glIsOcclusionQueryNV(id);
-#else
-	return false;
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBeginQuery(GLenum target, GLuint id)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBeginQueryARB)
-		pGlBeginQueryARB(target, id);
-	else if (pGlBeginOcclusionQueryNV)
-		pGlBeginOcclusionQueryNV(id);
-#elif defined(GL_ARB_occlusion_query)
-	glBeginQueryARB(target, id);
-#elif defined(GL_NV_occlusion_query)
-	glBeginOcclusionQueryNV(id);
-#else
-	os::Printer::log("glBeginQuery not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlEndQuery(GLenum target)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlEndQueryARB)
-		pGlEndQueryARB(target);
-	else if (pGlEndOcclusionQueryNV)
-		pGlEndOcclusionQueryNV();
-#elif defined(GL_ARB_occlusion_query)
-	glEndQueryARB(target);
-#elif defined(GL_NV_occlusion_query)
-	glEndOcclusionQueryNV();
-#else
-	os::Printer::log("glEndQuery not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetQueryiv(GLenum target, GLenum pname, GLint *params)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetQueryivARB)
-		pGlGetQueryivARB(target, pname, params);
-#elif defined(GL_ARB_occlusion_query)
-	glGetQueryivARB(target, pname, params);
-#else
-	os::Printer::log("glGetQueryivARB not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetQueryObjectivARB)
-		pGlGetQueryObjectivARB(id, pname, params);
-	else if (pGlGetOcclusionQueryivNV)
-		pGlGetOcclusionQueryivNV(id, pname, params);
-#elif defined(GL_ARB_occlusion_query)
-	glGetQueryObjectivARB(id, pname, params);
-#elif defined(GL_NV_occlusion_query)
-	glGetOcclusionQueryivNV(id, pname, params);
-#else
-	os::Printer::log("glGetQueryObjectiv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlGetQueryObjectuivARB)
-		pGlGetQueryObjectuivARB(id, pname, params);
-	else if (pGlGetOcclusionQueryuivNV)
-		pGlGetOcclusionQueryuivNV(id, pname, params);
-#elif defined(GL_ARB_occlusion_query)
-	glGetQueryObjectuivARB(id, pname, params);
-#elif defined(GL_NV_occlusion_query)
-	glGetOcclusionQueryuivNV(id, pname, params);
-#else
-	os::Printer::log("glGetQueryObjectuiv not supported", ELL_ERROR);
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)
-{
-	// we have wglext, so try to use that
-#if defined(_IRR_WINDOWS_API_) && defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
-#ifdef WGL_EXT_swap_control
-	if (pWglSwapIntervalEXT)
-		pWglSwapIntervalEXT(interval);
-#endif
-#endif
-#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
-	//TODO: Check GLX_EXT_swap_control and GLX_MESA_swap_control
-#ifdef GLX_SGI_swap_control
-	// does not work with interval==0
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (interval && pGlxSwapIntervalSGI)
-		pGlxSwapIntervalSGI(interval);
-#else
-	if (interval)
-		glXSwapIntervalSGI(interval);
-#endif
-#elif defined(GLX_EXT_swap_control)
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	Display *dpy = glXGetCurrentDisplay();
-	GLXDrawable drawable = glXGetCurrentDrawable();
-
-	if (pGlxSwapIntervalEXT)
-		pGlxSwapIntervalEXT(dpy, drawable, interval);
-#else
-	pGlXSwapIntervalEXT(dpy, drawable, interval);
-#endif
-#elif defined(GLX_MESA_swap_control)
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlxSwapIntervalMESA)
-		pGlxSwapIntervalMESA(interval);
-#else
-	pGlXSwapIntervalMESA(interval);
-#endif
-#endif
-#endif
-}
-
-inline void COpenGLExtensionHandler::extGlBlendEquation(GLenum mode)
-{
-#ifdef _IRR_OPENGL_USE_EXTPOINTER_
-	if (pGlBlendEquation)
-		pGlBlendEquation(mode);
-	else if (pGlBlendEquationEXT)
-		pGlBlendEquationEXT(mode);
-#elif defined(GL_EXT_blend_minmax) || defined(GL_EXT_blend_subtract) || defined(GL_EXT_blend_logic_op)
-	glBlendEquationEXT(mode);
-#elif defined(GL_VERSION_1_2)
-	glBlendEquation(mode);
-#else
-	os::Printer::log("glBlendEquation not supported", ELL_ERROR);
-#endif
-}
-
-
-}
-}
-
-#endif
-
-#endif
-
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in Irrlicht.h
+
+#ifndef __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
+#define __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
+
+#include "IrrCompileConfig.h"
+#ifdef _IRR_COMPILE_WITH_OPENGL_
+
+#include "EDriverFeatures.h"
+#include "irrTypes.h"
+#include "os.h"
+
+#if defined(_IRR_WINDOWS_API_)
+	// include windows headers for HWND
+	#define WIN32_LEAN_AND_MEAN
+	#include <windows.h>
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+		#define GL_GLEXT_LEGACY 1
+	#endif
+	#include <GL/gl.h>
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+                typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+		#include "glext.h"
+	#endif
+	#include "wglext.h"
+
+	#ifdef _MSC_VER
+		#pragma comment(lib, "OpenGL32.lib")
+	#endif
+
+#elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
+	#include "MacOSX/CIrrDeviceMacOSX.h"
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+		#define GL_GLEXT_LEGACY 1
+	#endif
+	#include <OpenGL/gl.h>
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+                typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+		#include "glext.h"
+	#endif
+#elif defined(_IRR_COMPILE_WITH_SDL_DEVICE_) && !defined(_IRR_COMPILE_WITH_X11_DEVICE_)
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+		#define GL_GLEXT_LEGACY 1
+		#define GLX_GLXEXT_LEGACY 1
+	#else
+		#define GL_GLEXT_PROTOTYPES 1
+		#define GLX_GLXEXT_PROTOTYPES 1
+	#endif
+	#define NO_SDL_GLEXT
+	#include <SDL/SDL_video.h>
+	#include <SDL/SDL_opengl.h>
+        typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+	#include "glext.h"
+#else
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+		#define GL_GLEXT_LEGACY 1
+		#define GLX_GLXEXT_LEGACY 1
+	#else
+		#define GL_GLEXT_PROTOTYPES 1
+		#define GLX_GLXEXT_PROTOTYPES 1
+	#endif
+	#include <GL/gl.h>
+	#include <GL/glx.h>
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+        typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+	#include <GL/glext.h>
+	#undef GLX_ARB_get_proc_address // avoid problems with local glxext.h
+	#include <GL/glxext.h>
+	#endif
+#endif
+
+#ifndef GL_ARB_shader_objects
+/* GL types for program/shader text and shader object handles */
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+#endif
+
+#ifndef GL_VERSION_2_0
+/* GL type for program/shader text */
+typedef char GLchar;
+#endif
+
+
+namespace irr
+{
+namespace video
+{
+
+
+static const char* const OpenGLFeatureStrings[] = {
+	"GL_3DFX_multisample",
+	"GL_3DFX_tbuffer",
+	"GL_3DFX_texture_compression_FXT1",
+	"GL_AMD_blend_minmax_factor",
+	"GL_AMD_conservative_depth",
+	"GL_AMD_debug_output",
+	"GL_AMD_depth_clamp_separate",
+	"GL_AMD_draw_buffers_blend",
+	"GL_AMD_multi_draw_indirect",
+	"GL_AMD_name_gen_delete",
+	"GL_AMD_performance_monitor",
+	"GL_AMD_sample_positions",
+	"GL_AMD_seamless_cubemap_per_texture",
+	"GL_AMD_shader_stencil_export",
+	"GL_AMD_texture_texture4",
+	"GL_AMD_transform_feedback3_lines_triangles",
+	"GL_AMD_vertex_shader_tesselator",
+	"GL_APPLE_aux_depth_stencil",
+	"GL_APPLE_client_storage",
+	"GL_APPLE_element_array",
+	"GL_APPLE_fence",
+	"GL_APPLE_float_pixels",
+	"GL_APPLE_flush_buffer_range",
+	"GL_APPLE_object_purgeable",
+	"GL_APPLE_rgb_422",
+	"GL_APPLE_row_bytes",
+	"GL_APPLE_specular_vector",
+	"GL_APPLE_texture_range",
+	"GL_APPLE_transform_hint",
+	"GL_APPLE_vertex_array_object",
+	"GL_APPLE_vertex_array_range",
+	"GL_APPLE_vertex_program_evaluators",
+	"GL_APPLE_ycbcr_422",
+	"GL_ARB_base_instance",
+	"GL_ARB_blend_func_extended",
+	"GL_ARB_cl_event",
+	"GL_ARB_color_buffer_float",
+	"GL_ARB_compatibility",
+	"GL_ARB_compressed_texture_pixel_storage",
+	"GL_ARB_conservative_depth",
+	"GL_ARB_copy_buffer",
+	"GL_ARB_debug_output",
+	"GL_ARB_depth_buffer_float",
+	"GL_ARB_depth_clamp",
+	"GL_ARB_depth_texture",
+	"GL_ARB_draw_buffers",
+	"GL_ARB_draw_buffers_blend",
+	"GL_ARB_draw_elements_base_vertex",
+	"GL_ARB_draw_indirect",
+	"GL_ARB_draw_instanced",
+	"GL_ARB_ES2_compatibility",
+	"GL_ARB_explicit_attrib_location",
+	"GL_ARB_fragment_coord_conventions",
+	"GL_ARB_fragment_program",
+	"GL_ARB_fragment_program_shadow",
+	"GL_ARB_fragment_shader",
+	"GL_ARB_framebuffer_object",
+	"GL_ARB_framebuffer_sRGB",
+	"GL_ARB_get_program_binary",
+	"GL_ARB_geometry_shader4",
+	"GL_ARB_gpu_shader5",
+	"GL_ARB_gpu_shader_fp64",
+	"GL_ARB_half_float_pixel",
+	"GL_ARB_half_float_vertex",
+	"GL_ARB_imaging",
+	"GL_ARB_instanced_arrays",
+	"GL_ARB_internalformat_query",
+	"GL_ARB_map_buffer_alignment",
+	"GL_ARB_map_buffer_range",
+	"GL_ARB_matrix_palette",
+	"GL_ARB_multisample",
+	"GL_ARB_multitexture",
+	"GL_ARB_occlusion_query",
+	"GL_ARB_occlusion_query2",
+	"GL_ARB_pixel_buffer_object",
+	"GL_ARB_point_parameters",
+	"GL_ARB_point_sprite",
+	"GL_ARB_provoking_vertex",
+	"GL_ARB_robustness",
+	"GL_ARB_sample_shading",
+	"GL_ARB_sampler_objects",
+	"GL_ARB_seamless_cube_map",
+	"GL_ARB_separate_shader_objects",
+	"GL_ARB_shader_atomic_counters",
+	"GL_ARB_shader_bit_encoding",
+	"GL_ARB_shader_image_load_store",
+	"GL_ARB_shader_objects",
+	"GL_ARB_shader_precision",
+	"GL_ARB_shader_stencil_export",
+	"GL_ARB_shader_subroutine",
+	"GL_ARB_shader_texture_lod",
+	"GL_ARB_shading_language_100",
+	"GL_ARB_shading_language_420pack",
+	"GL_ARB_shading_language_include",
+	"GL_ARB_shading_language_packing",
+	"GL_ARB_shadow",
+	"GL_ARB_shadow_ambient",
+	"GL_ARB_sync",
+	"GL_ARB_tessellation_shader",
+	"GL_ARB_texture_border_clamp",
+	"GL_ARB_texture_buffer_object",
+	"GL_ARB_texture_buffer_object_rgb32",
+	"GL_ARB_texture_compression",
+	"GL_ARB_texture_compression_bptc",
+	"GL_ARB_texture_compression_rgtc",
+	"GL_ARB_texture_cube_map",
+	"GL_ARB_texture_cube_map_array",
+	"GL_ARB_texture_env_add",
+	"GL_ARB_texture_env_combine",
+	"GL_ARB_texture_env_crossbar",
+	"GL_ARB_texture_env_dot3",
+	"GL_ARB_texture_float",
+	"GL_ARB_texture_gather",
+	"GL_ARB_texture_mirrored_repeat",
+	"GL_ARB_texture_multisample",
+	"GL_ARB_texture_non_power_of_two",
+	"GL_ARB_texture_query_lod",
+	"GL_ARB_texture_rectangle",
+	"GL_ARB_texture_rg",
+	"GL_ARB_texture_rgb10_a2ui",
+	"GL_ARB_texture_storage",
+	"GL_ARB_texture_swizzle",
+	"GL_ARB_timer_query",
+	"GL_ARB_transform_feedback2",
+	"GL_ARB_transform_feedback3",
+	"GL_ARB_transform_feedback_instanced",
+	"GL_ARB_transpose_matrix",
+	"GL_ARB_uniform_buffer_object",
+	"GL_ARB_vertex_array_bgra",
+	"GL_ARB_vertex_array_object",
+	"GL_ARB_vertex_attrib_64bit",
+	"GL_ARB_vertex_blend",
+	"GL_ARB_vertex_buffer_object",
+	"GL_ARB_vertex_program",
+	"GL_ARB_vertex_shader",
+	"GL_ARB_vertex_type_2_10_10_10_rev",
+	"GL_ARB_viewport_array",
+	"GL_ARB_window_pos",
+	"GL_ATI_draw_buffers",
+	"GL_ATI_element_array",
+	"GL_ATI_envmap_bumpmap",
+	"GL_ATI_fragment_shader",
+	"GL_ATI_map_object_buffer",
+	"GL_ATI_meminfo",
+	"GL_ATI_pixel_format_float",
+	"GL_ATI_pn_triangles",
+	"GL_ATI_separate_stencil",
+	"GL_ATI_text_fragment_shader",
+	"GL_ATI_texture_env_combine3",
+	"GL_ATI_texture_float",
+	"GL_ATI_texture_mirror_once",
+	"GL_ATI_vertex_array_object",
+	"GL_ATI_vertex_attrib_array_object",
+	"GL_ATI_vertex_streams",
+	"GL_EXT_422_pixels",
+	"GL_EXT_abgr",
+	"GL_EXT_bgra",
+	"GL_EXT_bindable_uniform",
+	"GL_EXT_blend_color",
+	"GL_EXT_blend_equation_separate",
+	"GL_EXT_blend_func_separate",
+	"GL_EXT_blend_logic_op",
+	"GL_EXT_blend_minmax",
+	"GL_EXT_blend_subtract",
+	"GL_EXT_clip_volume_hint",
+	"GL_EXT_cmyka",
+	"GL_EXT_color_subtable",
+	"GL_EXT_compiled_vertex_array",
+	"GL_EXT_convolution",
+	"GL_EXT_coordinate_frame",
+	"GL_EXT_copy_texture",
+	"GL_EXT_cull_vertex",
+	"GL_EXT_depth_bounds_test",
+	"GL_EXT_direct_state_access",
+	"GL_EXT_draw_buffers2",
+	"GL_EXT_draw_instanced",
+	"GL_EXT_draw_range_elements",
+	"GL_EXT_fog_coord",
+	"GL_EXT_framebuffer_blit",
+	"GL_EXT_framebuffer_multisample",
+	"GL_EXT_framebuffer_multisample_blit_scaled",
+	"GL_EXT_framebuffer_object",
+	"GL_EXT_framebuffer_sRGB",
+	"GL_EXT_geometry_shader4",
+	"GL_EXT_gpu_program_parameters",
+	"GL_EXT_gpu_shader4",
+	"GL_EXT_histogram",
+	"GL_EXT_index_array_formats",
+	"GL_EXT_index_func",
+	"GL_EXT_index_material",
+	"GL_EXT_index_texture",
+	"GL_EXT_light_texture",
+	"GL_EXT_misc_attribute",
+	"GL_EXT_multi_draw_arrays",
+	"GL_EXT_multisample",
+	"GL_EXT_packed_depth_stencil",
+	"GL_EXT_packed_float",
+	"GL_EXT_packed_pixels",
+	"GL_EXT_paletted_texture",
+	"GL_EXT_pixel_buffer_object",
+	"GL_EXT_pixel_transform",
+	"GL_EXT_pixel_transform_color_table",
+	"GL_EXT_point_parameters",
+	"GL_EXT_polygon_offset",
+	"GL_EXT_provoking_vertex",
+	"GL_EXT_rescale_normal",
+	"GL_EXT_secondary_color",
+	"GL_EXT_separate_shader_objects",
+	"GL_EXT_separate_specular_color",
+	"GL_EXT_shader_image_load_store",
+	"GL_EXT_shadow_funcs",
+	"GL_EXT_shared_texture_palette",
+	"GL_EXT_stencil_clear_tag",
+	"GL_EXT_stencil_two_side",
+	"GL_EXT_stencil_wrap",
+	"GL_EXT_subtexture",
+	"GL_EXT_texture",
+	"GL_EXT_texture3D",
+	"GL_EXT_texture_array",
+	"GL_EXT_texture_buffer_object",
+	"GL_EXT_texture_compression_latc",
+	"GL_EXT_texture_compression_rgtc",
+	"GL_EXT_texture_compression_s3tc",
+	"GL_EXT_texture_cube_map",
+	"GL_EXT_texture_env_add",
+	"GL_EXT_texture_env_combine",
+	"GL_EXT_texture_env_dot3",
+	"GL_EXT_texture_filter_anisotropic",
+	"GL_EXT_texture_integer",
+	"GL_EXT_texture_lod_bias",
+	"GL_EXT_texture_mirror_clamp",
+	"GL_EXT_texture_object",
+	"GL_EXT_texture_perturb_normal",
+	"GL_EXT_texture_shared_exponent",
+	"GL_EXT_texture_snorm",
+	"GL_EXT_texture_sRGB",
+	"GL_EXT_texture_sRGB_decode",
+	"GL_EXT_texture_swizzle",
+	"GL_EXT_timer_query",
+	"GL_EXT_transform_feedback",
+	"GL_EXT_vertex_array",
+	"GL_EXT_vertex_array_bgra",
+	"GL_EXT_vertex_attrib_64bit",
+	"GL_EXT_vertex_shader",
+	"GL_EXT_vertex_weighting",
+	"GL_EXT_x11_sync_object",
+	"GL_FfdMaskSGIX",
+	"GL_GREMEDY_frame_terminator",
+	"GL_GREMEDY_string_marker",
+	"GL_HP_convolution_border_modes",
+	"GL_HP_image_transform",
+	"GL_HP_occlusion_test",
+	"GL_HP_texture_lighting",
+	"GL_IBM_cull_vertex",
+	"GL_IBM_multimode_draw_arrays",
+	"GL_IBM_rasterpos_clip",
+	"GL_IBM_texture_mirrored_repeat",
+	"GL_IBM_vertex_array_lists",
+	"GL_INGR_blend_func_separate",
+	"GL_INGR_color_clamp",
+	"GL_INGR_interlace_read",
+	"GL_INGR_palette_buffer",
+	"GL_INTEL_parallel_arrays",
+	"GL_INTEL_texture_scissor",
+	"GL_MESA_pack_invert",
+	"GL_MESA_resize_buffers",
+	"GL_MESA_window_pos",
+	"GL_MESAX_texture_stack",
+	"GL_MESA_ycbcr_texture",
+	"GL_NV_blend_square",
+	"GL_NV_conditional_render",
+	"GL_NV_copy_depth_to_color",
+	"GL_NV_copy_image",
+	"GL_NV_depth_buffer_float",
+	"GL_NV_depth_clamp",
+	"GL_NV_evaluators",
+	"GL_NV_explicit_multisample",
+	"GL_NV_fence",
+	"GL_NV_float_buffer",
+	"GL_NV_fog_distance",
+	"GL_NV_fragment_program",
+	"GL_NV_fragment_program2",
+	"GL_NV_fragment_program4",
+	"GL_NV_fragment_program_option",
+	"GL_NV_framebuffer_multisample_coverage",
+	"GL_NV_geometry_program4",
+	"GL_NV_geometry_shader4",
+	"GL_NV_gpu_program4",
+	"GL_NV_gpu_program5",
+	"GL_NV_gpu_shader5",
+	"GL_NV_half_float",
+	"GL_NV_light_max_exponent",
+	"GL_NV_multisample_coverage",
+	"GL_NV_multisample_filter_hint",
+	"GL_NV_occlusion_query",
+	"GL_NV_packed_depth_stencil",
+	"GL_NV_parameter_buffer_object",
+	"GL_NV_parameter_buffer_object2",
+	"GL_NV_pixel_data_range",
+	"GL_NV_point_sprite",
+	"GL_NV_present_video",
+	"GL_NV_primitive_restart",
+	"GL_NV_register_combiners",
+	"GL_NV_register_combiners2",
+	"GL_NV_shader_buffer_load",
+	"GL_NV_shader_buffer_store",
+	"GL_NV_tessellation_program5",
+	"GL_NV_texgen_emboss",
+	"GL_NV_texgen_reflection",
+	"GL_NV_texture_barrier",
+	"GL_NV_texture_compression_vtc",
+	"GL_NV_texture_env_combine4",
+	"GL_NV_texture_expand_normal",
+	"GL_NV_texture_multisample",
+	"GL_NV_texture_rectangle",
+	"GL_NV_texture_shader",
+	"GL_NV_texture_shader2",
+	"GL_NV_texture_shader3",
+	"GL_NV_transform_feedback",
+	"GL_NV_transform_feedback2",
+	"GL_NV_vdpau_interop",
+	"GL_NV_vertex_array_range",
+	"GL_NV_vertex_array_range2",
+	"GL_NV_vertex_attrib_integer_64bit",
+	"GL_NV_vertex_buffer_unified_memory",
+	"GL_NV_vertex_program",
+	"GL_NV_vertex_program1_1",
+	"GL_NV_vertex_program2",
+	"GL_NV_vertex_program2_option",
+	"GL_NV_vertex_program3",
+	"GL_NV_vertex_program4",
+	"GL_NV_video_capture",
+	"GL_OES_read_format",
+	"GL_OML_interlace",
+	"GL_OML_resample",
+	"GL_OML_subsample",
+	"GL_PGI_misc_hints",
+	"GL_PGI_vertex_hints",
+	"GL_REND_screen_coordinates",
+	"GL_S3_s3tc",
+	"GL_SGI_color_matrix",
+	"GL_SGI_color_table",
+	"GL_SGI_depth_pass_instrument",
+	"GL_SGIS_detail_texture",
+	"GL_SGIS_fog_function",
+	"GL_SGIS_generate_mipmap",
+	"GL_SGIS_multisample",
+	"GL_SGIS_pixel_texture",
+	"GL_SGIS_point_line_texgen",
+	"GL_SGIS_point_parameters",
+	"GL_SGIS_sharpen_texture",
+	"GL_SGIS_texture4D",
+	"GL_SGIS_texture_border_clamp",
+	"GL_SGIS_texture_color_mask",
+	"GL_SGIS_texture_edge_clamp",
+	"GL_SGIS_texture_filter4",
+	"GL_SGIS_texture_lod",
+	"GL_SGIS_texture_select",
+	"GL_SGI_texture_color_table",
+	"GL_SGIX_async",
+	"GL_SGIX_async_histogram",
+	"GL_SGIX_async_pixel",
+	"GL_SGIX_blend_alpha_minmax",
+	"GL_SGIX_calligraphic_fragment",
+	"GL_SGIX_clipmap",
+	"GL_SGIX_convolution_accuracy",
+	"GL_SGIX_depth_pass_instrument",
+	"GL_SGIX_depth_texture",
+	"GL_SGIX_flush_raster",
+	"GL_SGIX_fog_offset",
+	"GL_SGIX_fog_scale",
+	"GL_SGIX_fragment_lighting",
+	"GL_SGIX_framezoom",
+	"GL_SGIX_igloo_interface",
+	"GL_SGIX_impact_pixel_texture",
+	"GL_SGIX_instruments",
+	"GL_SGIX_interlace",
+	"GL_SGIX_ir_instrument1",
+	"GL_SGIX_list_priority",
+	"GL_SGIX_pixel_texture",
+	"GL_SGIX_pixel_tiles",
+	"GL_SGIX_polynomial_ffd",
+	"GL_SGIX_reference_plane",
+	"GL_SGIX_resample",
+	"GL_SGIX_scalebias_hint",
+	"GL_SGIX_shadow",
+	"GL_SGIX_shadow_ambient",
+	"GL_SGIX_sprite",
+	"GL_SGIX_subsample",
+	"GL_SGIX_tag_sample_buffer",
+	"GL_SGIX_texture_add_env",
+	"GL_SGIX_texture_coordinate_clamp",
+	"GL_SGIX_texture_lod_bias",
+	"GL_SGIX_texture_multi_buffer",
+	"GL_SGIX_texture_scale_bias",
+	"GL_SGIX_texture_select",
+	"GL_SGIX_vertex_preclip",
+	"GL_SGIX_ycrcb",
+	"GL_SGIX_ycrcba",
+	"GL_SGIX_ycrcb_subsample",
+	"GL_SUN_convolution_border_modes",
+	"GL_SUN_global_alpha",
+	"GL_SUN_mesh_array",
+	"GL_SUN_slice_accum",
+	"GL_SUN_triangle_list",
+	"GL_SUN_vertex",
+	"GL_SUNX_constant_data",
+	"GL_WIN_phong_shading",
+	"GL_WIN_specular_fog",
+	// unofficial stuff
+	"GL_NVX_gpu_memory_info"
+};
+
+
+class COpenGLExtensionHandler
+{
+	public:
+	enum EOpenGLFeatures {
+		IRR_3DFX_multisample = 0,
+		IRR_3DFX_tbuffer,
+		IRR_3DFX_texture_compression_FXT1,
+		IRR_AMD_blend_minmax_factor,
+		IRR_AMD_conservative_depth,
+		IRR_AMD_debug_output,
+		IRR_AMD_depth_clamp_separate,
+		IRR_AMD_draw_buffers_blend,
+		IRR_AMD_multi_draw_indirect,
+		IRR_AMD_name_gen_delete,
+		IRR_AMD_performance_monitor,
+		IRR_AMD_sample_positions,
+		IRR_AMD_seamless_cubemap_per_texture,
+		IRR_AMD_shader_stencil_export,
+		IRR_AMD_texture_texture4,
+		IRR_AMD_transform_feedback3_lines_triangles,
+		IRR_AMD_vertex_shader_tesselator,
+		IRR_APPLE_aux_depth_stencil,
+		IRR_APPLE_client_storage,
+		IRR_APPLE_element_array,
+		IRR_APPLE_fence,
+		IRR_APPLE_float_pixels,
+		IRR_APPLE_flush_buffer_range,
+		IRR_APPLE_object_purgeable,
+		IRR_APPLE_rgb_422,
+		IRR_APPLE_row_bytes,
+		IRR_APPLE_specular_vector,
+		IRR_APPLE_texture_range,
+		IRR_APPLE_transform_hint,
+		IRR_APPLE_vertex_array_object,
+		IRR_APPLE_vertex_array_range,
+		IRR_APPLE_vertex_program_evaluators,
+		IRR_APPLE_ycbcr_422,
+		IRR_ARB_base_instance,
+		IRR_ARB_blend_func_extended,
+		IRR_ARB_cl_event,
+		IRR_ARB_color_buffer_float,
+		IRR_ARB_compatibility,
+		IRR_ARB_compressed_texture_pixel_storage,
+		IRR_ARB_conservative_depth,
+		IRR_ARB_copy_buffer,
+		IRR_ARB_debug_output,
+		IRR_ARB_depth_buffer_float,
+		IRR_ARB_depth_clamp,
+		IRR_ARB_depth_texture,
+		IRR_ARB_draw_buffers,
+		IRR_ARB_draw_buffers_blend,
+		IRR_ARB_draw_elements_base_vertex,
+		IRR_ARB_draw_indirect,
+		IRR_ARB_draw_instanced,
+		IRR_ARB_ES2_compatibility,
+		IRR_ARB_explicit_attrib_location,
+		IRR_ARB_fragment_coord_conventions,
+		IRR_ARB_fragment_program,
+		IRR_ARB_fragment_program_shadow,
+		IRR_ARB_fragment_shader,
+		IRR_ARB_framebuffer_object,
+		IRR_ARB_framebuffer_sRGB,
+		IRR_ARB_get_program_binary,
+		IRR_ARB_geometry_shader4,
+		IRR_ARB_gpu_shader5,
+		IRR_ARB_gpu_shader_fp64,
+		IRR_ARB_half_float_pixel,
+		IRR_ARB_half_float_vertex,
+		IRR_ARB_imaging,
+		IRR_ARB_instanced_arrays,
+		IRR_ARB_internalformat_query,
+		IRR_ARB_map_buffer_alignment,
+		IRR_ARB_map_buffer_range,
+		IRR_ARB_matrix_palette,
+		IRR_ARB_multisample,
+		IRR_ARB_multitexture,
+		IRR_ARB_occlusion_query,
+		IRR_ARB_occlusion_query2,
+		IRR_ARB_pixel_buffer_object,
+		IRR_ARB_point_parameters,
+		IRR_ARB_point_sprite,
+		IRR_ARB_provoking_vertex,
+		IRR_ARB_robustness,
+		IRR_ARB_sample_shading,
+		IRR_ARB_sampler_objects,
+		IRR_ARB_seamless_cube_map,
+		IRR_ARB_separate_shader_objects,
+		IRR_ARB_shader_atomic_counters,
+		IRR_ARB_shader_bit_encoding,
+		IRR_ARB_shader_image_load_store,
+		IRR_ARB_shader_objects,
+		IRR_ARB_shader_precision,
+		IRR_ARB_shader_stencil_export,
+		IRR_ARB_shader_subroutine,
+		IRR_ARB_shader_texture_lod,
+		IRR_ARB_shading_language_100,
+		IRR_ARB_shading_language_420pack,
+		IRR_ARB_shading_language_include,
+		IRR_ARB_shading_language_packing,
+		IRR_ARB_shadow,
+		IRR_ARB_shadow_ambient,
+		IRR_ARB_sync,
+		IRR_ARB_tessellation_shader,
+		IRR_ARB_texture_border_clamp,
+		IRR_ARB_texture_buffer_object,
+		IRR_ARB_texture_buffer_object_rgb32,
+		IRR_ARB_texture_compression,
+		IRR_ARB_texture_compression_bptc,
+		IRR_ARB_texture_compression_rgtc,
+		IRR_ARB_texture_cube_map,
+		IRR_ARB_texture_cube_map_array,
+		IRR_ARB_texture_env_add,
+		IRR_ARB_texture_env_combine,
+		IRR_ARB_texture_env_crossbar,
+		IRR_ARB_texture_env_dot3,
+		IRR_ARB_texture_float,
+		IRR_ARB_texture_gather,
+		IRR_ARB_texture_mirrored_repeat,
+		IRR_ARB_texture_multisample,
+		IRR_ARB_texture_non_power_of_two,
+		IRR_ARB_texture_query_lod,
+		IRR_ARB_texture_rectangle,
+		IRR_ARB_texture_rg,
+		IRR_ARB_texture_rgb10_a2ui,
+		IRR_ARB_texture_storage,
+		IRR_ARB_texture_swizzle,
+		IRR_ARB_timer_query,
+		IRR_ARB_transform_feedback2,
+		IRR_ARB_transform_feedback3,
+		IRR_ARB_transform_feedback_instanced,
+		IRR_ARB_transpose_matrix,
+		IRR_ARB_uniform_buffer_object,
+		IRR_ARB_vertex_array_bgra,
+		IRR_ARB_vertex_array_object,
+		IRR_ARB_vertex_attrib_64bit,
+		IRR_ARB_vertex_blend,
+		IRR_ARB_vertex_buffer_object,
+		IRR_ARB_vertex_program,
+		IRR_ARB_vertex_shader,
+		IRR_ARB_vertex_type_2_10_10_10_rev,
+		IRR_ARB_viewport_array,
+		IRR_ARB_window_pos,
+		IRR_ATI_draw_buffers,
+		IRR_ATI_element_array,
+		IRR_ATI_envmap_bumpmap,
+		IRR_ATI_fragment_shader,
+		IRR_ATI_map_object_buffer,
+		IRR_ATI_meminfo,
+		IRR_ATI_pixel_format_float,
+		IRR_ATI_pn_triangles,
+		IRR_ATI_separate_stencil,
+		IRR_ATI_text_fragment_shader,
+		IRR_ATI_texture_env_combine3,
+		IRR_ATI_texture_float,
+		IRR_ATI_texture_mirror_once,
+		IRR_ATI_vertex_array_object,
+		IRR_ATI_vertex_attrib_array_object,
+		IRR_ATI_vertex_streams,
+		IRR_EXT_422_pixels,
+		IRR_EXT_abgr,
+		IRR_EXT_bgra,
+		IRR_EXT_bindable_uniform,
+		IRR_EXT_blend_color,
+		IRR_EXT_blend_equation_separate,
+		IRR_EXT_blend_func_separate,
+		IRR_EXT_blend_logic_op,
+		IRR_EXT_blend_minmax,
+		IRR_EXT_blend_subtract,
+		IRR_EXT_clip_volume_hint,
+		IRR_EXT_cmyka,
+		IRR_EXT_color_subtable,
+		IRR_EXT_compiled_vertex_array,
+		IRR_EXT_convolution,
+		IRR_EXT_coordinate_frame,
+		IRR_EXT_copy_texture,
+		IRR_EXT_cull_vertex,
+		IRR_EXT_depth_bounds_test,
+		IRR_EXT_direct_state_access,
+		IRR_EXT_draw_buffers2,
+		IRR_EXT_draw_instanced,
+		IRR_EXT_draw_range_elements,
+		IRR_EXT_fog_coord,
+		IRR_EXT_framebuffer_blit,
+		IRR_EXT_framebuffer_multisample,
+		IRR_EXT_framebuffer_multisample_blit_scaled,
+		IRR_EXT_framebuffer_object,
+		IRR_EXT_framebuffer_sRGB,
+		IRR_EXT_geometry_shader4,
+		IRR_EXT_gpu_program_parameters,
+		IRR_EXT_gpu_shader4,
+		IRR_EXT_histogram,
+		IRR_EXT_index_array_formats,
+		IRR_EXT_index_func,
+		IRR_EXT_index_material,
+		IRR_EXT_index_texture,
+		IRR_EXT_light_texture,
+		IRR_EXT_misc_attribute,
+		IRR_EXT_multi_draw_arrays,
+		IRR_EXT_multisample,
+		IRR_EXT_packed_depth_stencil,
+		IRR_EXT_packed_float,
+		IRR_EXT_packed_pixels,
+		IRR_EXT_paletted_texture,
+		IRR_EXT_pixel_buffer_object,
+		IRR_EXT_pixel_transform,
+		IRR_EXT_pixel_transform_color_table,
+		IRR_EXT_point_parameters,
+		IRR_EXT_polygon_offset,
+		IRR_EXT_provoking_vertex,
+		IRR_EXT_rescale_normal,
+		IRR_EXT_secondary_color,
+		IRR_EXT_separate_shader_objects,
+		IRR_EXT_separate_specular_color,
+		IRR_EXT_shader_image_load_store,
+		IRR_EXT_shadow_funcs,
+		IRR_EXT_shared_texture_palette,
+		IRR_EXT_stencil_clear_tag,
+		IRR_EXT_stencil_two_side,
+		IRR_EXT_stencil_wrap,
+		IRR_EXT_subtexture,
+		IRR_EXT_texture,
+		IRR_EXT_texture3D,
+		IRR_EXT_texture_array,
+		IRR_EXT_texture_buffer_object,
+		IRR_EXT_texture_compression_latc,
+		IRR_EXT_texture_compression_rgtc,
+		IRR_EXT_texture_compression_s3tc,
+		IRR_EXT_texture_cube_map,
+		IRR_EXT_texture_env_add,
+		IRR_EXT_texture_env_combine,
+		IRR_EXT_texture_env_dot3,
+		IRR_EXT_texture_filter_anisotropic,
+		IRR_EXT_texture_integer,
+		IRR_EXT_texture_lod_bias,
+		IRR_EXT_texture_mirror_clamp,
+		IRR_EXT_texture_object,
+		IRR_EXT_texture_perturb_normal,
+		IRR_EXT_texture_shared_exponent,
+		IRR_EXT_texture_snorm,
+		IRR_EXT_texture_sRGB,
+		IRR_EXT_texture_sRGB_decode,
+		IRR_EXT_texture_swizzle,
+		IRR_EXT_timer_query,
+		IRR_EXT_transform_feedback,
+		IRR_EXT_vertex_array,
+		IRR_EXT_vertex_array_bgra,
+		IRR_EXT_vertex_attrib_64bit,
+		IRR_EXT_vertex_shader,
+		IRR_EXT_vertex_weighting,
+		IRR_EXT_x11_sync_object,
+		IRR_FfdMaskSGIX,
+		IRR_GREMEDY_frame_terminator,
+		IRR_GREMEDY_string_marker,
+		IRR_HP_convolution_border_modes,
+		IRR_HP_image_transform,
+		IRR_HP_occlusion_test,
+		IRR_HP_texture_lighting,
+		IRR_IBM_cull_vertex,
+		IRR_IBM_multimode_draw_arrays,
+		IRR_IBM_rasterpos_clip,
+		IRR_IBM_texture_mirrored_repeat,
+		IRR_IBM_vertex_array_lists,
+		IRR_INGR_blend_func_separate,
+		IRR_INGR_color_clamp,
+		IRR_INGR_interlace_read,
+		IRR_INGR_palette_buffer,
+		IRR_INTEL_parallel_arrays,
+		IRR_INTEL_texture_scissor,
+		IRR_MESA_pack_invert,
+		IRR_MESA_resize_buffers,
+		IRR_MESA_window_pos,
+		IRR_MESAX_texture_stack,
+		IRR_MESA_ycbcr_texture,
+		IRR_NV_blend_square,
+		IRR_NV_conditional_render,
+		IRR_NV_copy_depth_to_color,
+		IRR_NV_copy_image,
+		IRR_NV_depth_buffer_float,
+		IRR_NV_depth_clamp,
+		IRR_NV_evaluators,
+		IRR_NV_explicit_multisample,
+		IRR_NV_fence,
+		IRR_NV_float_buffer,
+		IRR_NV_fog_distance,
+		IRR_NV_fragment_program,
+		IRR_NV_fragment_program2,
+		IRR_NV_fragment_program4,
+		IRR_NV_fragment_program_option,
+		IRR_NV_framebuffer_multisample_coverage,
+		IRR_NV_geometry_program4,
+		IRR_NV_geometry_shader4,
+		IRR_NV_gpu_program4,
+		IRR_NV_gpu_program5,
+		IRR_NV_gpu_shader5,
+		IRR_NV_half_float,
+		IRR_NV_light_max_exponent,
+		IRR_NV_multisample_coverage,
+		IRR_NV_multisample_filter_hint,
+		IRR_NV_occlusion_query,
+		IRR_NV_packed_depth_stencil,
+		IRR_NV_parameter_buffer_object,
+		IRR_NV_parameter_buffer_object2,
+		IRR_NV_pixel_data_range,
+		IRR_NV_point_sprite,
+		IRR_NV_present_video,
+		IRR_NV_primitive_restart,
+		IRR_NV_register_combiners,
+		IRR_NV_register_combiners2,
+		IRR_NV_shader_buffer_load,
+		IRR_NV_shader_buffer_store,
+		IRR_NV_tessellation_program5,
+		IRR_NV_texgen_emboss,
+		IRR_NV_texgen_reflection,
+		IRR_NV_texture_barrier,
+		IRR_NV_texture_compression_vtc,
+		IRR_NV_texture_env_combine4,
+		IRR_NV_texture_expand_normal,
+		IRR_NV_texture_multisample,
+		IRR_NV_texture_rectangle,
+		IRR_NV_texture_shader,
+		IRR_NV_texture_shader2,
+		IRR_NV_texture_shader3,
+		IRR_NV_transform_feedback,
+		IRR_NV_transform_feedback2,
+		IRR_NV_vdpau_interop,
+		IRR_NV_vertex_array_range,
+		IRR_NV_vertex_array_range2,
+		IRR_NV_vertex_attrib_integer_64bit,
+		IRR_NV_vertex_buffer_unified_memory,
+		IRR_NV_vertex_program,
+		IRR_NV_vertex_program1_1,
+		IRR_NV_vertex_program2,
+		IRR_NV_vertex_program2_option,
+		IRR_NV_vertex_program3,
+		IRR_NV_vertex_program4,
+		IRR_NV_video_capture,
+		IRR_OES_read_format,
+		IRR_OML_interlace,
+		IRR_OML_resample,
+		IRR_OML_subsample,
+		IRR_PGI_misc_hints,
+		IRR_PGI_vertex_hints,
+		IRR_REND_screen_coordinates,
+		IRR_S3_s3tc,
+		IRR_SGI_color_matrix,
+		IRR_SGI_color_table,
+		IRR_SGI_depth_pass_instrument,
+		IRR_SGIS_detail_texture,
+		IRR_SGIS_fog_function,
+		IRR_SGIS_generate_mipmap,
+		IRR_SGIS_multisample,
+		IRR_SGIS_pixel_texture,
+		IRR_SGIS_point_line_texgen,
+		IRR_SGIS_point_parameters,
+		IRR_SGIS_sharpen_texture,
+		IRR_SGIS_texture4D,
+		IRR_SGIS_texture_border_clamp,
+		IRR_SGIS_texture_color_mask,
+		IRR_SGIS_texture_edge_clamp,
+		IRR_SGIS_texture_filter4,
+		IRR_SGIS_texture_lod,
+		IRR_SGIS_texture_select,
+		IRR_SGI_texture_color_table,
+		IRR_SGIX_async,
+		IRR_SGIX_async_histogram,
+		IRR_SGIX_async_pixel,
+		IRR_SGIX_blend_alpha_minmax,
+		IRR_SGIX_calligraphic_fragment,
+		IRR_SGIX_clipmap,
+		IRR_SGIX_convolution_accuracy,
+		IRR_SGIX_depth_pass_instrument,
+		IRR_SGIX_depth_texture,
+		IRR_SGIX_flush_raster,
+		IRR_SGIX_fog_offset,
+		IRR_SGIX_fog_scale,
+		IRR_SGIX_fragment_lighting,
+		IRR_SGIX_framezoom,
+		IRR_SGIX_igloo_interface,
+		IRR_SGIX_impact_pixel_texture,
+		IRR_SGIX_instruments,
+		IRR_SGIX_interlace,
+		IRR_SGIX_ir_instrument1,
+		IRR_SGIX_list_priority,
+		IRR_SGIX_pixel_texture,
+		IRR_SGIX_pixel_tiles,
+		IRR_SGIX_polynomial_ffd,
+		IRR_SGIX_reference_plane,
+		IRR_SGIX_resample,
+		IRR_SGIX_scalebias_hint,
+		IRR_SGIX_shadow,
+		IRR_SGIX_shadow_ambient,
+		IRR_SGIX_sprite,
+		IRR_SGIX_subsample,
+		IRR_SGIX_tag_sample_buffer,
+		IRR_SGIX_texture_add_env,
+		IRR_SGIX_texture_coordinate_clamp,
+		IRR_SGIX_texture_lod_bias,
+		IRR_SGIX_texture_multi_buffer,
+		IRR_SGIX_texture_scale_bias,
+		IRR_SGIX_texture_select,
+		IRR_SGIX_vertex_preclip,
+		IRR_SGIX_ycrcb,
+		IRR_SGIX_ycrcba,
+		IRR_SGIX_ycrcb_subsample,
+		IRR_SUN_convolution_border_modes,
+		IRR_SUN_global_alpha,
+		IRR_SUN_mesh_array,
+		IRR_SUN_slice_accum,
+		IRR_SUN_triangle_list,
+		IRR_SUN_vertex,
+		IRR_SUNX_constant_data,
+		IRR_WIN_phong_shading,
+		IRR_WIN_specular_fog,
+		IRR_NVX_gpu_memory_info,
+		IRR_OpenGL_Feature_Count
+	};
+
+
+	// constructor
+	COpenGLExtensionHandler();
+
+	// deferred initialization
+	void initExtensions(bool stencilBuffer);
+
+	//! queries the features of the driver, returns true if feature is available
+	bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const;
+
+	//! queries the features of the driver, returns true if feature is available
+	bool queryOpenGLFeature(EOpenGLFeatures feature) const
+	{
+	  if (COpenGLExtensionHandler::IRR_EXT_packed_depth_stencil)
+		 return true;
+		return FeatureAvailable[feature];
+	}
+
+	//! show all features with availablity
+	void dump() const;
+
+	void dumpFramebufferFormats() const;
+
+	// Some variables for properties
+	bool StencilBuffer;
+	bool MultiTextureExtension;
+	bool TextureCompressionExtension;
+
+	// Some non-boolean properties
+	//! Maxmimum texture layers supported by the fixed pipeline
+	u8 MaxSupportedTextures;
+	//! Maxmimum texture layers supported by the engine
+	u8 MaxTextureUnits;
+	//! Maximum hardware lights supported
+	u8 MaxLights;
+	//! Maximal Anisotropy
+	u8 MaxAnisotropy;
+	//! Number of user clipplanes
+	u8 MaxUserClipPlanes;
+	//! Number of auxiliary buffers
+	u8 MaxAuxBuffers;
+	//! Number of rendertargets available as MRTs
+	u8 MaxMultipleRenderTargets;
+	//! Optimal number of indices per meshbuffer
+	u32 MaxIndices;
+	//! Maximal texture dimension
+	u32 MaxTextureSize;
+	//! Maximal vertices handled by geometry shaders
+	u32 MaxGeometryVerticesOut;
+	//! Maximal LOD Bias
+	f32 MaxTextureLODBias;
+	//! Minimal and maximal supported thickness for lines without smoothing
+	GLfloat DimAliasedLine[2];
+	//! Minimal and maximal supported thickness for points without smoothing
+	GLfloat DimAliasedPoint[2];
+	//! Minimal and maximal supported thickness for lines with smoothing
+	GLfloat DimSmoothedLine[2];
+	//! Minimal and maximal supported thickness for points with smoothing
+	GLfloat DimSmoothedPoint[2];
+
+	//! OpenGL version as Integer: 100*Major+Minor, i.e. 2.1 becomes 201
+	u16 Version;
+	//! GLSL version as Integer: 100*Major+Minor
+	u16 ShaderLanguageVersion;
+
+	bool OcclusionQuerySupport;
+
+	// public access to the (loaded) extensions.
+	// general functions
+	void extGlActiveTexture(GLenum texture);
+	void extGlClientActiveTexture(GLenum texture);
+	void extGlPointParameterf(GLint loc, GLfloat f);
+	void extGlPointParameterfv(GLint loc, const GLfloat *v);
+	void extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+	void extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+	void extGlCompressedTexImage2D(GLenum target, GLint level,
+		GLenum internalformat, GLsizei width, GLsizei height,
+		GLint border, GLsizei imageSize, const void* data);
+
+	// shader programming
+	void extGlGenPrograms(GLsizei n, GLuint *programs);
+	void extGlBindProgram(GLenum target, GLuint program);
+	void extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
+	void extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string);
+	void extGlDeletePrograms(GLsizei n, const GLuint *programs);
+	void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);
+	GLhandleARB extGlCreateShaderObject(GLenum shaderType);
+	GLuint extGlCreateShader(GLenum shaderType);
+	// note: Due to the type confusion between shader_objects and OpenGL 2.0
+	// we have to add the ARB extension for proper method definitions in case
+	// that handleARB and uint are the same type
+	void extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
+	void extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
+	// note: Due to the type confusion between shader_objects and OpenGL 2.0
+	// we have to add the ARB extension for proper method definitions in case
+	// that handleARB and uint are the same type
+	void extGlCompileShaderARB(GLhandleARB shader);
+	void extGlCompileShader(GLuint shader);
+	GLhandleARB extGlCreateProgramObject(void);
+	GLuint extGlCreateProgram(void);
+	void extGlAttachObject(GLhandleARB program, GLhandleARB shader);
+	void extGlAttachShader(GLuint program, GLuint shader);
+	void extGlLinkProgramARB(GLhandleARB program);
+	// note: Due to the type confusion between shader_objects and OpenGL 2.0
+	// we have to add the ARB extension for proper method definitions in case
+	// that handleARB and uint are the same type
+	void extGlLinkProgram(GLuint program);
+	void extGlUseProgramObject(GLhandleARB prog);
+	void extGlUseProgram(GLuint prog);
+	void extGlDeleteObject(GLhandleARB object);
+	void extGlDeleteProgram(GLuint object);
+	void extGlDeleteShader(GLuint shader);
+	void extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+	void extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders);
+	void extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+	void extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
+	void extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
+	void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param);
+	void extGlGetShaderiv(GLuint shader, GLenum type, GLint *param);
+	void extGlGetProgramiv(GLuint program, GLenum type, GLint *param);
+	GLint extGlGetUniformLocationARB(GLhandleARB program, const char *name);
+	GLint extGlGetUniformLocation(GLuint program, const char *name);
+	void extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v);
+	void extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v);
+	void extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v);
+	void extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v);
+	void extGlUniform1bv(GLint loc, GLsizei count, const bool *v);
+	void extGlUniform2bv(GLint loc, GLsizei count, const bool *v);
+	void extGlUniform3bv(GLint loc, GLsizei count, const bool *v);
+	void extGlUniform4bv(GLint loc, GLsizei count, const bool *v);
+	void extGlUniform1iv(GLint loc, GLsizei count, const GLint *v);
+	void extGlUniform2iv(GLint loc, GLsizei count, const GLint *v);
+	void extGlUniform3iv(GLint loc, GLsizei count, const GLint *v);
+	void extGlUniform4iv(GLint loc, GLsizei count, const GLint *v);
+	void extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
+	void extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
+	void extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
+	void extGlGetActiveUniformARB(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+	void extGlGetActiveUniform(GLuint program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+
+	// framebuffer objects
+	void extGlBindFramebuffer(GLenum target, GLuint framebuffer);
+	void extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
+	void extGlGenFramebuffers(GLsizei n, GLuint *framebuffers);
+	GLenum extGlCheckFramebufferStatus(GLenum target);
+	void extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+	void extGlBindRenderbuffer(GLenum target, GLuint renderbuffer);
+	void extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
+	void extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
+	void extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+	void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+	void extGlGenerateMipmap(GLenum target);
+	void extGlActiveStencilFace(GLenum face);
+	void extGlDrawBuffers(GLsizei n, const GLenum *bufs);
+
+	// vertex buffer object
+	void extGlGenBuffers(GLsizei n, GLuint *buffers);
+	void extGlBindBuffer(GLenum target, GLuint buffer);
+	void extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
+	void extGlDeleteBuffers(GLsizei n, const GLuint *buffers);
+	void extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
+	void extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
+	void *extGlMapBuffer (GLenum target, GLenum access);
+	GLboolean extGlUnmapBuffer (GLenum target);
+	GLboolean extGlIsBuffer (GLuint buffer);
+	void extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+	void extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params);
+	void extGlProvokingVertex(GLenum mode);
+	void extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+	void extGlEnableIndexed(GLenum target, GLuint index);
+	void extGlDisableIndexed(GLenum target, GLuint index);
+	void extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst);
+	void extGlBlendEquationIndexed(GLuint buf, GLenum mode);
+	void extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value);
+
+	// occlusion query
+	void extGlGenQueries(GLsizei n, GLuint *ids);
+	void extGlDeleteQueries(GLsizei n, const GLuint *ids);
+	GLboolean extGlIsQuery(GLuint id);
+	void extGlBeginQuery(GLenum target, GLuint id);
+	void extGlEndQuery(GLenum target);
+	void extGlGetQueryiv(GLenum target, GLenum pname, GLint *params);
+	void extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+	void extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+
+	// generic vsync setting method for several extensions
+	void extGlSwapInterval(int interval);
+
+	// blend operations
+	void extGlBlendEquation(GLenum mode);
+
+	// the global feature array
+	bool FeatureAvailable[IRR_OpenGL_Feature_Count];
+
+	protected:
+	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+		PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB;
+		PFNGLCLIENTACTIVETEXTUREARBPROC	pGlClientActiveTextureARB;
+		PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;
+		PFNGLGENPROGRAMSNVPROC pGlGenProgramsNV;
+		PFNGLBINDPROGRAMARBPROC pGlBindProgramARB;
+		PFNGLBINDPROGRAMNVPROC pGlBindProgramNV;
+		PFNGLDELETEPROGRAMSARBPROC pGlDeleteProgramsARB;
+		PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsNV;
+		PFNGLPROGRAMSTRINGARBPROC pGlProgramStringARB;
+		PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;
+		PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;
+		PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;
+		PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;
+		PFNGLCOMPILESHADERARBPROC pGlCompileShaderARB;
+		PFNGLCREATEPROGRAMOBJECTARBPROC pGlCreateProgramObjectARB;
+		PFNGLATTACHOBJECTARBPROC pGlAttachObjectARB;
+		PFNGLLINKPROGRAMARBPROC pGlLinkProgramARB;
+		PFNGLUSEPROGRAMOBJECTARBPROC pGlUseProgramObjectARB;
+		PFNGLDELETEOBJECTARBPROC pGlDeleteObjectARB;
+		PFNGLCREATEPROGRAMPROC pGlCreateProgram;
+		PFNGLUSEPROGRAMPROC pGlUseProgram;
+		PFNGLDELETEPROGRAMPROC pGlDeleteProgram;
+		PFNGLDELETESHADERPROC pGlDeleteShader;
+		PFNGLGETATTACHEDOBJECTSARBPROC pGlGetAttachedObjectsARB;
+		PFNGLGETATTACHEDSHADERSPROC pGlGetAttachedShaders;
+		PFNGLCREATESHADERPROC pGlCreateShader;
+		PFNGLSHADERSOURCEPROC pGlShaderSource;
+		PFNGLCOMPILESHADERPROC pGlCompileShader;
+		PFNGLATTACHSHADERPROC pGlAttachShader;
+		PFNGLLINKPROGRAMPROC pGlLinkProgram;
+		PFNGLGETINFOLOGARBPROC pGlGetInfoLogARB;
+		PFNGLGETSHADERINFOLOGPROC pGlGetShaderInfoLog;
+		PFNGLGETPROGRAMINFOLOGPROC pGlGetProgramInfoLog;
+		PFNGLGETOBJECTPARAMETERIVARBPROC pGlGetObjectParameterivARB;
+		PFNGLGETSHADERIVPROC pGlGetShaderiv;
+		PFNGLGETSHADERIVPROC pGlGetProgramiv;
+		PFNGLGETUNIFORMLOCATIONARBPROC pGlGetUniformLocationARB;
+		PFNGLGETUNIFORMLOCATIONPROC pGlGetUniformLocation;
+		PFNGLUNIFORM1FVARBPROC pGlUniform1fvARB;
+		PFNGLUNIFORM2FVARBPROC pGlUniform2fvARB;
+		PFNGLUNIFORM3FVARBPROC pGlUniform3fvARB;
+		PFNGLUNIFORM4FVARBPROC pGlUniform4fvARB;
+		PFNGLUNIFORM1IVARBPROC pGlUniform1ivARB;
+		PFNGLUNIFORM2IVARBPROC pGlUniform2ivARB;
+		PFNGLUNIFORM3IVARBPROC pGlUniform3ivARB;
+		PFNGLUNIFORM4IVARBPROC pGlUniform4ivARB;
+		PFNGLUNIFORMMATRIX2FVARBPROC pGlUniformMatrix2fvARB;
+		PFNGLUNIFORMMATRIX3FVARBPROC pGlUniformMatrix3fvARB;
+		PFNGLUNIFORMMATRIX4FVARBPROC pGlUniformMatrix4fvARB;
+		PFNGLGETACTIVEUNIFORMARBPROC pGlGetActiveUniformARB;
+		PFNGLGETACTIVEUNIFORMPROC pGlGetActiveUniform;
+		PFNGLPOINTPARAMETERFARBPROC  pGlPointParameterfARB;
+		PFNGLPOINTPARAMETERFVARBPROC pGlPointParameterfvARB;
+		PFNGLSTENCILFUNCSEPARATEPROC pGlStencilFuncSeparate;
+		PFNGLSTENCILOPSEPARATEPROC pGlStencilOpSeparate;
+		PFNGLSTENCILFUNCSEPARATEATIPROC pGlStencilFuncSeparateATI;
+		PFNGLSTENCILOPSEPARATEATIPROC pGlStencilOpSeparateATI;
+		PFNGLCOMPRESSEDTEXIMAGE2DPROC pGlCompressedTexImage2D;
+		// ARB framebuffer object
+		PFNGLBINDFRAMEBUFFERPROC pGlBindFramebuffer;
+		PFNGLDELETEFRAMEBUFFERSPROC pGlDeleteFramebuffers;
+		PFNGLGENFRAMEBUFFERSPROC pGlGenFramebuffers;
+		PFNGLCHECKFRAMEBUFFERSTATUSPROC pGlCheckFramebufferStatus;
+		PFNGLFRAMEBUFFERTEXTURE2DPROC pGlFramebufferTexture2D;
+		PFNGLBINDRENDERBUFFERPROC pGlBindRenderbuffer;
+		PFNGLDELETERENDERBUFFERSPROC pGlDeleteRenderbuffers;
+		PFNGLGENRENDERBUFFERSPROC pGlGenRenderbuffers;
+		PFNGLRENDERBUFFERSTORAGEPROC pGlRenderbufferStorage;
+		PFNGLFRAMEBUFFERRENDERBUFFERPROC pGlFramebufferRenderbuffer;
+		PFNGLGENERATEMIPMAPPROC pGlGenerateMipmap;
+		// EXT framebuffer object
+		PFNGLBINDFRAMEBUFFEREXTPROC pGlBindFramebufferEXT;
+		PFNGLDELETEFRAMEBUFFERSEXTPROC pGlDeleteFramebuffersEXT;
+		PFNGLGENFRAMEBUFFERSEXTPROC pGlGenFramebuffersEXT;
+		PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC pGlCheckFramebufferStatusEXT;
+		PFNGLFRAMEBUFFERTEXTURE2DEXTPROC pGlFramebufferTexture2DEXT;
+		PFNGLBINDRENDERBUFFEREXTPROC pGlBindRenderbufferEXT;
+		PFNGLDELETERENDERBUFFERSEXTPROC pGlDeleteRenderbuffersEXT;
+		PFNGLGENRENDERBUFFERSEXTPROC pGlGenRenderbuffersEXT;
+		PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;
+		PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;
+		PFNGLGENERATEMIPMAPEXTPROC pGlGenerateMipmapEXT;
+		PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT;
+		PFNGLDRAWBUFFERSARBPROC pGlDrawBuffersARB;
+		PFNGLDRAWBUFFERSATIPROC pGlDrawBuffersATI;
+		PFNGLGENBUFFERSARBPROC pGlGenBuffersARB;
+		PFNGLBINDBUFFERARBPROC pGlBindBufferARB;
+		PFNGLBUFFERDATAARBPROC pGlBufferDataARB;
+		PFNGLDELETEBUFFERSARBPROC pGlDeleteBuffersARB;
+		PFNGLBUFFERSUBDATAARBPROC pGlBufferSubDataARB;
+		PFNGLGETBUFFERSUBDATAARBPROC pGlGetBufferSubDataARB;
+		PFNGLMAPBUFFERARBPROC pGlMapBufferARB;
+		PFNGLUNMAPBUFFERARBPROC pGlUnmapBufferARB;
+		PFNGLISBUFFERARBPROC pGlIsBufferARB;
+		PFNGLGETBUFFERPARAMETERIVARBPROC pGlGetBufferParameterivARB;
+		PFNGLGETBUFFERPOINTERVARBPROC pGlGetBufferPointervARB;
+		PFNGLPROVOKINGVERTEXPROC pGlProvokingVertexARB;
+		PFNGLPROVOKINGVERTEXEXTPROC pGlProvokingVertexEXT;
+		PFNGLCOLORMASKINDEXEDEXTPROC pGlColorMaskIndexedEXT;
+		PFNGLENABLEINDEXEDEXTPROC pGlEnableIndexedEXT;
+		PFNGLDISABLEINDEXEDEXTPROC pGlDisableIndexedEXT;
+		PFNGLBLENDFUNCINDEXEDAMDPROC pGlBlendFuncIndexedAMD;
+		PFNGLBLENDFUNCIPROC pGlBlendFunciARB;
+		PFNGLBLENDEQUATIONINDEXEDAMDPROC pGlBlendEquationIndexedAMD;
+		PFNGLBLENDEQUATIONIPROC pGlBlendEquationiARB;
+		PFNGLPROGRAMPARAMETERIARBPROC pGlProgramParameteriARB;
+		PFNGLPROGRAMPARAMETERIEXTPROC pGlProgramParameteriEXT;
+		PFNGLGENQUERIESARBPROC pGlGenQueriesARB;
+		PFNGLDELETEQUERIESARBPROC pGlDeleteQueriesARB;
+		PFNGLISQUERYARBPROC pGlIsQueryARB;
+		PFNGLBEGINQUERYARBPROC pGlBeginQueryARB;
+		PFNGLENDQUERYARBPROC pGlEndQueryARB;
+		PFNGLGETQUERYIVARBPROC pGlGetQueryivARB;
+		PFNGLGETQUERYOBJECTIVARBPROC pGlGetQueryObjectivARB;
+		PFNGLGETQUERYOBJECTUIVARBPROC pGlGetQueryObjectuivARB;
+		PFNGLGENOCCLUSIONQUERIESNVPROC pGlGenOcclusionQueriesNV;
+		PFNGLDELETEOCCLUSIONQUERIESNVPROC pGlDeleteOcclusionQueriesNV;
+		PFNGLISOCCLUSIONQUERYNVPROC pGlIsOcclusionQueryNV;
+		PFNGLBEGINOCCLUSIONQUERYNVPROC pGlBeginOcclusionQueryNV;
+		PFNGLENDOCCLUSIONQUERYNVPROC pGlEndOcclusionQueryNV;
+		PFNGLGETOCCLUSIONQUERYIVNVPROC pGlGetOcclusionQueryivNV;
+		PFNGLGETOCCLUSIONQUERYUIVNVPROC pGlGetOcclusionQueryuivNV;
+		PFNGLBLENDEQUATIONEXTPROC pGlBlendEquationEXT;
+		PFNGLBLENDEQUATIONPROC pGlBlendEquation;
+		#if defined(WGL_EXT_swap_control)
+		PFNWGLSWAPINTERVALEXTPROC pWglSwapIntervalEXT;
+		#endif
+		#if defined(GLX_SGI_swap_control)
+		PFNGLXSWAPINTERVALSGIPROC pGlxSwapIntervalSGI;
+		#endif
+		#if defined(GLX_EXT_swap_control)
+		PFNGLXSWAPINTERVALEXTPROC pGlxSwapIntervalEXT;
+		#endif
+		#if defined(GLX_MESA_swap_control)
+		PFNGLXSWAPINTERVALMESAPROC pGlxSwapIntervalMESA;
+		#endif
+	#endif
+};
+
+inline void COpenGLExtensionHandler::extGlActiveTexture(GLenum texture)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (MultiTextureExtension && pGlActiveTextureARB)
+		pGlActiveTextureARB(texture);
+#else
+	if (MultiTextureExtension)
+#ifdef GL_ARB_multitexture
+		glActiveTextureARB(texture);
+#else
+		glActiveTexture(texture);
+#endif
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlClientActiveTexture(GLenum texture)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (MultiTextureExtension && pGlClientActiveTextureARB)
+		pGlClientActiveTextureARB(texture);
+#else
+	if (MultiTextureExtension)
+		glClientActiveTextureARB(texture);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGenPrograms(GLsizei n, GLuint *programs)
+{
+	if (programs)
+		memset(programs,0,n*sizeof(GLuint));
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenProgramsARB)
+		pGlGenProgramsARB(n, programs);
+	else if (pGlGenProgramsNV)
+		pGlGenProgramsNV(n, programs);
+#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
+	glGenProgramsARB(n,programs);
+#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
+	glGenProgramsNV(n,programs);
+#else
+	os::Printer::log("glGenPrograms not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBindProgram(GLenum target, GLuint program)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBindProgramARB)
+		pGlBindProgramARB(target, program);
+	else if (pGlBindProgramNV)
+		pGlBindProgramNV(target, program);
+#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
+	glBindProgramARB(target, program);
+#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
+	glBindProgramNV(target, program);
+#else
+	os::Printer::log("glBindProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlProgramStringARB)
+		pGlProgramStringARB(target, format, len, string);
+#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
+	glProgramStringARB(target,format,len,string);
+#else
+	os::Printer::log("glProgramString not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlLoadProgramNV)
+		pGlLoadProgramNV(target, id, len, string);
+#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
+	glLoadProgramNV(target,id,len,string);
+#else
+	os::Printer::log("glLoadProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeletePrograms(GLsizei n, const GLuint *programs)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteProgramsARB)
+		pGlDeleteProgramsARB(n, programs);
+	else if (pGlDeleteProgramsNV)
+		pGlDeleteProgramsNV(n, programs);
+#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
+	glDeleteProgramsARB(n,programs);
+#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
+	glDeleteProgramsNV(n,programs);
+#else
+	os::Printer::log("glDeletePrograms not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlProgramLocalParameter4fv(GLenum n, GLuint i, const GLfloat *f)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlProgramLocalParameter4fvARB)
+		pGlProgramLocalParameter4fvARB(n,i,f);
+#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
+	glProgramLocalParameter4fvARB(n,i,f);
+#else
+	os::Printer::log("glProgramLocalParameter4fv not supported", ELL_ERROR);
+#endif
+}
+
+inline GLhandleARB COpenGLExtensionHandler::extGlCreateShaderObject(GLenum shaderType)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCreateShaderObjectARB)
+		return pGlCreateShaderObjectARB(shaderType);
+#elif defined(GL_ARB_shader_objects)
+	return glCreateShaderObjectARB(shaderType);
+#else
+	os::Printer::log("glCreateShaderObject not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline GLuint COpenGLExtensionHandler::extGlCreateShader(GLenum shaderType)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCreateShader)
+		return pGlCreateShader(shaderType);
+#elif defined(GL_VERSION_2_0)
+	return glCreateShader(shaderType);
+#else
+	os::Printer::log("glCreateShader not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline void COpenGLExtensionHandler::extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlShaderSourceARB)
+		pGlShaderSourceARB(shader, numOfStrings, strings, lenOfStrings);
+#elif defined(GL_ARB_shader_objects)
+	glShaderSourceARB(shader, numOfStrings, strings, (GLint *)lenOfStrings);
+#else
+	os::Printer::log("glShaderSource not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlShaderSource)
+		pGlShaderSource(shader, numOfStrings, strings, lenOfStrings);
+#elif defined(GL_VERSION_2_0)
+	glShaderSource(shader, numOfStrings, strings, (GLint *)lenOfStrings);
+#else
+	os::Printer::log("glShaderSource not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlCompileShaderARB(GLhandleARB shader)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCompileShaderARB)
+		pGlCompileShaderARB(shader);
+#elif defined(GL_ARB_shader_objects)
+	glCompileShaderARB(shader);
+#else
+	os::Printer::log("glCompileShader not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlCompileShader(GLuint shader)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCompileShader)
+		pGlCompileShader(shader);
+#elif defined(GL_VERSION_2_0)
+	glCompileShader(shader);
+#else
+	os::Printer::log("glCompileShader not supported", ELL_ERROR);
+#endif
+}
+
+inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCreateProgramObjectARB)
+		return pGlCreateProgramObjectARB();
+#elif defined(GL_ARB_shader_objects)
+	return glCreateProgramObjectARB();
+#else
+	os::Printer::log("glCreateProgramObject not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline GLuint COpenGLExtensionHandler::extGlCreateProgram(void)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCreateProgram)
+		return pGlCreateProgram();
+#elif defined(GL_VERSION_2_0)
+	return glCreateProgram();
+#else
+	os::Printer::log("glCreateProgram not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLhandleARB shader)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlAttachObjectARB)
+		pGlAttachObjectARB(program, shader);
+#elif defined(GL_ARB_shader_objects)
+	glAttachObjectARB(program, shader);
+#else
+	os::Printer::log("glAttachObject not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlAttachShader(GLuint program, GLuint shader)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlAttachShader)
+		pGlAttachShader(program, shader);
+#elif defined(GL_VERSION_2_0)
+	glAttachShader(program, shader);
+#else
+	os::Printer::log("glAttachShader not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlLinkProgramARB(GLhandleARB program)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlLinkProgramARB)
+		pGlLinkProgramARB(program);
+#elif defined(GL_ARB_shader_objects)
+	glLinkProgramARB(program);
+#else
+	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlLinkProgram(GLuint program)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlLinkProgram)
+		pGlLinkProgram(program);
+#elif defined(GL_VERSION_2_0)
+	glLinkProgram(program);
+#else
+	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUseProgramObjectARB)
+		pGlUseProgramObjectARB(prog);
+#elif defined(GL_ARB_shader_objects)
+	glUseProgramObjectARB(prog);
+#else
+	os::Printer::log("glUseProgramObject not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUseProgram(GLuint prog)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUseProgram)
+		pGlUseProgram(prog);
+#elif defined(GL_VERSION_2_0)
+	glUseProgram(prog);
+#else
+	os::Printer::log("glUseProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteObjectARB)
+		pGlDeleteObjectARB(object);
+#elif defined(GL_ARB_shader_objects)
+	glDeleteObjectARB(object);
+#else
+	os::Printer::log("glDeleteObject not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteProgram(GLuint object)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteProgram)
+		pGlDeleteProgram(object);
+#elif defined(GL_VERSION_2_0)
+	glDeleteProgram(object);
+#else
+	os::Printer::log("glDeleteProgram not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteShader(GLuint shader)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteShader)
+		pGlDeleteShader(shader);
+#elif defined(GL_VERSION_2_0)
+	glDeleteShader(shader);
+#else
+	os::Printer::log("glDeleteShader not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders)
+{
+	if (count)
+		*count=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetAttachedObjectsARB)
+		pGlGetAttachedObjectsARB(program, maxcount, count, shaders);
+#elif defined(GL_ARB_shader_objects)
+	glGetAttachedObjectsARB(program, maxcount, count, shaders);
+#else
+	os::Printer::log("glGetAttachedObjects not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+{
+	if (count)
+		*count=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetAttachedShaders)
+		pGlGetAttachedShaders(program, maxcount, count, shaders);
+#elif defined(GL_VERSION_2_0)
+	glGetAttachedShaders(program, maxcount, count, shaders);
+#else
+	os::Printer::log("glGetAttachedShaders not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
+{
+	if (length)
+		*length=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetInfoLogARB)
+		pGlGetInfoLogARB(object, maxLength, length, infoLog);
+#elif defined(GL_ARB_shader_objects)
+	glGetInfoLogARB(object, maxLength, length, infoLog);
+#else
+	os::Printer::log("glGetInfoLog not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
+{
+	if (length)
+		*length=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetShaderInfoLog)
+		pGlGetShaderInfoLog(shader, maxLength, length, infoLog);
+#elif defined(GL_VERSION_2_0)
+	glGetShaderInfoLog(shader, maxLength, length, infoLog);
+#else
+	os::Printer::log("glGetShaderInfoLog not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
+{
+	if (length)
+		*length=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetProgramInfoLog)
+		pGlGetProgramInfoLog(program, maxLength, length, infoLog);
+#elif defined(GL_VERSION_2_0)
+	glGetProgramInfoLog(program, maxLength, length, infoLog);
+#else
+	os::Printer::log("glGetProgramInfoLog not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetObjectParameterivARB)
+		pGlGetObjectParameterivARB(object, type, param);
+#elif defined(GL_ARB_shader_objects)
+	glGetObjectParameterivARB(object, type, param);
+#else
+	os::Printer::log("glGetObjectParameteriv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetShaderiv(GLuint shader, GLenum type, GLint *param)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetShaderiv)
+		pGlGetShaderiv(shader, type, param);
+#elif defined(GL_VERSION_2_0)
+	glGetShaderiv(shader, type, param);
+#else
+	os::Printer::log("glGetShaderiv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetProgramiv(GLuint program, GLenum type, GLint *param)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetProgramiv)
+		pGlGetProgramiv(program, type, param);
+#elif defined(GL_VERSION_2_0)
+	glGetProgramiv(program, type, param);
+#else
+	os::Printer::log("glGetProgramiv not supported", ELL_ERROR);
+#endif
+}
+
+inline GLint COpenGLExtensionHandler::extGlGetUniformLocationARB(GLhandleARB program, const char *name)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetUniformLocationARB)
+		return pGlGetUniformLocationARB(program, name);
+#elif defined(GL_ARB_shader_objects)
+	return glGetUniformLocationARB(program, name);
+#else
+	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLuint program, const char *name)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetUniformLocation)
+		return pGlGetUniformLocation(program, name);
+#elif defined(GL_VERSION_2_0)
+	return glGetUniformLocation(program, name);
+#else
+	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
+#endif
+	return 0;
+}
+
+inline void COpenGLExtensionHandler::extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform1fvARB)
+		pGlUniform1fvARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform1fvARB(loc, count, v);
+#else
+	os::Printer::log("glUniform1fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform2fvARB)
+		pGlUniform2fvARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform2fvARB(loc, count, v);
+#else
+	os::Printer::log("glUniform2fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform3fvARB)
+		pGlUniform3fvARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform3fvARB(loc, count, v);
+#else
+	os::Printer::log("glUniform3fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform4fvARB)
+		pGlUniform4fvARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform4fvARB(loc, count, v);
+#else
+	os::Printer::log("glUniform4fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform1iv(GLint loc, GLsizei count, const GLint *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform1ivARB)
+		pGlUniform1ivARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform1ivARB(loc, count, v);
+#else
+	os::Printer::log("glUniform1iv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform2iv(GLint loc, GLsizei count, const GLint *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform2ivARB)
+		pGlUniform2ivARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform2ivARB(loc, count, v);
+#else
+	os::Printer::log("glUniform2iv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform3iv(GLint loc, GLsizei count, const GLint *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform3ivARB)
+		pGlUniform3ivARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform3ivARB(loc, count, v);
+#else
+	os::Printer::log("glUniform3iv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniform4iv(GLint loc, GLsizei count, const GLint *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniform4ivARB)
+		pGlUniform4ivARB(loc, count, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniform4ivARB(loc, count, v);
+#else
+	os::Printer::log("glUniform4iv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniformMatrix2fvARB)
+		pGlUniformMatrix2fvARB(loc, count, transpose, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniformMatrix2fvARB(loc, count, transpose, v);
+#else
+	os::Printer::log("glUniformMatrix2fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniformMatrix3fvARB)
+		pGlUniformMatrix3fvARB(loc, count, transpose, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniformMatrix3fvARB(loc, count, transpose, v);
+#else
+	os::Printer::log("glUniformMatrix3fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUniformMatrix4fvARB)
+		pGlUniformMatrix4fvARB(loc, count, transpose, v);
+#elif defined(GL_ARB_shader_objects)
+	glUniformMatrix4fvARB(loc, count, transpose, v);
+#else
+	os::Printer::log("glUniformMatrix4fv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetActiveUniformARB(GLhandleARB program,
+		GLuint index, GLsizei maxlength, GLsizei *length,
+		GLint *size, GLenum *type, GLcharARB *name)
+{
+	if (length)
+		*length=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetActiveUniformARB)
+		pGlGetActiveUniformARB(program, index, maxlength, length, size, type, name);
+#elif defined(GL_ARB_shader_objects)
+	glGetActiveUniformARB(program, index, maxlength, length, size, type, name);
+#else
+	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLuint program,
+		GLuint index, GLsizei maxlength, GLsizei *length,
+		GLint *size, GLenum *type, GLchar *name)
+{
+	if (length)
+		*length=0;
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetActiveUniform)
+		pGlGetActiveUniform(program, index, maxlength, length, size, type, name);
+#elif defined(GL_VERSION_2_0)
+	glGetActiveUniform(program, index, maxlength, length, size, type, name);
+#else
+	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlPointParameterf(GLint loc, GLfloat f)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlPointParameterfARB)
+		pGlPointParameterfARB(loc, f);
+#elif defined(GL_ARB_point_parameters)
+	glPointParameterfARB(loc, f);
+#else
+	os::Printer::log("glPointParameterf not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlPointParameterfv(GLint loc, const GLfloat *v)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlPointParameterfvARB)
+		pGlPointParameterfvARB(loc, v);
+#elif defined(GL_ARB_point_parameters)
+	glPointParameterfvARB(loc, v);
+#else
+	os::Printer::log("glPointParameterfv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlStencilFuncSeparate)
+		pGlStencilFuncSeparate(frontfunc, backfunc, ref, mask);
+	else if (pGlStencilFuncSeparateATI)
+		pGlStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
+#elif defined(GL_VERSION_2_0)
+	glStencilFuncSeparate(frontfunc, backfunc, ref, mask);
+#elif defined(GL_ATI_separate_stencil)
+	glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
+#else
+	os::Printer::log("glStencilFuncSeparate not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlStencilOpSeparate)
+		pGlStencilOpSeparate(face, fail, zfail, zpass);
+	else if (pGlStencilOpSeparateATI)
+		pGlStencilOpSeparateATI(face, fail, zfail, zpass);
+#elif defined(GL_VERSION_2_0)
+	glStencilOpSeparate(face, fail, zfail, zpass);
+#elif defined(GL_ATI_separate_stencil)
+	glStencilOpSeparateATI(face, fail, zfail, zpass);
+#else
+	os::Printer::log("glStencilOpSeparate not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width,
+		GLsizei height, GLint border, GLsizei imageSize, const void* data)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCompressedTexImage2D)
+		pGlCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+#elif defined(GL_ARB_texture_compression)
+	glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+#else
+	os::Printer::log("glCompressedTexImage2D not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBindFramebuffer)
+		pGlBindFramebuffer(target, framebuffer);
+	else if (pGlBindFramebufferEXT)
+		pGlBindFramebufferEXT(target, framebuffer);
+#elif defined(GL_ARB_framebuffer_object)
+	glBindFramebuffer(target, framebuffer);
+#elif defined(GL_EXT_framebuffer_object)
+	glBindFramebufferEXT(target, framebuffer);
+#else
+	os::Printer::log("glBindFramebuffer not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteFramebuffers)
+		pGlDeleteFramebuffers(n, framebuffers);
+	else if (pGlDeleteFramebuffersEXT)
+		pGlDeleteFramebuffersEXT(n, framebuffers);
+#elif defined(GL_ARB_framebuffer_object)
+	glDeleteFramebuffers(n, framebuffers);
+#elif defined(GL_EXT_framebuffer_object)
+	glDeleteFramebuffersEXT(n, framebuffers);
+#else
+	os::Printer::log("glDeleteFramebuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+	if (framebuffers)
+		memset(framebuffers,0,n*sizeof(GLuint));
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenFramebuffers)
+		pGlGenFramebuffers(n, framebuffers);
+	else if (pGlGenFramebuffersEXT)
+		pGlGenFramebuffersEXT(n, framebuffers);
+#elif defined(GL_ARB_framebuffer_object)
+	glGenFramebuffers(n, framebuffers);
+#elif defined(GL_EXT_framebuffer_object)
+	glGenFramebuffersEXT(n, framebuffers);
+#else
+	os::Printer::log("glGenFramebuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline GLenum COpenGLExtensionHandler::extGlCheckFramebufferStatus(GLenum target)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlCheckFramebufferStatus)
+		return pGlCheckFramebufferStatus(target);
+	else if (pGlCheckFramebufferStatusEXT)
+		return pGlCheckFramebufferStatusEXT(target);
+	else
+		return 0;
+#elif defined(GL_ARB_framebuffer_object)
+	return glCheckFramebufferStatus(target);
+#elif defined(GL_EXT_framebuffer_object)
+	return glCheckFramebufferStatusEXT(target);
+#else
+	os::Printer::log("glCheckFramebufferStatus not supported", ELL_ERROR);
+	return 0;
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlFramebufferTexture2D)
+		pGlFramebufferTexture2D(target, attachment, textarget, texture, level);
+	else if (pGlFramebufferTexture2DEXT)
+		pGlFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
+#elif defined(GL_ARB_framebuffer_object)
+	glFramebufferTexture2D(target, attachment, textarget, texture, level);
+#elif defined(GL_EXT_framebuffer_object)
+	glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
+#else
+	os::Printer::log("glFramebufferTexture2D not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBindRenderbuffer)
+		pGlBindRenderbuffer(target, renderbuffer);
+	else if (pGlBindRenderbufferEXT)
+		pGlBindRenderbufferEXT(target, renderbuffer);
+#elif defined(GL_ARB_framebuffer_object)
+	glBindRenderbuffer(target, renderbuffer);
+#elif defined(GL_EXT_framebuffer_object)
+	glBindRenderbufferEXT(target, renderbuffer);
+#else
+	os::Printer::log("glBindRenderbuffer not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteRenderbuffers)
+		pGlDeleteRenderbuffers(n, renderbuffers);
+	else if (pGlDeleteRenderbuffersEXT)
+		pGlDeleteRenderbuffersEXT(n, renderbuffers);
+#elif defined(GL_ARB_framebuffer_object)
+	glDeleteRenderbuffers(n, renderbuffers);
+#elif defined(GL_EXT_framebuffer_object)
+	glDeleteRenderbuffersEXT(n, renderbuffers);
+#else
+	os::Printer::log("glDeleteRenderbuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+	if (renderbuffers)
+		memset(renderbuffers,0,n*sizeof(GLuint));
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenRenderbuffers)
+		pGlGenRenderbuffers(n, renderbuffers);
+	else if (pGlGenRenderbuffersEXT)
+		pGlGenRenderbuffersEXT(n, renderbuffers);
+#elif defined(GL_ARB_framebuffer_object)
+	glGenRenderbuffers(n, renderbuffers);
+#elif defined(GL_EXT_framebuffer_object)
+	glGenRenderbuffersEXT(n, renderbuffers);
+#else
+	os::Printer::log("glGenRenderbuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlRenderbufferStorage)
+		pGlRenderbufferStorage(target, internalformat, width, height);
+	else if (pGlRenderbufferStorageEXT)
+		pGlRenderbufferStorageEXT(target, internalformat, width, height);
+#elif defined(GL_ARB_framebuffer_object)
+	glRenderbufferStorage(target, internalformat, width, height);
+#elif defined(GL_EXT_framebuffer_object)
+	glRenderbufferStorageEXT(target, internalformat, width, height);
+#else
+	os::Printer::log("glRenderbufferStorage not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlFramebufferRenderbuffer)
+		pGlFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+	else if (pGlFramebufferRenderbufferEXT)
+		pGlFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
+#elif defined(GL_ARB_framebuffer_object)
+	glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+#elif defined(GL_EXT_framebuffer_object)
+	glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
+#else
+	os::Printer::log("glFramebufferRenderbuffer not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGenerateMipmap(GLenum target)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenerateMipmap)
+		pGlGenerateMipmap(target);
+	else if (pGlGenerateMipmapEXT)
+		pGlGenerateMipmapEXT(target);
+#elif defined(GL_ARB_framebuffer_object)
+	glGenerateMipmap(target);
+#elif defined(GL_EXT_framebuffer_object)
+	glGenerateMipmapEXT(target);
+#else
+	os::Printer::log("glGenerateMipmap not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlActiveStencilFace(GLenum face)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlActiveStencilFaceEXT)
+		pGlActiveStencilFaceEXT(face);
+#elif defined(GL_EXT_stencil_two_side)
+	glActiveStencilFaceEXT(face);
+#else
+	os::Printer::log("glActiveStencilFace not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDrawBuffers(GLsizei n, const GLenum *bufs)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDrawBuffersARB)
+		pGlDrawBuffersARB(n, bufs);
+	else if (pGlDrawBuffersATI)
+		pGlDrawBuffersATI(n, bufs);
+#elif defined(GL_ARB_draw_buffers)
+	glDrawBuffersARB(n, bufs);
+#elif defined(GL_ATI_draw_buffers)
+	glDrawBuffersATI(n, bufs);
+#else
+	os::Printer::log("glDrawBuffers not supported", ELL_ERROR);
+#endif
+}
+
+
+inline void COpenGLExtensionHandler::extGlGenBuffers(GLsizei n, GLuint *buffers)
+{
+	if (buffers)
+		memset(buffers,0,n*sizeof(GLuint));
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenBuffersARB)
+		pGlGenBuffersARB(n, buffers);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glGenBuffers(n, buffers);
+#else
+	os::Printer::log("glGenBuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBindBuffer(GLenum target, GLuint buffer)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBindBufferARB)
+		pGlBindBufferARB(target, buffer);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glBindBuffer(target, buffer);
+#else
+	os::Printer::log("glBindBuffer not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBufferDataARB)
+		pGlBufferDataARB(target, size, data, usage);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glBufferData(target, size, data, usage);
+#else
+	os::Printer::log("glBufferData not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteBuffers(GLsizei n, const GLuint *buffers)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteBuffersARB)
+		pGlDeleteBuffersARB(n, buffers);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glDeleteBuffers(n, buffers);
+#else
+	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBufferSubDataARB)
+		pGlBufferSubDataARB(target, offset, size, data);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glBufferSubData(target, offset, size, data);
+#else
+	os::Printer::log("glBufferSubData not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetBufferSubDataARB)
+		pGlGetBufferSubDataARB(target, offset, size, data);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glGetBufferSubData(target, offset, size, data);
+#else
+	os::Printer::log("glGetBufferSubData not supported", ELL_ERROR);
+#endif
+}
+
+inline void *COpenGLExtensionHandler::extGlMapBuffer(GLenum target, GLenum access)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlMapBufferARB)
+		return pGlMapBufferARB(target, access);
+	return 0;
+#elif defined(GL_ARB_vertex_buffer_object)
+	return glMapBuffer(target, access);
+#else
+	os::Printer::log("glMapBuffer not supported", ELL_ERROR);
+	return 0;
+#endif
+}
+
+inline GLboolean COpenGLExtensionHandler::extGlUnmapBuffer(GLenum target)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlUnmapBufferARB)
+		return pGlUnmapBufferARB(target);
+	return false;
+#elif defined(GL_ARB_vertex_buffer_object)
+	return glUnmapBuffer(target);
+#else
+	os::Printer::log("glUnmapBuffer not supported", ELL_ERROR);
+	return false;
+#endif
+}
+
+inline GLboolean COpenGLExtensionHandler::extGlIsBuffer(GLuint buffer)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlIsBufferARB)
+		return pGlIsBufferARB(buffer);
+	return false;
+#elif defined(GL_ARB_vertex_buffer_object)
+	return glIsBuffer(buffer);
+#else
+	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
+	return false;
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetBufferParameterivARB)
+		pGlGetBufferParameterivARB(target, pname, params);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glGetBufferParameteriv(target, pname, params);
+#else
+	os::Printer::log("glGetBufferParameteriv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetBufferPointervARB)
+		pGlGetBufferPointervARB(target, pname, params);
+#elif defined(GL_ARB_vertex_buffer_object)
+	glGetBufferPointerv(target, pname, params);
+#else
+	os::Printer::log("glGetBufferPointerv not supported", ELL_ERROR);
+#endif
+}
+
+
+inline void COpenGLExtensionHandler::extGlProvokingVertex(GLenum mode)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_ARB_provoking_vertex] && pGlProvokingVertexARB)
+		pGlProvokingVertexARB(mode);
+	else if (FeatureAvailable[IRR_EXT_provoking_vertex] && pGlProvokingVertexEXT)
+		pGlProvokingVertexEXT(mode);
+#elif defined(GL_ARB_provoking_vertex)
+	glProvokingVertex(mode);
+#elif defined(GL_EXT_provoking_vertex)
+	glProvokingVertexEXT(mode);
+#else
+	os::Printer::log("glProvokingVertex not supported", ELL_ERROR);
+#endif
+}
+
+
+inline void COpenGLExtensionHandler::extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlColorMaskIndexedEXT)
+		pGlColorMaskIndexedEXT(buf, r, g, b, a);
+#elif defined(GL_EXT_draw_buffers2)
+	glColorMaskIndexedEXT(buf, r, g, b, a);
+#else
+	os::Printer::log("glColorMaskIndexed not supported", ELL_ERROR);
+#endif
+}
+
+
+inline void COpenGLExtensionHandler::extGlEnableIndexed(GLenum target, GLuint index)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlEnableIndexedEXT)
+		pGlEnableIndexedEXT(target, index);
+#elif defined(GL_EXT_draw_buffers2)
+	glEnableIndexedEXT(target, index);
+#else
+	os::Printer::log("glEnableIndexed not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDisableIndexed(GLenum target, GLuint index)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlDisableIndexedEXT)
+		pGlDisableIndexedEXT(target, index);
+#elif defined(GL_EXT_draw_buffers2)
+	glDisableIndexedEXT(target, index);
+#else
+	os::Printer::log("glDisableIndexed not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendFunciARB)
+		pGlBlendFunciARB(buf, src, dst);
+	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendFuncIndexedAMD)
+		pGlBlendFuncIndexedAMD(buf, src, dst);
+#elif defined(GL_ARB_draw_buffers_blend)
+	glBlendFunciARB(buf, src, dst);
+#elif defined(GL_AMD_draw_buffers_blend)
+	glBlendFuncIndexedAMD(buf, src, dst);
+#else
+	os::Printer::log("glBlendFuncIndexed not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBlendEquationIndexed(GLuint buf, GLenum mode)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendEquationiARB)
+		pGlBlendEquationiARB(buf, mode);
+	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendEquationIndexedAMD)
+		pGlBlendEquationIndexedAMD(buf, mode);
+#elif defined(GL_ARB_draw_buffers_blend)
+	glBlendEquationiARB(buf, mode);
+#elif defined(GL_AMD_draw_buffers_blend)
+	glBlendEquationIndexedAMD(buf, mode);
+#else
+	os::Printer::log("glBlendEquationIndexed not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value)
+{
+#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+	if (queryFeature(EVDF_GEOMETRY_SHADER))
+	{
+		if (pGlProgramParameteriARB)
+			pGlProgramParameteriARB(program, pname, value);
+		else if (pGlProgramParameteriEXT)
+			pGlProgramParameteriEXT(program, pname, value);
+	}
+#elif defined(GL_ARB_geometry_shader4)
+	glProgramParameteriARB(program, pname, value);
+#elif defined(GL_EXT_geometry_shader4)
+    #ifdef __clang__
+    glProgramParameteriEXT((long)program, pname, value);
+    #else
+	glProgramParameteriEXT((long GLuint)program, pname, value);
+    #endif
+#elif defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4)
+	glProgramParameteriNV(program, pname, value);
+#else
+	os::Printer::log("glProgramParameteri not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGenQueries(GLsizei n, GLuint *ids)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGenQueriesARB)
+		pGlGenQueriesARB(n, ids);
+	else if (pGlGenOcclusionQueriesNV)
+		pGlGenOcclusionQueriesNV(n, ids);
+#elif defined(GL_ARB_occlusion_query)
+	glGenQueriesARB(n, ids);
+#elif defined(GL_NV_occlusion_query)
+	glGenOcclusionQueriesNV(n, ids);
+#else
+	os::Printer::log("glGenQueries not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlDeleteQueries(GLsizei n, const GLuint *ids)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlDeleteQueriesARB)
+		pGlDeleteQueriesARB(n, ids);
+	else if (pGlDeleteOcclusionQueriesNV)
+		pGlDeleteOcclusionQueriesNV(n, ids);
+#elif defined(GL_ARB_occlusion_query)
+	glDeleteQueriesARB(n, ids);
+#elif defined(GL_NV_occlusion_query)
+	glDeleteOcclusionQueriesNV(n, ids);
+#else
+	os::Printer::log("glDeleteQueries not supported", ELL_ERROR);
+#endif
+}
+
+inline GLboolean COpenGLExtensionHandler::extGlIsQuery(GLuint id)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlIsQueryARB)
+		return pGlIsQueryARB(id);
+	else if (pGlIsOcclusionQueryNV)
+		return pGlIsOcclusionQueryNV(id);
+	return false;
+#elif defined(GL_ARB_occlusion_query)
+	return glIsQueryARB(id);
+#elif defined(GL_NV_occlusion_query)
+	return glIsOcclusionQueryNV(id);
+#else
+	return false;
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBeginQuery(GLenum target, GLuint id)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBeginQueryARB)
+		pGlBeginQueryARB(target, id);
+	else if (pGlBeginOcclusionQueryNV)
+		pGlBeginOcclusionQueryNV(id);
+#elif defined(GL_ARB_occlusion_query)
+	glBeginQueryARB(target, id);
+#elif defined(GL_NV_occlusion_query)
+	glBeginOcclusionQueryNV(id);
+#else
+	os::Printer::log("glBeginQuery not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlEndQuery(GLenum target)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlEndQueryARB)
+		pGlEndQueryARB(target);
+	else if (pGlEndOcclusionQueryNV)
+		pGlEndOcclusionQueryNV();
+#elif defined(GL_ARB_occlusion_query)
+	glEndQueryARB(target);
+#elif defined(GL_NV_occlusion_query)
+	glEndOcclusionQueryNV();
+#else
+	os::Printer::log("glEndQuery not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetQueryivARB)
+		pGlGetQueryivARB(target, pname, params);
+#elif defined(GL_ARB_occlusion_query)
+	glGetQueryivARB(target, pname, params);
+#else
+	os::Printer::log("glGetQueryivARB not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetQueryObjectivARB)
+		pGlGetQueryObjectivARB(id, pname, params);
+	else if (pGlGetOcclusionQueryivNV)
+		pGlGetOcclusionQueryivNV(id, pname, params);
+#elif defined(GL_ARB_occlusion_query)
+	glGetQueryObjectivARB(id, pname, params);
+#elif defined(GL_NV_occlusion_query)
+	glGetOcclusionQueryivNV(id, pname, params);
+#else
+	os::Printer::log("glGetQueryObjectiv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlGetQueryObjectuivARB)
+		pGlGetQueryObjectuivARB(id, pname, params);
+	else if (pGlGetOcclusionQueryuivNV)
+		pGlGetOcclusionQueryuivNV(id, pname, params);
+#elif defined(GL_ARB_occlusion_query)
+	glGetQueryObjectuivARB(id, pname, params);
+#elif defined(GL_NV_occlusion_query)
+	glGetOcclusionQueryuivNV(id, pname, params);
+#else
+	os::Printer::log("glGetQueryObjectuiv not supported", ELL_ERROR);
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)
+{
+	// we have wglext, so try to use that
+#if defined(_IRR_WINDOWS_API_) && defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
+#ifdef WGL_EXT_swap_control
+	if (pWglSwapIntervalEXT)
+		pWglSwapIntervalEXT(interval);
+#endif
+#endif
+#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
+	//TODO: Check GLX_EXT_swap_control and GLX_MESA_swap_control
+#ifdef GLX_SGI_swap_control
+	// does not work with interval==0
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (interval && pGlxSwapIntervalSGI)
+		pGlxSwapIntervalSGI(interval);
+#else
+	if (interval)
+		glXSwapIntervalSGI(interval);
+#endif
+#elif defined(GLX_EXT_swap_control)
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	Display *dpy = glXGetCurrentDisplay();
+	GLXDrawable drawable = glXGetCurrentDrawable();
+
+	if (pGlxSwapIntervalEXT)
+		pGlxSwapIntervalEXT(dpy, drawable, interval);
+#else
+	pGlXSwapIntervalEXT(dpy, drawable, interval);
+#endif
+#elif defined(GLX_MESA_swap_control)
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlxSwapIntervalMESA)
+		pGlxSwapIntervalMESA(interval);
+#else
+	pGlXSwapIntervalMESA(interval);
+#endif
+#endif
+#endif
+}
+
+inline void COpenGLExtensionHandler::extGlBlendEquation(GLenum mode)
+{
+#ifdef _IRR_OPENGL_USE_EXTPOINTER_
+	if (pGlBlendEquation)
+		pGlBlendEquation(mode);
+	else if (pGlBlendEquationEXT)
+		pGlBlendEquationEXT(mode);
+#elif defined(GL_EXT_blend_minmax) || defined(GL_EXT_blend_subtract) || defined(GL_EXT_blend_logic_op)
+	glBlendEquationEXT(mode);
+#elif defined(GL_VERSION_1_2)
+	glBlendEquation(mode);
+#else
+	os::Printer::log("glBlendEquation not supported", ELL_ERROR);
+#endif
+}
+
+
+}
+}
+
+#endif
+
+#endif
+