1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h
4 
5 #ifndef __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
6 #define __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__
7 
8 #include "IrrCompileConfig.h"
9 #ifdef _IRR_COMPILE_WITH_OPENGL_
10 #define GL_SILENCE_DEPRECATION
11 
12 #include "EDriverFeatures.h"
13 #include "irrTypes.h"
14 #include "os.h"
15 
16 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
17 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
18 		#define GL_GLEXT_LEGACY 1
19 		#define GLX_GLXEXT_LEGACY 1
20 	#else
21 		#define GL_GLEXT_PROTOTYPES 1
22 		#define GLX_GLXEXT_PROTOTYPES 1
23 	#endif
24 	#define NO_SDL_GLEXT
25 	#include <SDL_video.h>
26 	#include <SDL_opengl.h>
27 	#include "glext.h"
28 #elif defined(_IRR_WINDOWS_API_)
29 	// include windows headers for HWND
30 	#define WIN32_LEAN_AND_MEAN
31 	#include <windows.h>
32 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
33 		#define GL_GLEXT_LEGACY 1
34 	#endif
35 	#include <GL/gl.h>
36 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
37 		#include "glext.h"
38 	#endif
39 	#include "wglext.h"
40 
41 	#ifdef _MSC_VER
42 		#pragma comment(lib, "OpenGL32.lib")
43 	#endif
44 
45 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
46 	#include "MacOSX/CIrrDeviceMacOSX.h"
47 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
48 		#define GL_GLEXT_LEGACY 1
49 	#endif
50 	#include <OpenGL/gl.h>
51 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
52 		#include "glext.h"
53 	#endif
54 #endif
55 
56 #ifndef GL_ARB_shader_objects
57 /* GL types for program/shader text and shader object handles */
58 typedef char GLcharARB;
59 typedef unsigned int GLhandleARB;
60 #endif
61 
62 #ifndef GL_VERSION_2_0
63 /* GL type for program/shader text */
64 typedef char GLchar;
65 #endif
66 
67 
68 namespace irr
69 {
70 namespace video
71 {
72 
73 
74 static const char* const OpenGLFeatureStrings[] = {
75 	"GL_3DFX_multisample",
76 	"GL_3DFX_tbuffer",
77 	"GL_3DFX_texture_compression_FXT1",
78 	"GL_AMD_blend_minmax_factor",
79 	"GL_AMD_conservative_depth",
80 	"GL_AMD_debug_output",
81 	"GL_AMD_depth_clamp_separate",
82 	"GL_AMD_draw_buffers_blend",
83 	"GL_AMD_multi_draw_indirect",
84 	"GL_AMD_name_gen_delete",
85 	"GL_AMD_performance_monitor",
86 	"GL_AMD_sample_positions",
87 	"GL_AMD_seamless_cubemap_per_texture",
88 	"GL_AMD_shader_stencil_export",
89 	"GL_AMD_texture_texture4",
90 	"GL_AMD_transform_feedback3_lines_triangles",
91 	"GL_AMD_vertex_shader_tesselator",
92 	"GL_APPLE_aux_depth_stencil",
93 	"GL_APPLE_client_storage",
94 	"GL_APPLE_element_array",
95 	"GL_APPLE_fence",
96 	"GL_APPLE_float_pixels",
97 	"GL_APPLE_flush_buffer_range",
98 	"GL_APPLE_object_purgeable",
99 	"GL_APPLE_rgb_422",
100 	"GL_APPLE_row_bytes",
101 	"GL_APPLE_specular_vector",
102 	"GL_APPLE_texture_range",
103 	"GL_APPLE_transform_hint",
104 	"GL_APPLE_vertex_array_object",
105 	"GL_APPLE_vertex_array_range",
106 	"GL_APPLE_vertex_program_evaluators",
107 	"GL_APPLE_ycbcr_422",
108 	"GL_ARB_base_instance",
109 	"GL_ARB_blend_func_extended",
110 	"GL_ARB_cl_event",
111 	"GL_ARB_color_buffer_float",
112 	"GL_ARB_compatibility",
113 	"GL_ARB_compressed_texture_pixel_storage",
114 	"GL_ARB_conservative_depth",
115 	"GL_ARB_copy_buffer",
116 	"GL_ARB_debug_output",
117 	"GL_ARB_depth_buffer_float",
118 	"GL_ARB_depth_clamp",
119 	"GL_ARB_depth_texture",
120 	"GL_ARB_draw_buffers",
121 	"GL_ARB_draw_buffers_blend",
122 	"GL_ARB_draw_elements_base_vertex",
123 	"GL_ARB_draw_indirect",
124 	"GL_ARB_draw_instanced",
125 	"GL_ARB_ES2_compatibility",
126 	"GL_ARB_explicit_attrib_location",
127 	"GL_ARB_fragment_coord_conventions",
128 	"GL_ARB_fragment_program",
129 	"GL_ARB_fragment_program_shadow",
130 	"GL_ARB_fragment_shader",
131 	"GL_ARB_framebuffer_object",
132 	"GL_ARB_framebuffer_sRGB",
133 	"GL_ARB_get_program_binary",
134 	"GL_ARB_geometry_shader4",
135 	"GL_ARB_gpu_shader5",
136 	"GL_ARB_gpu_shader_fp64",
137 	"GL_ARB_half_float_pixel",
138 	"GL_ARB_half_float_vertex",
139 	"GL_ARB_imaging",
140 	"GL_ARB_instanced_arrays",
141 	"GL_ARB_internalformat_query",
142 	"GL_ARB_map_buffer_alignment",
143 	"GL_ARB_map_buffer_range",
144 	"GL_ARB_matrix_palette",
145 	"GL_ARB_multisample",
146 	"GL_ARB_multitexture",
147 	"GL_ARB_occlusion_query",
148 	"GL_ARB_occlusion_query2",
149 	"GL_ARB_pixel_buffer_object",
150 	"GL_ARB_point_parameters",
151 	"GL_ARB_point_sprite",
152 	"GL_ARB_provoking_vertex",
153 	"GL_ARB_robustness",
154 	"GL_ARB_sample_shading",
155 	"GL_ARB_sampler_objects",
156 	"GL_ARB_seamless_cube_map",
157 	"GL_ARB_separate_shader_objects",
158 	"GL_ARB_shader_atomic_counters",
159 	"GL_ARB_shader_bit_encoding",
160 	"GL_ARB_shader_image_load_store",
161 	"GL_ARB_shader_objects",
162 	"GL_ARB_shader_precision",
163 	"GL_ARB_shader_stencil_export",
164 	"GL_ARB_shader_subroutine",
165 	"GL_ARB_shader_texture_lod",
166 	"GL_ARB_shading_language_100",
167 	"GL_ARB_shading_language_420pack",
168 	"GL_ARB_shading_language_include",
169 	"GL_ARB_shading_language_packing",
170 	"GL_ARB_shadow",
171 	"GL_ARB_shadow_ambient",
172 	"GL_ARB_sync",
173 	"GL_ARB_tessellation_shader",
174 	"GL_ARB_texture_border_clamp",
175 	"GL_ARB_texture_buffer_object",
176 	"GL_ARB_texture_buffer_object_rgb32",
177 	"GL_ARB_texture_compression",
178 	"GL_ARB_texture_compression_bptc",
179 	"GL_ARB_texture_compression_rgtc",
180 	"GL_ARB_texture_cube_map",
181 	"GL_ARB_texture_cube_map_array",
182 	"GL_ARB_texture_env_add",
183 	"GL_ARB_texture_env_combine",
184 	"GL_ARB_texture_env_crossbar",
185 	"GL_ARB_texture_env_dot3",
186 	"GL_ARB_texture_float",
187 	"GL_ARB_texture_gather",
188 	"GL_ARB_texture_mirrored_repeat",
189 	"GL_ARB_texture_multisample",
190 	"GL_ARB_texture_non_power_of_two",
191 	"GL_ARB_texture_query_lod",
192 	"GL_ARB_texture_rectangle",
193 	"GL_ARB_texture_rg",
194 	"GL_ARB_texture_rgb10_a2ui",
195 	"GL_ARB_texture_storage",
196 	"GL_ARB_texture_swizzle",
197 	"GL_ARB_timer_query",
198 	"GL_ARB_transform_feedback2",
199 	"GL_ARB_transform_feedback3",
200 	"GL_ARB_transform_feedback_instanced",
201 	"GL_ARB_transpose_matrix",
202 	"GL_ARB_uniform_buffer_object",
203 	"GL_ARB_vertex_array_bgra",
204 	"GL_ARB_vertex_array_object",
205 	"GL_ARB_vertex_attrib_64bit",
206 	"GL_ARB_vertex_blend",
207 	"GL_ARB_vertex_buffer_object",
208 	"GL_ARB_vertex_program",
209 	"GL_ARB_vertex_shader",
210 	"GL_ARB_vertex_type_2_10_10_10_rev",
211 	"GL_ARB_viewport_array",
212 	"GL_ARB_window_pos",
213 	"GL_ATI_draw_buffers",
214 	"GL_ATI_element_array",
215 	"GL_ATI_envmap_bumpmap",
216 	"GL_ATI_fragment_shader",
217 	"GL_ATI_map_object_buffer",
218 	"GL_ATI_meminfo",
219 	"GL_ATI_pixel_format_float",
220 	"GL_ATI_pn_triangles",
221 	"GL_ATI_separate_stencil",
222 	"GL_ATI_text_fragment_shader",
223 	"GL_ATI_texture_env_combine3",
224 	"GL_ATI_texture_float",
225 	"GL_ATI_texture_mirror_once",
226 	"GL_ATI_vertex_array_object",
227 	"GL_ATI_vertex_attrib_array_object",
228 	"GL_ATI_vertex_streams",
229 	"GL_EXT_422_pixels",
230 	"GL_EXT_abgr",
231 	"GL_EXT_bgra",
232 	"GL_EXT_bindable_uniform",
233 	"GL_EXT_blend_color",
234 	"GL_EXT_blend_equation_separate",
235 	"GL_EXT_blend_func_separate",
236 	"GL_EXT_blend_logic_op",
237 	"GL_EXT_blend_minmax",
238 	"GL_EXT_blend_subtract",
239 	"GL_EXT_clip_volume_hint",
240 	"GL_EXT_cmyka",
241 	"GL_EXT_color_subtable",
242 	"GL_EXT_compiled_vertex_array",
243 	"GL_EXT_convolution",
244 	"GL_EXT_coordinate_frame",
245 	"GL_EXT_copy_texture",
246 	"GL_EXT_cull_vertex",
247 	"GL_EXT_depth_bounds_test",
248 	"GL_EXT_direct_state_access",
249 	"GL_EXT_draw_buffers2",
250 	"GL_EXT_draw_instanced",
251 	"GL_EXT_draw_range_elements",
252 	"GL_EXT_fog_coord",
253 	"GL_EXT_framebuffer_blit",
254 	"GL_EXT_framebuffer_multisample",
255 	"GL_EXT_framebuffer_multisample_blit_scaled",
256 	"GL_EXT_framebuffer_object",
257 	"GL_EXT_framebuffer_sRGB",
258 	"GL_EXT_geometry_shader4",
259 	"GL_EXT_gpu_program_parameters",
260 	"GL_EXT_gpu_shader4",
261 	"GL_EXT_histogram",
262 	"GL_EXT_index_array_formats",
263 	"GL_EXT_index_func",
264 	"GL_EXT_index_material",
265 	"GL_EXT_index_texture",
266 	"GL_EXT_light_texture",
267 	"GL_EXT_misc_attribute",
268 	"GL_EXT_multi_draw_arrays",
269 	"GL_EXT_multisample",
270 	"GL_EXT_packed_depth_stencil",
271 	"GL_EXT_packed_float",
272 	"GL_EXT_packed_pixels",
273 	"GL_EXT_paletted_texture",
274 	"GL_EXT_pixel_buffer_object",
275 	"GL_EXT_pixel_transform",
276 	"GL_EXT_pixel_transform_color_table",
277 	"GL_EXT_point_parameters",
278 	"GL_EXT_polygon_offset",
279 	"GL_EXT_provoking_vertex",
280 	"GL_EXT_rescale_normal",
281 	"GL_EXT_secondary_color",
282 	"GL_EXT_separate_shader_objects",
283 	"GL_EXT_separate_specular_color",
284 	"GL_EXT_shader_image_load_store",
285 	"GL_EXT_shadow_funcs",
286 	"GL_EXT_shared_texture_palette",
287 	"GL_EXT_stencil_clear_tag",
288 	"GL_EXT_stencil_two_side",
289 	"GL_EXT_stencil_wrap",
290 	"GL_EXT_subtexture",
291 	"GL_EXT_texture",
292 	"GL_EXT_texture3D",
293 	"GL_EXT_texture_array",
294 	"GL_EXT_texture_buffer_object",
295 	"GL_EXT_texture_compression_latc",
296 	"GL_EXT_texture_compression_rgtc",
297 	"GL_EXT_texture_compression_s3tc",
298 	"GL_EXT_texture_cube_map",
299 	"GL_EXT_texture_env_add",
300 	"GL_EXT_texture_env_combine",
301 	"GL_EXT_texture_env_dot3",
302 	"GL_EXT_texture_filter_anisotropic",
303 	"GL_EXT_texture_integer",
304 	"GL_EXT_texture_lod_bias",
305 	"GL_EXT_texture_mirror_clamp",
306 	"GL_EXT_texture_object",
307 	"GL_EXT_texture_perturb_normal",
308 	"GL_EXT_texture_shared_exponent",
309 	"GL_EXT_texture_snorm",
310 	"GL_EXT_texture_sRGB",
311 	"GL_EXT_texture_sRGB_decode",
312 	"GL_EXT_texture_swizzle",
313 	"GL_EXT_timer_query",
314 	"GL_EXT_transform_feedback",
315 	"GL_EXT_vertex_array",
316 	"GL_EXT_vertex_array_bgra",
317 	"GL_EXT_vertex_attrib_64bit",
318 	"GL_EXT_vertex_shader",
319 	"GL_EXT_vertex_weighting",
320 	"GL_EXT_x11_sync_object",
321 	"GL_FfdMaskSGIX",
322 	"GL_GREMEDY_frame_terminator",
323 	"GL_GREMEDY_string_marker",
324 	"GL_HP_convolution_border_modes",
325 	"GL_HP_image_transform",
326 	"GL_HP_occlusion_test",
327 	"GL_HP_texture_lighting",
328 	"GL_IBM_cull_vertex",
329 	"GL_IBM_multimode_draw_arrays",
330 	"GL_IBM_rasterpos_clip",
331 	"GL_IBM_texture_mirrored_repeat",
332 	"GL_IBM_vertex_array_lists",
333 	"GL_INGR_blend_func_separate",
334 	"GL_INGR_color_clamp",
335 	"GL_INGR_interlace_read",
336 	"GL_INGR_palette_buffer",
337 	"GL_INTEL_parallel_arrays",
338 	"GL_INTEL_texture_scissor",
339 	"GL_MESA_pack_invert",
340 	"GL_MESA_resize_buffers",
341 	"GL_MESA_window_pos",
342 	"GL_MESAX_texture_stack",
343 	"GL_MESA_ycbcr_texture",
344 	"GL_NV_blend_square",
345 	"GL_NV_conditional_render",
346 	"GL_NV_copy_depth_to_color",
347 	"GL_NV_copy_image",
348 	"GL_NV_depth_buffer_float",
349 	"GL_NV_depth_clamp",
350 	"GL_NV_evaluators",
351 	"GL_NV_explicit_multisample",
352 	"GL_NV_fence",
353 	"GL_NV_float_buffer",
354 	"GL_NV_fog_distance",
355 	"GL_NV_fragment_program",
356 	"GL_NV_fragment_program2",
357 	"GL_NV_fragment_program4",
358 	"GL_NV_fragment_program_option",
359 	"GL_NV_framebuffer_multisample_coverage",
360 	"GL_NV_geometry_program4",
361 	"GL_NV_geometry_shader4",
362 	"GL_NV_gpu_program4",
363 	"GL_NV_gpu_program5",
364 	"GL_NV_gpu_shader5",
365 	"GL_NV_half_float",
366 	"GL_NV_light_max_exponent",
367 	"GL_NV_multisample_coverage",
368 	"GL_NV_multisample_filter_hint",
369 	"GL_NV_occlusion_query",
370 	"GL_NV_packed_depth_stencil",
371 	"GL_NV_parameter_buffer_object",
372 	"GL_NV_parameter_buffer_object2",
373 	"GL_NV_pixel_data_range",
374 	"GL_NV_point_sprite",
375 	"GL_NV_present_video",
376 	"GL_NV_primitive_restart",
377 	"GL_NV_register_combiners",
378 	"GL_NV_register_combiners2",
379 	"GL_NV_shader_buffer_load",
380 	"GL_NV_shader_buffer_store",
381 	"GL_NV_tessellation_program5",
382 	"GL_NV_texgen_emboss",
383 	"GL_NV_texgen_reflection",
384 	"GL_NV_texture_barrier",
385 	"GL_NV_texture_compression_vtc",
386 	"GL_NV_texture_env_combine4",
387 	"GL_NV_texture_expand_normal",
388 	"GL_NV_texture_multisample",
389 	"GL_NV_texture_rectangle",
390 	"GL_NV_texture_shader",
391 	"GL_NV_texture_shader2",
392 	"GL_NV_texture_shader3",
393 	"GL_NV_transform_feedback",
394 	"GL_NV_transform_feedback2",
395 	"GL_NV_vdpau_interop",
396 	"GL_NV_vertex_array_range",
397 	"GL_NV_vertex_array_range2",
398 	"GL_NV_vertex_attrib_integer_64bit",
399 	"GL_NV_vertex_buffer_unified_memory",
400 	"GL_NV_vertex_program",
401 	"GL_NV_vertex_program1_1",
402 	"GL_NV_vertex_program2",
403 	"GL_NV_vertex_program2_option",
404 	"GL_NV_vertex_program3",
405 	"GL_NV_vertex_program4",
406 	"GL_NV_video_capture",
407 	"GL_OES_read_format",
408 	"GL_OML_interlace",
409 	"GL_OML_resample",
410 	"GL_OML_subsample",
411 	"GL_PGI_misc_hints",
412 	"GL_PGI_vertex_hints",
413 	"GL_REND_screen_coordinates",
414 	"GL_S3_s3tc",
415 	"GL_SGI_color_matrix",
416 	"GL_SGI_color_table",
417 	"GL_SGI_depth_pass_instrument",
418 	"GL_SGIS_detail_texture",
419 	"GL_SGIS_fog_function",
420 	"GL_SGIS_generate_mipmap",
421 	"GL_SGIS_multisample",
422 	"GL_SGIS_pixel_texture",
423 	"GL_SGIS_point_line_texgen",
424 	"GL_SGIS_point_parameters",
425 	"GL_SGIS_sharpen_texture",
426 	"GL_SGIS_texture4D",
427 	"GL_SGIS_texture_border_clamp",
428 	"GL_SGIS_texture_color_mask",
429 	"GL_SGIS_texture_edge_clamp",
430 	"GL_SGIS_texture_filter4",
431 	"GL_SGIS_texture_lod",
432 	"GL_SGIS_texture_select",
433 	"GL_SGI_texture_color_table",
434 	"GL_SGIX_async",
435 	"GL_SGIX_async_histogram",
436 	"GL_SGIX_async_pixel",
437 	"GL_SGIX_blend_alpha_minmax",
438 	"GL_SGIX_calligraphic_fragment",
439 	"GL_SGIX_clipmap",
440 	"GL_SGIX_convolution_accuracy",
441 	"GL_SGIX_depth_pass_instrument",
442 	"GL_SGIX_depth_texture",
443 	"GL_SGIX_flush_raster",
444 	"GL_SGIX_fog_offset",
445 	"GL_SGIX_fog_scale",
446 	"GL_SGIX_fragment_lighting",
447 	"GL_SGIX_framezoom",
448 	"GL_SGIX_igloo_interface",
449 	"GL_SGIX_impact_pixel_texture",
450 	"GL_SGIX_instruments",
451 	"GL_SGIX_interlace",
452 	"GL_SGIX_ir_instrument1",
453 	"GL_SGIX_list_priority",
454 	"GL_SGIX_pixel_texture",
455 	"GL_SGIX_pixel_tiles",
456 	"GL_SGIX_polynomial_ffd",
457 	"GL_SGIX_reference_plane",
458 	"GL_SGIX_resample",
459 	"GL_SGIX_scalebias_hint",
460 	"GL_SGIX_shadow",
461 	"GL_SGIX_shadow_ambient",
462 	"GL_SGIX_sprite",
463 	"GL_SGIX_subsample",
464 	"GL_SGIX_tag_sample_buffer",
465 	"GL_SGIX_texture_add_env",
466 	"GL_SGIX_texture_coordinate_clamp",
467 	"GL_SGIX_texture_lod_bias",
468 	"GL_SGIX_texture_multi_buffer",
469 	"GL_SGIX_texture_scale_bias",
470 	"GL_SGIX_texture_select",
471 	"GL_SGIX_vertex_preclip",
472 	"GL_SGIX_ycrcb",
473 	"GL_SGIX_ycrcba",
474 	"GL_SGIX_ycrcb_subsample",
475 	"GL_SUN_convolution_border_modes",
476 	"GL_SUN_global_alpha",
477 	"GL_SUN_mesh_array",
478 	"GL_SUN_slice_accum",
479 	"GL_SUN_triangle_list",
480 	"GL_SUN_vertex",
481 	"GL_SUNX_constant_data",
482 	"GL_WIN_phong_shading",
483 	"GL_WIN_specular_fog",
484 	// unofficial stuff
485 	"GL_NVX_gpu_memory_info"
486 };
487 
488 
489 class COpenGLExtensionHandler
490 {
491 	public:
492 	enum EOpenGLFeatures {
493 		IRR_3DFX_multisample = 0,
494 		IRR_3DFX_tbuffer,
495 		IRR_3DFX_texture_compression_FXT1,
496 		IRR_AMD_blend_minmax_factor,
497 		IRR_AMD_conservative_depth,
498 		IRR_AMD_debug_output,
499 		IRR_AMD_depth_clamp_separate,
500 		IRR_AMD_draw_buffers_blend,
501 		IRR_AMD_multi_draw_indirect,
502 		IRR_AMD_name_gen_delete,
503 		IRR_AMD_performance_monitor,
504 		IRR_AMD_sample_positions,
505 		IRR_AMD_seamless_cubemap_per_texture,
506 		IRR_AMD_shader_stencil_export,
507 		IRR_AMD_texture_texture4,
508 		IRR_AMD_transform_feedback3_lines_triangles,
509 		IRR_AMD_vertex_shader_tesselator,
510 		IRR_APPLE_aux_depth_stencil,
511 		IRR_APPLE_client_storage,
512 		IRR_APPLE_element_array,
513 		IRR_APPLE_fence,
514 		IRR_APPLE_float_pixels,
515 		IRR_APPLE_flush_buffer_range,
516 		IRR_APPLE_object_purgeable,
517 		IRR_APPLE_rgb_422,
518 		IRR_APPLE_row_bytes,
519 		IRR_APPLE_specular_vector,
520 		IRR_APPLE_texture_range,
521 		IRR_APPLE_transform_hint,
522 		IRR_APPLE_vertex_array_object,
523 		IRR_APPLE_vertex_array_range,
524 		IRR_APPLE_vertex_program_evaluators,
525 		IRR_APPLE_ycbcr_422,
526 		IRR_ARB_base_instance,
527 		IRR_ARB_blend_func_extended,
528 		IRR_ARB_cl_event,
529 		IRR_ARB_color_buffer_float,
530 		IRR_ARB_compatibility,
531 		IRR_ARB_compressed_texture_pixel_storage,
532 		IRR_ARB_conservative_depth,
533 		IRR_ARB_copy_buffer,
534 		IRR_ARB_debug_output,
535 		IRR_ARB_depth_buffer_float,
536 		IRR_ARB_depth_clamp,
537 		IRR_ARB_depth_texture,
538 		IRR_ARB_draw_buffers,
539 		IRR_ARB_draw_buffers_blend,
540 		IRR_ARB_draw_elements_base_vertex,
541 		IRR_ARB_draw_indirect,
542 		IRR_ARB_draw_instanced,
543 		IRR_ARB_ES2_compatibility,
544 		IRR_ARB_explicit_attrib_location,
545 		IRR_ARB_fragment_coord_conventions,
546 		IRR_ARB_fragment_program,
547 		IRR_ARB_fragment_program_shadow,
548 		IRR_ARB_fragment_shader,
549 		IRR_ARB_framebuffer_object,
550 		IRR_ARB_framebuffer_sRGB,
551 		IRR_ARB_get_program_binary,
552 		IRR_ARB_geometry_shader4,
553 		IRR_ARB_gpu_shader5,
554 		IRR_ARB_gpu_shader_fp64,
555 		IRR_ARB_half_float_pixel,
556 		IRR_ARB_half_float_vertex,
557 		IRR_ARB_imaging,
558 		IRR_ARB_instanced_arrays,
559 		IRR_ARB_internalformat_query,
560 		IRR_ARB_map_buffer_alignment,
561 		IRR_ARB_map_buffer_range,
562 		IRR_ARB_matrix_palette,
563 		IRR_ARB_multisample,
564 		IRR_ARB_multitexture,
565 		IRR_ARB_occlusion_query,
566 		IRR_ARB_occlusion_query2,
567 		IRR_ARB_pixel_buffer_object,
568 		IRR_ARB_point_parameters,
569 		IRR_ARB_point_sprite,
570 		IRR_ARB_provoking_vertex,
571 		IRR_ARB_robustness,
572 		IRR_ARB_sample_shading,
573 		IRR_ARB_sampler_objects,
574 		IRR_ARB_seamless_cube_map,
575 		IRR_ARB_separate_shader_objects,
576 		IRR_ARB_shader_atomic_counters,
577 		IRR_ARB_shader_bit_encoding,
578 		IRR_ARB_shader_image_load_store,
579 		IRR_ARB_shader_objects,
580 		IRR_ARB_shader_precision,
581 		IRR_ARB_shader_stencil_export,
582 		IRR_ARB_shader_subroutine,
583 		IRR_ARB_shader_texture_lod,
584 		IRR_ARB_shading_language_100,
585 		IRR_ARB_shading_language_420pack,
586 		IRR_ARB_shading_language_include,
587 		IRR_ARB_shading_language_packing,
588 		IRR_ARB_shadow,
589 		IRR_ARB_shadow_ambient,
590 		IRR_ARB_sync,
591 		IRR_ARB_tessellation_shader,
592 		IRR_ARB_texture_border_clamp,
593 		IRR_ARB_texture_buffer_object,
594 		IRR_ARB_texture_buffer_object_rgb32,
595 		IRR_ARB_texture_compression,
596 		IRR_ARB_texture_compression_bptc,
597 		IRR_ARB_texture_compression_rgtc,
598 		IRR_ARB_texture_cube_map,
599 		IRR_ARB_texture_cube_map_array,
600 		IRR_ARB_texture_env_add,
601 		IRR_ARB_texture_env_combine,
602 		IRR_ARB_texture_env_crossbar,
603 		IRR_ARB_texture_env_dot3,
604 		IRR_ARB_texture_float,
605 		IRR_ARB_texture_gather,
606 		IRR_ARB_texture_mirrored_repeat,
607 		IRR_ARB_texture_multisample,
608 		IRR_ARB_texture_non_power_of_two,
609 		IRR_ARB_texture_query_lod,
610 		IRR_ARB_texture_rectangle,
611 		IRR_ARB_texture_rg,
612 		IRR_ARB_texture_rgb10_a2ui,
613 		IRR_ARB_texture_storage,
614 		IRR_ARB_texture_swizzle,
615 		IRR_ARB_timer_query,
616 		IRR_ARB_transform_feedback2,
617 		IRR_ARB_transform_feedback3,
618 		IRR_ARB_transform_feedback_instanced,
619 		IRR_ARB_transpose_matrix,
620 		IRR_ARB_uniform_buffer_object,
621 		IRR_ARB_vertex_array_bgra,
622 		IRR_ARB_vertex_array_object,
623 		IRR_ARB_vertex_attrib_64bit,
624 		IRR_ARB_vertex_blend,
625 		IRR_ARB_vertex_buffer_object,
626 		IRR_ARB_vertex_program,
627 		IRR_ARB_vertex_shader,
628 		IRR_ARB_vertex_type_2_10_10_10_rev,
629 		IRR_ARB_viewport_array,
630 		IRR_ARB_window_pos,
631 		IRR_ATI_draw_buffers,
632 		IRR_ATI_element_array,
633 		IRR_ATI_envmap_bumpmap,
634 		IRR_ATI_fragment_shader,
635 		IRR_ATI_map_object_buffer,
636 		IRR_ATI_meminfo,
637 		IRR_ATI_pixel_format_float,
638 		IRR_ATI_pn_triangles,
639 		IRR_ATI_separate_stencil,
640 		IRR_ATI_text_fragment_shader,
641 		IRR_ATI_texture_env_combine3,
642 		IRR_ATI_texture_float,
643 		IRR_ATI_texture_mirror_once,
644 		IRR_ATI_vertex_array_object,
645 		IRR_ATI_vertex_attrib_array_object,
646 		IRR_ATI_vertex_streams,
647 		IRR_EXT_422_pixels,
648 		IRR_EXT_abgr,
649 		IRR_EXT_bgra,
650 		IRR_EXT_bindable_uniform,
651 		IRR_EXT_blend_color,
652 		IRR_EXT_blend_equation_separate,
653 		IRR_EXT_blend_func_separate,
654 		IRR_EXT_blend_logic_op,
655 		IRR_EXT_blend_minmax,
656 		IRR_EXT_blend_subtract,
657 		IRR_EXT_clip_volume_hint,
658 		IRR_EXT_cmyka,
659 		IRR_EXT_color_subtable,
660 		IRR_EXT_compiled_vertex_array,
661 		IRR_EXT_convolution,
662 		IRR_EXT_coordinate_frame,
663 		IRR_EXT_copy_texture,
664 		IRR_EXT_cull_vertex,
665 		IRR_EXT_depth_bounds_test,
666 		IRR_EXT_direct_state_access,
667 		IRR_EXT_draw_buffers2,
668 		IRR_EXT_draw_instanced,
669 		IRR_EXT_draw_range_elements,
670 		IRR_EXT_fog_coord,
671 		IRR_EXT_framebuffer_blit,
672 		IRR_EXT_framebuffer_multisample,
673 		IRR_EXT_framebuffer_multisample_blit_scaled,
674 		IRR_EXT_framebuffer_object,
675 		IRR_EXT_framebuffer_sRGB,
676 		IRR_EXT_geometry_shader4,
677 		IRR_EXT_gpu_program_parameters,
678 		IRR_EXT_gpu_shader4,
679 		IRR_EXT_histogram,
680 		IRR_EXT_index_array_formats,
681 		IRR_EXT_index_func,
682 		IRR_EXT_index_material,
683 		IRR_EXT_index_texture,
684 		IRR_EXT_light_texture,
685 		IRR_EXT_misc_attribute,
686 		IRR_EXT_multi_draw_arrays,
687 		IRR_EXT_multisample,
688 		IRR_EXT_packed_depth_stencil,
689 		IRR_EXT_packed_float,
690 		IRR_EXT_packed_pixels,
691 		IRR_EXT_paletted_texture,
692 		IRR_EXT_pixel_buffer_object,
693 		IRR_EXT_pixel_transform,
694 		IRR_EXT_pixel_transform_color_table,
695 		IRR_EXT_point_parameters,
696 		IRR_EXT_polygon_offset,
697 		IRR_EXT_provoking_vertex,
698 		IRR_EXT_rescale_normal,
699 		IRR_EXT_secondary_color,
700 		IRR_EXT_separate_shader_objects,
701 		IRR_EXT_separate_specular_color,
702 		IRR_EXT_shader_image_load_store,
703 		IRR_EXT_shadow_funcs,
704 		IRR_EXT_shared_texture_palette,
705 		IRR_EXT_stencil_clear_tag,
706 		IRR_EXT_stencil_two_side,
707 		IRR_EXT_stencil_wrap,
708 		IRR_EXT_subtexture,
709 		IRR_EXT_texture,
710 		IRR_EXT_texture3D,
711 		IRR_EXT_texture_array,
712 		IRR_EXT_texture_buffer_object,
713 		IRR_EXT_texture_compression_latc,
714 		IRR_EXT_texture_compression_rgtc,
715 		IRR_EXT_texture_compression_s3tc,
716 		IRR_EXT_texture_cube_map,
717 		IRR_EXT_texture_env_add,
718 		IRR_EXT_texture_env_combine,
719 		IRR_EXT_texture_env_dot3,
720 		IRR_EXT_texture_filter_anisotropic,
721 		IRR_EXT_texture_integer,
722 		IRR_EXT_texture_lod_bias,
723 		IRR_EXT_texture_mirror_clamp,
724 		IRR_EXT_texture_object,
725 		IRR_EXT_texture_perturb_normal,
726 		IRR_EXT_texture_shared_exponent,
727 		IRR_EXT_texture_snorm,
728 		IRR_EXT_texture_sRGB,
729 		IRR_EXT_texture_sRGB_decode,
730 		IRR_EXT_texture_swizzle,
731 		IRR_EXT_timer_query,
732 		IRR_EXT_transform_feedback,
733 		IRR_EXT_vertex_array,
734 		IRR_EXT_vertex_array_bgra,
735 		IRR_EXT_vertex_attrib_64bit,
736 		IRR_EXT_vertex_shader,
737 		IRR_EXT_vertex_weighting,
738 		IRR_EXT_x11_sync_object,
739 		IRR_FfdMaskSGIX,
740 		IRR_GREMEDY_frame_terminator,
741 		IRR_GREMEDY_string_marker,
742 		IRR_HP_convolution_border_modes,
743 		IRR_HP_image_transform,
744 		IRR_HP_occlusion_test,
745 		IRR_HP_texture_lighting,
746 		IRR_IBM_cull_vertex,
747 		IRR_IBM_multimode_draw_arrays,
748 		IRR_IBM_rasterpos_clip,
749 		IRR_IBM_texture_mirrored_repeat,
750 		IRR_IBM_vertex_array_lists,
751 		IRR_INGR_blend_func_separate,
752 		IRR_INGR_color_clamp,
753 		IRR_INGR_interlace_read,
754 		IRR_INGR_palette_buffer,
755 		IRR_INTEL_parallel_arrays,
756 		IRR_INTEL_texture_scissor,
757 		IRR_MESA_pack_invert,
758 		IRR_MESA_resize_buffers,
759 		IRR_MESA_window_pos,
760 		IRR_MESAX_texture_stack,
761 		IRR_MESA_ycbcr_texture,
762 		IRR_NV_blend_square,
763 		IRR_NV_conditional_render,
764 		IRR_NV_copy_depth_to_color,
765 		IRR_NV_copy_image,
766 		IRR_NV_depth_buffer_float,
767 		IRR_NV_depth_clamp,
768 		IRR_NV_evaluators,
769 		IRR_NV_explicit_multisample,
770 		IRR_NV_fence,
771 		IRR_NV_float_buffer,
772 		IRR_NV_fog_distance,
773 		IRR_NV_fragment_program,
774 		IRR_NV_fragment_program2,
775 		IRR_NV_fragment_program4,
776 		IRR_NV_fragment_program_option,
777 		IRR_NV_framebuffer_multisample_coverage,
778 		IRR_NV_geometry_program4,
779 		IRR_NV_geometry_shader4,
780 		IRR_NV_gpu_program4,
781 		IRR_NV_gpu_program5,
782 		IRR_NV_gpu_shader5,
783 		IRR_NV_half_float,
784 		IRR_NV_light_max_exponent,
785 		IRR_NV_multisample_coverage,
786 		IRR_NV_multisample_filter_hint,
787 		IRR_NV_occlusion_query,
788 		IRR_NV_packed_depth_stencil,
789 		IRR_NV_parameter_buffer_object,
790 		IRR_NV_parameter_buffer_object2,
791 		IRR_NV_pixel_data_range,
792 		IRR_NV_point_sprite,
793 		IRR_NV_present_video,
794 		IRR_NV_primitive_restart,
795 		IRR_NV_register_combiners,
796 		IRR_NV_register_combiners2,
797 		IRR_NV_shader_buffer_load,
798 		IRR_NV_shader_buffer_store,
799 		IRR_NV_tessellation_program5,
800 		IRR_NV_texgen_emboss,
801 		IRR_NV_texgen_reflection,
802 		IRR_NV_texture_barrier,
803 		IRR_NV_texture_compression_vtc,
804 		IRR_NV_texture_env_combine4,
805 		IRR_NV_texture_expand_normal,
806 		IRR_NV_texture_multisample,
807 		IRR_NV_texture_rectangle,
808 		IRR_NV_texture_shader,
809 		IRR_NV_texture_shader2,
810 		IRR_NV_texture_shader3,
811 		IRR_NV_transform_feedback,
812 		IRR_NV_transform_feedback2,
813 		IRR_NV_vdpau_interop,
814 		IRR_NV_vertex_array_range,
815 		IRR_NV_vertex_array_range2,
816 		IRR_NV_vertex_attrib_integer_64bit,
817 		IRR_NV_vertex_buffer_unified_memory,
818 		IRR_NV_vertex_program,
819 		IRR_NV_vertex_program1_1,
820 		IRR_NV_vertex_program2,
821 		IRR_NV_vertex_program2_option,
822 		IRR_NV_vertex_program3,
823 		IRR_NV_vertex_program4,
824 		IRR_NV_video_capture,
825 		IRR_OES_read_format,
826 		IRR_OML_interlace,
827 		IRR_OML_resample,
828 		IRR_OML_subsample,
829 		IRR_PGI_misc_hints,
830 		IRR_PGI_vertex_hints,
831 		IRR_REND_screen_coordinates,
832 		IRR_S3_s3tc,
833 		IRR_SGI_color_matrix,
834 		IRR_SGI_color_table,
835 		IRR_SGI_depth_pass_instrument,
836 		IRR_SGIS_detail_texture,
837 		IRR_SGIS_fog_function,
838 		IRR_SGIS_generate_mipmap,
839 		IRR_SGIS_multisample,
840 		IRR_SGIS_pixel_texture,
841 		IRR_SGIS_point_line_texgen,
842 		IRR_SGIS_point_parameters,
843 		IRR_SGIS_sharpen_texture,
844 		IRR_SGIS_texture4D,
845 		IRR_SGIS_texture_border_clamp,
846 		IRR_SGIS_texture_color_mask,
847 		IRR_SGIS_texture_edge_clamp,
848 		IRR_SGIS_texture_filter4,
849 		IRR_SGIS_texture_lod,
850 		IRR_SGIS_texture_select,
851 		IRR_SGI_texture_color_table,
852 		IRR_SGIX_async,
853 		IRR_SGIX_async_histogram,
854 		IRR_SGIX_async_pixel,
855 		IRR_SGIX_blend_alpha_minmax,
856 		IRR_SGIX_calligraphic_fragment,
857 		IRR_SGIX_clipmap,
858 		IRR_SGIX_convolution_accuracy,
859 		IRR_SGIX_depth_pass_instrument,
860 		IRR_SGIX_depth_texture,
861 		IRR_SGIX_flush_raster,
862 		IRR_SGIX_fog_offset,
863 		IRR_SGIX_fog_scale,
864 		IRR_SGIX_fragment_lighting,
865 		IRR_SGIX_framezoom,
866 		IRR_SGIX_igloo_interface,
867 		IRR_SGIX_impact_pixel_texture,
868 		IRR_SGIX_instruments,
869 		IRR_SGIX_interlace,
870 		IRR_SGIX_ir_instrument1,
871 		IRR_SGIX_list_priority,
872 		IRR_SGIX_pixel_texture,
873 		IRR_SGIX_pixel_tiles,
874 		IRR_SGIX_polynomial_ffd,
875 		IRR_SGIX_reference_plane,
876 		IRR_SGIX_resample,
877 		IRR_SGIX_scalebias_hint,
878 		IRR_SGIX_shadow,
879 		IRR_SGIX_shadow_ambient,
880 		IRR_SGIX_sprite,
881 		IRR_SGIX_subsample,
882 		IRR_SGIX_tag_sample_buffer,
883 		IRR_SGIX_texture_add_env,
884 		IRR_SGIX_texture_coordinate_clamp,
885 		IRR_SGIX_texture_lod_bias,
886 		IRR_SGIX_texture_multi_buffer,
887 		IRR_SGIX_texture_scale_bias,
888 		IRR_SGIX_texture_select,
889 		IRR_SGIX_vertex_preclip,
890 		IRR_SGIX_ycrcb,
891 		IRR_SGIX_ycrcba,
892 		IRR_SGIX_ycrcb_subsample,
893 		IRR_SUN_convolution_border_modes,
894 		IRR_SUN_global_alpha,
895 		IRR_SUN_mesh_array,
896 		IRR_SUN_slice_accum,
897 		IRR_SUN_triangle_list,
898 		IRR_SUN_vertex,
899 		IRR_SUNX_constant_data,
900 		IRR_WIN_phong_shading,
901 		IRR_WIN_specular_fog,
902 		IRR_NVX_gpu_memory_info,
903 		IRR_OpenGL_Feature_Count
904 	};
905 
906 
907 	// constructor
908 	COpenGLExtensionHandler();
909 
910 	// deferred initialization
911 	void initExtensions(bool stencilBuffer, bool useCoreContext);
912 
913 	//! queries the features of the driver, returns true if feature is available
914 	bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const;
915 
916 	//! queries the features of the driver, returns true if feature is available
queryOpenGLFeature(EOpenGLFeatures feature)917 	bool queryOpenGLFeature(EOpenGLFeatures feature) const
918 	{
919 		return FeatureAvailable[feature];
920 	}
921 
922 	//! show all features with availablity
923 	void dump() const;
924 
925 	void dumpFramebufferFormats() const;
926 
927 	// Some variables for properties
928 	bool StencilBuffer;
929 	bool MultiTextureExtension;
930 	bool TextureCompressionExtension;
931 
932 	// Some non-boolean properties
933 	//! Maxmimum texture layers supported by the fixed pipeline
934 	u8 MaxSupportedTextures;
935 	//! Maxmimum texture layers supported by the engine
936 	u8 MaxTextureUnits;
937 	//! Maximum hardware lights supported
938 	u8 MaxLights;
939 	//! Maximal Anisotropy
940 	u8 MaxAnisotropy;
941 	//! Number of user clipplanes
942 	u8 MaxUserClipPlanes;
943 	//! Number of auxiliary buffers
944 	u8 MaxAuxBuffers;
945 	//! Number of rendertargets available as MRTs
946 	u8 MaxMultipleRenderTargets;
947 	//! Optimal number of indices per meshbuffer
948 	u32 MaxIndices;
949 	//! Maximal texture dimension
950 	u32 MaxTextureSize;
951 	//! Maximal vertices handled by geometry shaders
952 	u32 MaxGeometryVerticesOut;
953 	//! Maximal LOD Bias
954 	f32 MaxTextureLODBias;
955 	//! Minimal and maximal supported thickness for lines without smoothing
956 	GLfloat DimAliasedLine[2];
957 	//! Minimal and maximal supported thickness for points without smoothing
958 	GLfloat DimAliasedPoint[2];
959 	//! Minimal and maximal supported thickness for lines with smoothing
960 	GLfloat DimSmoothedLine[2];
961 	//! Minimal and maximal supported thickness for points with smoothing
962 	GLfloat DimSmoothedPoint[2];
963 
964 	//! OpenGL version as Integer: 100*Major+Minor, i.e. 2.1 becomes 201
965 	u16 Version;
966 	//! GLSL version as Integer: 100*Major+Minor
967 	u16 ShaderLanguageVersion;
968 
969 	bool OcclusionQuerySupport;
970 
971 	// public access to the (loaded) extensions.
972 	// general functions
973 	void extGlActiveTexture(GLenum texture);
974 	void extGlClientActiveTexture(GLenum texture);
975 	void extGlPointParameterf(GLint loc, GLfloat f);
976 	void extGlPointParameterfv(GLint loc, const GLfloat *v);
977 	void extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
978 	void extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
979 	void extGlCompressedTexImage2D(GLenum target, GLint level,
980 		GLenum internalformat, GLsizei width, GLsizei height,
981 		GLint border, GLsizei imageSize, const void* data);
982 
983 	// shader programming
984 	void extGlGenPrograms(GLsizei n, GLuint *programs);
985 	void extGlBindProgram(GLenum target, GLuint program);
986 	void extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
987 	void extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string);
988 	void extGlDeletePrograms(GLsizei n, const GLuint *programs);
989 	void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);
990 	GLhandleARB extGlCreateShaderObject(GLenum shaderType);
991 	GLuint extGlCreateShader(GLenum shaderType);
992 	// note: Due to the type confusion between shader_objects and OpenGL 2.0
993 	// we have to add the ARB extension for proper method definitions in case
994 	// that handleARB and uint are the same type
995 	void extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
996 	void extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);
997 	// note: Due to the type confusion between shader_objects and OpenGL 2.0
998 	// we have to add the ARB extension for proper method definitions in case
999 	// that handleARB and uint are the same type
1000 	void extGlCompileShaderARB(GLhandleARB shader);
1001 	void extGlCompileShader(GLuint shader);
1002 	GLhandleARB extGlCreateProgramObject(void);
1003 	GLuint extGlCreateProgram(void);
1004 	void extGlAttachObject(GLhandleARB program, GLhandleARB shader);
1005 	void extGlAttachShader(GLuint program, GLuint shader);
1006 	void extGlLinkProgramARB(GLhandleARB program);
1007 	// note: Due to the type confusion between shader_objects and OpenGL 2.0
1008 	// we have to add the ARB extension for proper method definitions in case
1009 	// that handleARB and uint are the same type
1010 	void extGlLinkProgram(GLuint program);
1011 	void extGlUseProgramObject(GLhandleARB prog);
1012 	void extGlUseProgram(GLuint prog);
1013 	void extGlDeleteObject(GLhandleARB object);
1014 	void extGlDeleteProgram(GLuint object);
1015 	void extGlDeleteShader(GLuint shader);
1016 	void extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
1017 	void extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders);
1018 	void extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
1019 	void extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
1020 	void extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
1021 	void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param);
1022 	void extGlGetShaderiv(GLuint shader, GLenum type, GLint *param);
1023 	void extGlGetProgramiv(GLuint program, GLenum type, GLint *param);
1024 	GLint extGlGetUniformLocationARB(GLhandleARB program, const char *name);
1025 	GLint extGlGetUniformLocation(GLuint program, const char *name);
1026 	void extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v);
1027 	void extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v);
1028 	void extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v);
1029 	void extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v);
1030 	void extGlUniform1bv(GLint loc, GLsizei count, const bool *v);
1031 	void extGlUniform2bv(GLint loc, GLsizei count, const bool *v);
1032 	void extGlUniform3bv(GLint loc, GLsizei count, const bool *v);
1033 	void extGlUniform4bv(GLint loc, GLsizei count, const bool *v);
1034 	void extGlUniform1iv(GLint loc, GLsizei count, const GLint *v);
1035 	void extGlUniform2iv(GLint loc, GLsizei count, const GLint *v);
1036 	void extGlUniform3iv(GLint loc, GLsizei count, const GLint *v);
1037 	void extGlUniform4iv(GLint loc, GLsizei count, const GLint *v);
1038 	void extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
1039 	void extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
1040 	void extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);
1041 	void extGlGetActiveUniformARB(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
1042 	void extGlGetActiveUniform(GLuint program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
1043 
1044 	// framebuffer objects
1045 	void extGlBindFramebuffer(GLenum target, GLuint framebuffer);
1046 	void extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
1047 	void extGlGenFramebuffers(GLsizei n, GLuint *framebuffers);
1048 	GLenum extGlCheckFramebufferStatus(GLenum target);
1049 	void extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
1050 	void extGlBindRenderbuffer(GLenum target, GLuint renderbuffer);
1051 	void extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
1052 	void extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
1053 	void extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
1054 	void extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
1055 	void extGlGenerateMipmap(GLenum target);
1056 	void extGlActiveStencilFace(GLenum face);
1057 	void extGlDrawBuffers(GLsizei n, const GLenum *bufs);
1058 
1059 	// vertex buffer object
1060 	void extGlGenBuffers(GLsizei n, GLuint *buffers);
1061 	void extGlBindBuffer(GLenum target, GLuint buffer);
1062 	void extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
1063 	void extGlDeleteBuffers(GLsizei n, const GLuint *buffers);
1064 	void extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
1065 	void extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
1066 	void *extGlMapBuffer (GLenum target, GLenum access);
1067 	GLboolean extGlUnmapBuffer (GLenum target);
1068 	GLboolean extGlIsBuffer (GLuint buffer);
1069 	void extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
1070 	void extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params);
1071 	void extGlProvokingVertex(GLenum mode);
1072 	void extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
1073 	void extGlEnableIndexed(GLenum target, GLuint index);
1074 	void extGlDisableIndexed(GLenum target, GLuint index);
1075 	void extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst);
1076 	void extGlBlendEquationIndexed(GLuint buf, GLenum mode);
1077 	void extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value);
1078 
1079 	// occlusion query
1080 	void extGlGenQueries(GLsizei n, GLuint *ids);
1081 	void extGlDeleteQueries(GLsizei n, const GLuint *ids);
1082 	GLboolean extGlIsQuery(GLuint id);
1083 	void extGlBeginQuery(GLenum target, GLuint id);
1084 	void extGlEndQuery(GLenum target);
1085 	void extGlGetQueryiv(GLenum target, GLenum pname, GLint *params);
1086 	void extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);
1087 	void extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
1088 
1089 	// generic vsync setting method for several extensions
1090 	void extGlSwapInterval(int interval);
1091 
1092 	// blend operations
1093 	void extGlBlendEquation(GLenum mode);
1094 
1095 	// the global feature array
1096 	bool FeatureAvailable[IRR_OpenGL_Feature_Count];
1097 
1098 	protected:
1099 	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
1100 		PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB;
1101 		PFNGLCLIENTACTIVETEXTUREARBPROC	pGlClientActiveTextureARB;
1102 		PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;
1103 		PFNGLGENPROGRAMSNVPROC pGlGenProgramsNV;
1104 		PFNGLBINDPROGRAMARBPROC pGlBindProgramARB;
1105 		PFNGLBINDPROGRAMNVPROC pGlBindProgramNV;
1106 		PFNGLDELETEPROGRAMSARBPROC pGlDeleteProgramsARB;
1107 		PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsNV;
1108 		PFNGLPROGRAMSTRINGARBPROC pGlProgramStringARB;
1109 		PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;
1110 		PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;
1111 		PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;
1112 		PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;
1113 		PFNGLCOMPILESHADERARBPROC pGlCompileShaderARB;
1114 		PFNGLCREATEPROGRAMOBJECTARBPROC pGlCreateProgramObjectARB;
1115 		PFNGLATTACHOBJECTARBPROC pGlAttachObjectARB;
1116 		PFNGLLINKPROGRAMARBPROC pGlLinkProgramARB;
1117 		PFNGLUSEPROGRAMOBJECTARBPROC pGlUseProgramObjectARB;
1118 		PFNGLDELETEOBJECTARBPROC pGlDeleteObjectARB;
1119 		PFNGLCREATEPROGRAMPROC pGlCreateProgram;
1120 		PFNGLUSEPROGRAMPROC pGlUseProgram;
1121 		PFNGLDELETEPROGRAMPROC pGlDeleteProgram;
1122 		PFNGLDELETESHADERPROC pGlDeleteShader;
1123 		PFNGLGETATTACHEDOBJECTSARBPROC pGlGetAttachedObjectsARB;
1124 		PFNGLGETATTACHEDSHADERSPROC pGlGetAttachedShaders;
1125 		PFNGLCREATESHADERPROC pGlCreateShader;
1126 		PFNGLSHADERSOURCEPROC pGlShaderSource;
1127 		PFNGLCOMPILESHADERPROC pGlCompileShader;
1128 		PFNGLATTACHSHADERPROC pGlAttachShader;
1129 		PFNGLLINKPROGRAMPROC pGlLinkProgram;
1130 		PFNGLGETINFOLOGARBPROC pGlGetInfoLogARB;
1131 		PFNGLGETSHADERINFOLOGPROC pGlGetShaderInfoLog;
1132 		PFNGLGETPROGRAMINFOLOGPROC pGlGetProgramInfoLog;
1133 		PFNGLGETOBJECTPARAMETERIVARBPROC pGlGetObjectParameterivARB;
1134 		PFNGLGETSHADERIVPROC pGlGetShaderiv;
1135 		PFNGLGETSHADERIVPROC pGlGetProgramiv;
1136 		PFNGLGETUNIFORMLOCATIONARBPROC pGlGetUniformLocationARB;
1137 		PFNGLGETUNIFORMLOCATIONPROC pGlGetUniformLocation;
1138 		PFNGLUNIFORM1FVARBPROC pGlUniform1fvARB;
1139 		PFNGLUNIFORM2FVARBPROC pGlUniform2fvARB;
1140 		PFNGLUNIFORM3FVARBPROC pGlUniform3fvARB;
1141 		PFNGLUNIFORM4FVARBPROC pGlUniform4fvARB;
1142 		PFNGLUNIFORM1IVARBPROC pGlUniform1ivARB;
1143 		PFNGLUNIFORM2IVARBPROC pGlUniform2ivARB;
1144 		PFNGLUNIFORM3IVARBPROC pGlUniform3ivARB;
1145 		PFNGLUNIFORM4IVARBPROC pGlUniform4ivARB;
1146 		PFNGLUNIFORMMATRIX2FVARBPROC pGlUniformMatrix2fvARB;
1147 		PFNGLUNIFORMMATRIX3FVARBPROC pGlUniformMatrix3fvARB;
1148 		PFNGLUNIFORMMATRIX4FVARBPROC pGlUniformMatrix4fvARB;
1149 		PFNGLGETACTIVEUNIFORMARBPROC pGlGetActiveUniformARB;
1150 		PFNGLGETACTIVEUNIFORMPROC pGlGetActiveUniform;
1151 		PFNGLPOINTPARAMETERFARBPROC  pGlPointParameterfARB;
1152 		PFNGLPOINTPARAMETERFVARBPROC pGlPointParameterfvARB;
1153 		PFNGLSTENCILFUNCSEPARATEPROC pGlStencilFuncSeparate;
1154 		PFNGLSTENCILOPSEPARATEPROC pGlStencilOpSeparate;
1155 		PFNGLSTENCILFUNCSEPARATEATIPROC pGlStencilFuncSeparateATI;
1156 		PFNGLSTENCILOPSEPARATEATIPROC pGlStencilOpSeparateATI;
1157 		PFNGLCOMPRESSEDTEXIMAGE2DPROC pGlCompressedTexImage2D;
1158 		// ARB framebuffer object
1159 		PFNGLBINDFRAMEBUFFERPROC pGlBindFramebuffer;
1160 		PFNGLDELETEFRAMEBUFFERSPROC pGlDeleteFramebuffers;
1161 		PFNGLGENFRAMEBUFFERSPROC pGlGenFramebuffers;
1162 		PFNGLCHECKFRAMEBUFFERSTATUSPROC pGlCheckFramebufferStatus;
1163 		PFNGLFRAMEBUFFERTEXTURE2DPROC pGlFramebufferTexture2D;
1164 		PFNGLBINDRENDERBUFFERPROC pGlBindRenderbuffer;
1165 		PFNGLDELETERENDERBUFFERSPROC pGlDeleteRenderbuffers;
1166 		PFNGLGENRENDERBUFFERSPROC pGlGenRenderbuffers;
1167 		PFNGLRENDERBUFFERSTORAGEPROC pGlRenderbufferStorage;
1168 		PFNGLFRAMEBUFFERRENDERBUFFERPROC pGlFramebufferRenderbuffer;
1169 		PFNGLGENERATEMIPMAPPROC pGlGenerateMipmap;
1170 		// EXT framebuffer object
1171 		PFNGLBINDFRAMEBUFFEREXTPROC pGlBindFramebufferEXT;
1172 		PFNGLDELETEFRAMEBUFFERSEXTPROC pGlDeleteFramebuffersEXT;
1173 		PFNGLGENFRAMEBUFFERSEXTPROC pGlGenFramebuffersEXT;
1174 		PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC pGlCheckFramebufferStatusEXT;
1175 		PFNGLFRAMEBUFFERTEXTURE2DEXTPROC pGlFramebufferTexture2DEXT;
1176 		PFNGLBINDRENDERBUFFEREXTPROC pGlBindRenderbufferEXT;
1177 		PFNGLDELETERENDERBUFFERSEXTPROC pGlDeleteRenderbuffersEXT;
1178 		PFNGLGENRENDERBUFFERSEXTPROC pGlGenRenderbuffersEXT;
1179 		PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;
1180 		PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;
1181 		PFNGLGENERATEMIPMAPEXTPROC pGlGenerateMipmapEXT;
1182 		PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT;
1183 		PFNGLDRAWBUFFERSARBPROC pGlDrawBuffersARB;
1184 		PFNGLDRAWBUFFERSATIPROC pGlDrawBuffersATI;
1185 		PFNGLGENBUFFERSARBPROC pGlGenBuffersARB;
1186 		PFNGLBINDBUFFERARBPROC pGlBindBufferARB;
1187 		PFNGLBUFFERDATAARBPROC pGlBufferDataARB;
1188 		PFNGLDELETEBUFFERSARBPROC pGlDeleteBuffersARB;
1189 		PFNGLBUFFERSUBDATAARBPROC pGlBufferSubDataARB;
1190 		PFNGLGETBUFFERSUBDATAARBPROC pGlGetBufferSubDataARB;
1191 		PFNGLMAPBUFFERARBPROC pGlMapBufferARB;
1192 		PFNGLUNMAPBUFFERARBPROC pGlUnmapBufferARB;
1193 		PFNGLISBUFFERARBPROC pGlIsBufferARB;
1194 		PFNGLGETBUFFERPARAMETERIVARBPROC pGlGetBufferParameterivARB;
1195 		PFNGLGETBUFFERPOINTERVARBPROC pGlGetBufferPointervARB;
1196 		PFNGLPROVOKINGVERTEXPROC pGlProvokingVertexARB;
1197 		PFNGLPROVOKINGVERTEXEXTPROC pGlProvokingVertexEXT;
1198 		PFNGLCOLORMASKINDEXEDEXTPROC pGlColorMaskIndexedEXT;
1199 		PFNGLENABLEINDEXEDEXTPROC pGlEnableIndexedEXT;
1200 		PFNGLDISABLEINDEXEDEXTPROC pGlDisableIndexedEXT;
1201 		PFNGLBLENDFUNCINDEXEDAMDPROC pGlBlendFuncIndexedAMD;
1202 		PFNGLBLENDFUNCIPROC pGlBlendFunciARB;
1203 		PFNGLBLENDEQUATIONINDEXEDAMDPROC pGlBlendEquationIndexedAMD;
1204 		PFNGLBLENDEQUATIONIPROC pGlBlendEquationiARB;
1205 		PFNGLPROGRAMPARAMETERIARBPROC pGlProgramParameteriARB;
1206 		PFNGLPROGRAMPARAMETERIEXTPROC pGlProgramParameteriEXT;
1207 		PFNGLGENQUERIESARBPROC pGlGenQueriesARB;
1208 		PFNGLDELETEQUERIESARBPROC pGlDeleteQueriesARB;
1209 		PFNGLISQUERYARBPROC pGlIsQueryARB;
1210 		PFNGLBEGINQUERYARBPROC pGlBeginQueryARB;
1211 		PFNGLENDQUERYARBPROC pGlEndQueryARB;
1212 		PFNGLGETQUERYIVARBPROC pGlGetQueryivARB;
1213 		PFNGLGETQUERYOBJECTIVARBPROC pGlGetQueryObjectivARB;
1214 		PFNGLGETQUERYOBJECTUIVARBPROC pGlGetQueryObjectuivARB;
1215 		PFNGLGENOCCLUSIONQUERIESNVPROC pGlGenOcclusionQueriesNV;
1216 		PFNGLDELETEOCCLUSIONQUERIESNVPROC pGlDeleteOcclusionQueriesNV;
1217 		PFNGLISOCCLUSIONQUERYNVPROC pGlIsOcclusionQueryNV;
1218 		PFNGLBEGINOCCLUSIONQUERYNVPROC pGlBeginOcclusionQueryNV;
1219 		PFNGLENDOCCLUSIONQUERYNVPROC pGlEndOcclusionQueryNV;
1220 		PFNGLGETOCCLUSIONQUERYIVNVPROC pGlGetOcclusionQueryivNV;
1221 		PFNGLGETOCCLUSIONQUERYUIVNVPROC pGlGetOcclusionQueryuivNV;
1222 		PFNGLBLENDEQUATIONEXTPROC pGlBlendEquationEXT;
1223 		PFNGLBLENDEQUATIONPROC pGlBlendEquation;
1224 		#if defined(WGL_EXT_swap_control)
1225 		PFNWGLSWAPINTERVALEXTPROC pWglSwapIntervalEXT;
1226 		#endif
1227 		#if defined(GLX_SGI_swap_control)
1228 		PFNGLXSWAPINTERVALSGIPROC pGlxSwapIntervalSGI;
1229 		#endif
1230 		#if defined(GLX_EXT_swap_control)
1231 		PFNGLXSWAPINTERVALEXTPROC pGlxSwapIntervalEXT;
1232 		#endif
1233 		#if defined(GLX_MESA_swap_control)
1234 		PFNGLXSWAPINTERVALMESAPROC pGlxSwapIntervalMESA;
1235 		#endif
1236 	#endif
1237 };
1238 
extGlActiveTexture(GLenum texture)1239 inline void COpenGLExtensionHandler::extGlActiveTexture(GLenum texture)
1240 {
1241 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1242 	if (MultiTextureExtension && pGlActiveTextureARB)
1243 		pGlActiveTextureARB(texture);
1244 #else
1245 	if (MultiTextureExtension)
1246 #ifdef GL_ARB_multitexture
1247 		glActiveTextureARB(texture);
1248 #else
1249 		glActiveTexture(texture);
1250 #endif
1251 #endif
1252 }
1253 
extGlClientActiveTexture(GLenum texture)1254 inline void COpenGLExtensionHandler::extGlClientActiveTexture(GLenum texture)
1255 {
1256 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1257 	if (MultiTextureExtension && pGlClientActiveTextureARB)
1258 		pGlClientActiveTextureARB(texture);
1259 #else
1260 	if (MultiTextureExtension)
1261 		glClientActiveTextureARB(texture);
1262 #endif
1263 }
1264 
extGlGenPrograms(GLsizei n,GLuint * programs)1265 inline void COpenGLExtensionHandler::extGlGenPrograms(GLsizei n, GLuint *programs)
1266 {
1267 	if (programs)
1268 		memset(programs,0,n*sizeof(GLuint));
1269 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1270 	if (pGlGenProgramsARB)
1271 		pGlGenProgramsARB(n, programs);
1272 	else if (pGlGenProgramsNV)
1273 		pGlGenProgramsNV(n, programs);
1274 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
1275 	glGenProgramsARB(n,programs);
1276 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
1277 	glGenProgramsNV(n,programs);
1278 #else
1279 	os::Printer::log("glGenPrograms not supported", ELL_ERROR);
1280 #endif
1281 }
1282 
extGlBindProgram(GLenum target,GLuint program)1283 inline void COpenGLExtensionHandler::extGlBindProgram(GLenum target, GLuint program)
1284 {
1285 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1286 	if (pGlBindProgramARB)
1287 		pGlBindProgramARB(target, program);
1288 	else if (pGlBindProgramNV)
1289 		pGlBindProgramNV(target, program);
1290 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
1291 	glBindProgramARB(target, program);
1292 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
1293 	glBindProgramNV(target, program);
1294 #else
1295 	os::Printer::log("glBindProgram not supported", ELL_ERROR);
1296 #endif
1297 }
1298 
extGlProgramString(GLenum target,GLenum format,GLsizei len,const GLvoid * string)1299 inline void COpenGLExtensionHandler::extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string)
1300 {
1301 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1302 	if (pGlProgramStringARB)
1303 		pGlProgramStringARB(target, format, len, string);
1304 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
1305 	glProgramStringARB(target,format,len,string);
1306 #else
1307 	os::Printer::log("glProgramString not supported", ELL_ERROR);
1308 #endif
1309 }
1310 
extGlLoadProgram(GLenum target,GLuint id,GLsizei len,const GLubyte * string)1311 inline void COpenGLExtensionHandler::extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string)
1312 {
1313 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1314 	if (pGlLoadProgramNV)
1315 		pGlLoadProgramNV(target, id, len, string);
1316 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
1317 	glLoadProgramNV(target,id,len,string);
1318 #else
1319 	os::Printer::log("glLoadProgram not supported", ELL_ERROR);
1320 #endif
1321 }
1322 
extGlDeletePrograms(GLsizei n,const GLuint * programs)1323 inline void COpenGLExtensionHandler::extGlDeletePrograms(GLsizei n, const GLuint *programs)
1324 {
1325 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1326 	if (pGlDeleteProgramsARB)
1327 		pGlDeleteProgramsARB(n, programs);
1328 	else if (pGlDeleteProgramsNV)
1329 		pGlDeleteProgramsNV(n, programs);
1330 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
1331 	glDeleteProgramsARB(n,programs);
1332 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
1333 	glDeleteProgramsNV(n,programs);
1334 #else
1335 	os::Printer::log("glDeletePrograms not supported", ELL_ERROR);
1336 #endif
1337 }
1338 
extGlProgramLocalParameter4fv(GLenum n,GLuint i,const GLfloat * f)1339 inline void COpenGLExtensionHandler::extGlProgramLocalParameter4fv(GLenum n, GLuint i, const GLfloat *f)
1340 {
1341 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1342 	if (pGlProgramLocalParameter4fvARB)
1343 		pGlProgramLocalParameter4fvARB(n,i,f);
1344 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
1345 	glProgramLocalParameter4fvARB(n,i,f);
1346 #else
1347 	os::Printer::log("glProgramLocalParameter4fv not supported", ELL_ERROR);
1348 #endif
1349 }
1350 
extGlCreateShaderObject(GLenum shaderType)1351 inline GLhandleARB COpenGLExtensionHandler::extGlCreateShaderObject(GLenum shaderType)
1352 {
1353 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1354 	if (pGlCreateShaderObjectARB)
1355 		return pGlCreateShaderObjectARB(shaderType);
1356 #elif defined(GL_ARB_shader_objects)
1357 	return glCreateShaderObjectARB(shaderType);
1358 #else
1359 	os::Printer::log("glCreateShaderObject not supported", ELL_ERROR);
1360 #endif
1361 	return 0;
1362 }
1363 
extGlCreateShader(GLenum shaderType)1364 inline GLuint COpenGLExtensionHandler::extGlCreateShader(GLenum shaderType)
1365 {
1366 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1367 	if (pGlCreateShader)
1368 		return pGlCreateShader(shaderType);
1369 #elif defined(GL_VERSION_2_0)
1370 	return glCreateShader(shaderType);
1371 #else
1372 	os::Printer::log("glCreateShader not supported", ELL_ERROR);
1373 #endif
1374 	return 0;
1375 }
1376 
extGlShaderSourceARB(GLhandleARB shader,GLsizei numOfStrings,const char ** strings,const GLint * lenOfStrings)1377 inline void COpenGLExtensionHandler::extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
1378 {
1379 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1380 	if (pGlShaderSourceARB)
1381 		pGlShaderSourceARB(shader, numOfStrings, strings, lenOfStrings);
1382 #elif defined(GL_ARB_shader_objects)
1383 	glShaderSourceARB(shader, numOfStrings, strings, (GLint *)lenOfStrings);
1384 #else
1385 	os::Printer::log("glShaderSource not supported", ELL_ERROR);
1386 #endif
1387 }
1388 
extGlShaderSource(GLuint shader,GLsizei numOfStrings,const char ** strings,const GLint * lenOfStrings)1389 inline void COpenGLExtensionHandler::extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)
1390 {
1391 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1392 	if (pGlShaderSource)
1393 		pGlShaderSource(shader, numOfStrings, strings, lenOfStrings);
1394 #elif defined(GL_VERSION_2_0)
1395 	glShaderSource(shader, numOfStrings, strings, (GLint *)lenOfStrings);
1396 #else
1397 	os::Printer::log("glShaderSource not supported", ELL_ERROR);
1398 #endif
1399 }
1400 
extGlCompileShaderARB(GLhandleARB shader)1401 inline void COpenGLExtensionHandler::extGlCompileShaderARB(GLhandleARB shader)
1402 {
1403 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1404 	if (pGlCompileShaderARB)
1405 		pGlCompileShaderARB(shader);
1406 #elif defined(GL_ARB_shader_objects)
1407 	glCompileShaderARB(shader);
1408 #else
1409 	os::Printer::log("glCompileShader not supported", ELL_ERROR);
1410 #endif
1411 }
1412 
extGlCompileShader(GLuint shader)1413 inline void COpenGLExtensionHandler::extGlCompileShader(GLuint shader)
1414 {
1415 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1416 	if (pGlCompileShader)
1417 		pGlCompileShader(shader);
1418 #elif defined(GL_VERSION_2_0)
1419 	glCompileShader(shader);
1420 #else
1421 	os::Printer::log("glCompileShader not supported", ELL_ERROR);
1422 #endif
1423 }
1424 
extGlCreateProgramObject(void)1425 inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)
1426 {
1427 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1428 	if (pGlCreateProgramObjectARB)
1429 		return pGlCreateProgramObjectARB();
1430 #elif defined(GL_ARB_shader_objects)
1431 	return glCreateProgramObjectARB();
1432 #else
1433 	os::Printer::log("glCreateProgramObject not supported", ELL_ERROR);
1434 #endif
1435 	return 0;
1436 }
1437 
extGlCreateProgram(void)1438 inline GLuint COpenGLExtensionHandler::extGlCreateProgram(void)
1439 {
1440 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1441 	if (pGlCreateProgram)
1442 		return pGlCreateProgram();
1443 #elif defined(GL_VERSION_2_0)
1444 	return glCreateProgram();
1445 #else
1446 	os::Printer::log("glCreateProgram not supported", ELL_ERROR);
1447 #endif
1448 	return 0;
1449 }
1450 
extGlAttachObject(GLhandleARB program,GLhandleARB shader)1451 inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLhandleARB shader)
1452 {
1453 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1454 	if (pGlAttachObjectARB)
1455 		pGlAttachObjectARB(program, shader);
1456 #elif defined(GL_ARB_shader_objects)
1457 	glAttachObjectARB(program, shader);
1458 #else
1459 	os::Printer::log("glAttachObject not supported", ELL_ERROR);
1460 #endif
1461 }
1462 
extGlAttachShader(GLuint program,GLuint shader)1463 inline void COpenGLExtensionHandler::extGlAttachShader(GLuint program, GLuint shader)
1464 {
1465 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1466 	if (pGlAttachShader)
1467 		pGlAttachShader(program, shader);
1468 #elif defined(GL_VERSION_2_0)
1469 	glAttachShader(program, shader);
1470 #else
1471 	os::Printer::log("glAttachShader not supported", ELL_ERROR);
1472 #endif
1473 }
1474 
extGlLinkProgramARB(GLhandleARB program)1475 inline void COpenGLExtensionHandler::extGlLinkProgramARB(GLhandleARB program)
1476 {
1477 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1478 	if (pGlLinkProgramARB)
1479 		pGlLinkProgramARB(program);
1480 #elif defined(GL_ARB_shader_objects)
1481 	glLinkProgramARB(program);
1482 #else
1483 	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
1484 #endif
1485 }
1486 
extGlLinkProgram(GLuint program)1487 inline void COpenGLExtensionHandler::extGlLinkProgram(GLuint program)
1488 {
1489 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1490 	if (pGlLinkProgram)
1491 		pGlLinkProgram(program);
1492 #elif defined(GL_VERSION_2_0)
1493 	glLinkProgram(program);
1494 #else
1495 	os::Printer::log("glLinkProgram not supported", ELL_ERROR);
1496 #endif
1497 }
1498 
extGlUseProgramObject(GLhandleARB prog)1499 inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)
1500 {
1501 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1502 	if (pGlUseProgramObjectARB)
1503 		pGlUseProgramObjectARB(prog);
1504 #elif defined(GL_ARB_shader_objects)
1505 	glUseProgramObjectARB(prog);
1506 #else
1507 	os::Printer::log("glUseProgramObject not supported", ELL_ERROR);
1508 #endif
1509 }
1510 
extGlUseProgram(GLuint prog)1511 inline void COpenGLExtensionHandler::extGlUseProgram(GLuint prog)
1512 {
1513 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1514 	if (pGlUseProgram)
1515 		pGlUseProgram(prog);
1516 #elif defined(GL_VERSION_2_0)
1517 	glUseProgram(prog);
1518 #else
1519 	os::Printer::log("glUseProgram not supported", ELL_ERROR);
1520 #endif
1521 }
1522 
extGlDeleteObject(GLhandleARB object)1523 inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)
1524 {
1525 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1526 	if (pGlDeleteObjectARB)
1527 		pGlDeleteObjectARB(object);
1528 #elif defined(GL_ARB_shader_objects)
1529 	glDeleteObjectARB(object);
1530 #else
1531 	os::Printer::log("glDeleteObject not supported", ELL_ERROR);
1532 #endif
1533 }
1534 
extGlDeleteProgram(GLuint object)1535 inline void COpenGLExtensionHandler::extGlDeleteProgram(GLuint object)
1536 {
1537 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1538 	if (pGlDeleteProgram)
1539 		pGlDeleteProgram(object);
1540 #elif defined(GL_VERSION_2_0)
1541 	glDeleteProgram(object);
1542 #else
1543 	os::Printer::log("glDeleteProgram not supported", ELL_ERROR);
1544 #endif
1545 }
1546 
extGlDeleteShader(GLuint shader)1547 inline void COpenGLExtensionHandler::extGlDeleteShader(GLuint shader)
1548 {
1549 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1550 	if (pGlDeleteShader)
1551 		pGlDeleteShader(shader);
1552 #elif defined(GL_VERSION_2_0)
1553 	glDeleteShader(shader);
1554 #else
1555 	os::Printer::log("glDeleteShader not supported", ELL_ERROR);
1556 #endif
1557 }
1558 
extGlGetAttachedObjects(GLhandleARB program,GLsizei maxcount,GLsizei * count,GLhandleARB * shaders)1559 inline void COpenGLExtensionHandler::extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders)
1560 {
1561 	if (count)
1562 		*count=0;
1563 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1564 	if (pGlGetAttachedObjectsARB)
1565 		pGlGetAttachedObjectsARB(program, maxcount, count, shaders);
1566 #elif defined(GL_ARB_shader_objects)
1567 	glGetAttachedObjectsARB(program, maxcount, count, shaders);
1568 #else
1569 	os::Printer::log("glGetAttachedObjects not supported", ELL_ERROR);
1570 #endif
1571 }
1572 
extGlGetAttachedShaders(GLuint program,GLsizei maxcount,GLsizei * count,GLuint * shaders)1573 inline void COpenGLExtensionHandler::extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1574 {
1575 	if (count)
1576 		*count=0;
1577 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1578 	if (pGlGetAttachedShaders)
1579 		pGlGetAttachedShaders(program, maxcount, count, shaders);
1580 #elif defined(GL_VERSION_2_0)
1581 	glGetAttachedShaders(program, maxcount, count, shaders);
1582 #else
1583 	os::Printer::log("glGetAttachedShaders not supported", ELL_ERROR);
1584 #endif
1585 }
1586 
extGlGetInfoLog(GLhandleARB object,GLsizei maxLength,GLsizei * length,GLcharARB * infoLog)1587 inline void COpenGLExtensionHandler::extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)
1588 {
1589 	if (length)
1590 		*length=0;
1591 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1592 	if (pGlGetInfoLogARB)
1593 		pGlGetInfoLogARB(object, maxLength, length, infoLog);
1594 #elif defined(GL_ARB_shader_objects)
1595 	glGetInfoLogARB(object, maxLength, length, infoLog);
1596 #else
1597 	os::Printer::log("glGetInfoLog not supported", ELL_ERROR);
1598 #endif
1599 }
1600 
extGlGetShaderInfoLog(GLuint shader,GLsizei maxLength,GLsizei * length,GLchar * infoLog)1601 inline void COpenGLExtensionHandler::extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
1602 {
1603 	if (length)
1604 		*length=0;
1605 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1606 	if (pGlGetShaderInfoLog)
1607 		pGlGetShaderInfoLog(shader, maxLength, length, infoLog);
1608 #elif defined(GL_VERSION_2_0)
1609 	glGetShaderInfoLog(shader, maxLength, length, infoLog);
1610 #else
1611 	os::Printer::log("glGetShaderInfoLog not supported", ELL_ERROR);
1612 #endif
1613 }
1614 
extGlGetProgramInfoLog(GLuint program,GLsizei maxLength,GLsizei * length,GLchar * infoLog)1615 inline void COpenGLExtensionHandler::extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog)
1616 {
1617 	if (length)
1618 		*length=0;
1619 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1620 	if (pGlGetProgramInfoLog)
1621 		pGlGetProgramInfoLog(program, maxLength, length, infoLog);
1622 #elif defined(GL_VERSION_2_0)
1623 	glGetProgramInfoLog(program, maxLength, length, infoLog);
1624 #else
1625 	os::Printer::log("glGetProgramInfoLog not supported", ELL_ERROR);
1626 #endif
1627 }
1628 
extGlGetObjectParameteriv(GLhandleARB object,GLenum type,GLint * param)1629 inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param)
1630 {
1631 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1632 	if (pGlGetObjectParameterivARB)
1633 		pGlGetObjectParameterivARB(object, type, param);
1634 #elif defined(GL_ARB_shader_objects)
1635 	glGetObjectParameterivARB(object, type, param);
1636 #else
1637 	os::Printer::log("glGetObjectParameteriv not supported", ELL_ERROR);
1638 #endif
1639 }
1640 
extGlGetShaderiv(GLuint shader,GLenum type,GLint * param)1641 inline void COpenGLExtensionHandler::extGlGetShaderiv(GLuint shader, GLenum type, GLint *param)
1642 {
1643 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1644 	if (pGlGetShaderiv)
1645 		pGlGetShaderiv(shader, type, param);
1646 #elif defined(GL_VERSION_2_0)
1647 	glGetShaderiv(shader, type, param);
1648 #else
1649 	os::Printer::log("glGetShaderiv not supported", ELL_ERROR);
1650 #endif
1651 }
1652 
extGlGetProgramiv(GLuint program,GLenum type,GLint * param)1653 inline void COpenGLExtensionHandler::extGlGetProgramiv(GLuint program, GLenum type, GLint *param)
1654 {
1655 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1656 	if (pGlGetProgramiv)
1657 		pGlGetProgramiv(program, type, param);
1658 #elif defined(GL_VERSION_2_0)
1659 	glGetProgramiv(program, type, param);
1660 #else
1661 	os::Printer::log("glGetProgramiv not supported", ELL_ERROR);
1662 #endif
1663 }
1664 
extGlGetUniformLocationARB(GLhandleARB program,const char * name)1665 inline GLint COpenGLExtensionHandler::extGlGetUniformLocationARB(GLhandleARB program, const char *name)
1666 {
1667 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1668 	if (pGlGetUniformLocationARB)
1669 		return pGlGetUniformLocationARB(program, name);
1670 #elif defined(GL_ARB_shader_objects)
1671 	return glGetUniformLocationARB(program, name);
1672 #else
1673 	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
1674 #endif
1675 	return 0;
1676 }
1677 
extGlGetUniformLocation(GLuint program,const char * name)1678 inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLuint program, const char *name)
1679 {
1680 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1681 	if (pGlGetUniformLocation)
1682 		return pGlGetUniformLocation(program, name);
1683 #elif defined(GL_VERSION_2_0)
1684 	return glGetUniformLocation(program, name);
1685 #else
1686 	os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);
1687 #endif
1688 	return 0;
1689 }
1690 
extGlUniform1fv(GLint loc,GLsizei count,const GLfloat * v)1691 inline void COpenGLExtensionHandler::extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v)
1692 {
1693 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1694 	if (pGlUniform1fvARB)
1695 		pGlUniform1fvARB(loc, count, v);
1696 #elif defined(GL_ARB_shader_objects)
1697 	glUniform1fvARB(loc, count, v);
1698 #else
1699 	os::Printer::log("glUniform1fv not supported", ELL_ERROR);
1700 #endif
1701 }
1702 
extGlUniform2fv(GLint loc,GLsizei count,const GLfloat * v)1703 inline void COpenGLExtensionHandler::extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v)
1704 {
1705 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1706 	if (pGlUniform2fvARB)
1707 		pGlUniform2fvARB(loc, count, v);
1708 #elif defined(GL_ARB_shader_objects)
1709 	glUniform2fvARB(loc, count, v);
1710 #else
1711 	os::Printer::log("glUniform2fv not supported", ELL_ERROR);
1712 #endif
1713 }
1714 
extGlUniform3fv(GLint loc,GLsizei count,const GLfloat * v)1715 inline void COpenGLExtensionHandler::extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v)
1716 {
1717 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1718 	if (pGlUniform3fvARB)
1719 		pGlUniform3fvARB(loc, count, v);
1720 #elif defined(GL_ARB_shader_objects)
1721 	glUniform3fvARB(loc, count, v);
1722 #else
1723 	os::Printer::log("glUniform3fv not supported", ELL_ERROR);
1724 #endif
1725 }
1726 
extGlUniform4fv(GLint loc,GLsizei count,const GLfloat * v)1727 inline void COpenGLExtensionHandler::extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v)
1728 {
1729 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1730 	if (pGlUniform4fvARB)
1731 		pGlUniform4fvARB(loc, count, v);
1732 #elif defined(GL_ARB_shader_objects)
1733 	glUniform4fvARB(loc, count, v);
1734 #else
1735 	os::Printer::log("glUniform4fv not supported", ELL_ERROR);
1736 #endif
1737 }
1738 
extGlUniform1iv(GLint loc,GLsizei count,const GLint * v)1739 inline void COpenGLExtensionHandler::extGlUniform1iv(GLint loc, GLsizei count, const GLint *v)
1740 {
1741 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1742 	if (pGlUniform1ivARB)
1743 		pGlUniform1ivARB(loc, count, v);
1744 #elif defined(GL_ARB_shader_objects)
1745 	glUniform1ivARB(loc, count, v);
1746 #else
1747 	os::Printer::log("glUniform1iv not supported", ELL_ERROR);
1748 #endif
1749 }
1750 
extGlUniform2iv(GLint loc,GLsizei count,const GLint * v)1751 inline void COpenGLExtensionHandler::extGlUniform2iv(GLint loc, GLsizei count, const GLint *v)
1752 {
1753 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1754 	if (pGlUniform2ivARB)
1755 		pGlUniform2ivARB(loc, count, v);
1756 #elif defined(GL_ARB_shader_objects)
1757 	glUniform2ivARB(loc, count, v);
1758 #else
1759 	os::Printer::log("glUniform2iv not supported", ELL_ERROR);
1760 #endif
1761 }
1762 
extGlUniform3iv(GLint loc,GLsizei count,const GLint * v)1763 inline void COpenGLExtensionHandler::extGlUniform3iv(GLint loc, GLsizei count, const GLint *v)
1764 {
1765 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1766 	if (pGlUniform3ivARB)
1767 		pGlUniform3ivARB(loc, count, v);
1768 #elif defined(GL_ARB_shader_objects)
1769 	glUniform3ivARB(loc, count, v);
1770 #else
1771 	os::Printer::log("glUniform3iv not supported", ELL_ERROR);
1772 #endif
1773 }
1774 
extGlUniform4iv(GLint loc,GLsizei count,const GLint * v)1775 inline void COpenGLExtensionHandler::extGlUniform4iv(GLint loc, GLsizei count, const GLint *v)
1776 {
1777 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1778 	if (pGlUniform4ivARB)
1779 		pGlUniform4ivARB(loc, count, v);
1780 #elif defined(GL_ARB_shader_objects)
1781 	glUniform4ivARB(loc, count, v);
1782 #else
1783 	os::Printer::log("glUniform4iv not supported", ELL_ERROR);
1784 #endif
1785 }
1786 
extGlUniformMatrix2fv(GLint loc,GLsizei count,GLboolean transpose,const GLfloat * v)1787 inline void COpenGLExtensionHandler::extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
1788 {
1789 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1790 	if (pGlUniformMatrix2fvARB)
1791 		pGlUniformMatrix2fvARB(loc, count, transpose, v);
1792 #elif defined(GL_ARB_shader_objects)
1793 	glUniformMatrix2fvARB(loc, count, transpose, v);
1794 #else
1795 	os::Printer::log("glUniformMatrix2fv not supported", ELL_ERROR);
1796 #endif
1797 }
1798 
extGlUniformMatrix3fv(GLint loc,GLsizei count,GLboolean transpose,const GLfloat * v)1799 inline void COpenGLExtensionHandler::extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
1800 {
1801 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1802 	if (pGlUniformMatrix3fvARB)
1803 		pGlUniformMatrix3fvARB(loc, count, transpose, v);
1804 #elif defined(GL_ARB_shader_objects)
1805 	glUniformMatrix3fvARB(loc, count, transpose, v);
1806 #else
1807 	os::Printer::log("glUniformMatrix3fv not supported", ELL_ERROR);
1808 #endif
1809 }
1810 
extGlUniformMatrix4fv(GLint loc,GLsizei count,GLboolean transpose,const GLfloat * v)1811 inline void COpenGLExtensionHandler::extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)
1812 {
1813 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1814 	if (pGlUniformMatrix4fvARB)
1815 		pGlUniformMatrix4fvARB(loc, count, transpose, v);
1816 #elif defined(GL_ARB_shader_objects)
1817 	glUniformMatrix4fvARB(loc, count, transpose, v);
1818 #else
1819 	os::Printer::log("glUniformMatrix4fv not supported", ELL_ERROR);
1820 #endif
1821 }
1822 
extGlGetActiveUniformARB(GLhandleARB program,GLuint index,GLsizei maxlength,GLsizei * length,GLint * size,GLenum * type,GLcharARB * name)1823 inline void COpenGLExtensionHandler::extGlGetActiveUniformARB(GLhandleARB program,
1824 		GLuint index, GLsizei maxlength, GLsizei *length,
1825 		GLint *size, GLenum *type, GLcharARB *name)
1826 {
1827 	if (length)
1828 		*length=0;
1829 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1830 	if (pGlGetActiveUniformARB)
1831 		pGlGetActiveUniformARB(program, index, maxlength, length, size, type, name);
1832 #elif defined(GL_ARB_shader_objects)
1833 	glGetActiveUniformARB(program, index, maxlength, length, size, type, name);
1834 #else
1835 	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
1836 #endif
1837 }
1838 
extGlGetActiveUniform(GLuint program,GLuint index,GLsizei maxlength,GLsizei * length,GLint * size,GLenum * type,GLchar * name)1839 inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLuint program,
1840 		GLuint index, GLsizei maxlength, GLsizei *length,
1841 		GLint *size, GLenum *type, GLchar *name)
1842 {
1843 	if (length)
1844 		*length=0;
1845 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1846 	if (pGlGetActiveUniform)
1847 		pGlGetActiveUniform(program, index, maxlength, length, size, type, name);
1848 #elif defined(GL_VERSION_2_0)
1849 	glGetActiveUniform(program, index, maxlength, length, size, type, name);
1850 #else
1851 	os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);
1852 #endif
1853 }
1854 
extGlPointParameterf(GLint loc,GLfloat f)1855 inline void COpenGLExtensionHandler::extGlPointParameterf(GLint loc, GLfloat f)
1856 {
1857 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1858 	if (pGlPointParameterfARB)
1859 		pGlPointParameterfARB(loc, f);
1860 #elif defined(GL_ARB_point_parameters)
1861 	glPointParameterfARB(loc, f);
1862 #else
1863 	os::Printer::log("glPointParameterf not supported", ELL_ERROR);
1864 #endif
1865 }
1866 
extGlPointParameterfv(GLint loc,const GLfloat * v)1867 inline void COpenGLExtensionHandler::extGlPointParameterfv(GLint loc, const GLfloat *v)
1868 {
1869 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1870 	if (pGlPointParameterfvARB)
1871 		pGlPointParameterfvARB(loc, v);
1872 #elif defined(GL_ARB_point_parameters)
1873 	glPointParameterfvARB(loc, v);
1874 #else
1875 	os::Printer::log("glPointParameterfv not supported", ELL_ERROR);
1876 #endif
1877 }
1878 
extGlStencilFuncSeparate(GLenum frontfunc,GLenum backfunc,GLint ref,GLuint mask)1879 inline void COpenGLExtensionHandler::extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)
1880 {
1881 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1882 	if (pGlStencilFuncSeparate)
1883 		pGlStencilFuncSeparate(frontfunc, backfunc, ref, mask);
1884 	else if (pGlStencilFuncSeparateATI)
1885 		pGlStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
1886 #elif defined(GL_VERSION_2_0)
1887 	glStencilFuncSeparate(frontfunc, backfunc, ref, mask);
1888 #elif defined(GL_ATI_separate_stencil)
1889 	glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);
1890 #else
1891 	os::Printer::log("glStencilFuncSeparate not supported", ELL_ERROR);
1892 #endif
1893 }
1894 
extGlStencilOpSeparate(GLenum face,GLenum fail,GLenum zfail,GLenum zpass)1895 inline void COpenGLExtensionHandler::extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
1896 {
1897 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1898 	if (pGlStencilOpSeparate)
1899 		pGlStencilOpSeparate(face, fail, zfail, zpass);
1900 	else if (pGlStencilOpSeparateATI)
1901 		pGlStencilOpSeparateATI(face, fail, zfail, zpass);
1902 #elif defined(GL_VERSION_2_0)
1903 	glStencilOpSeparate(face, fail, zfail, zpass);
1904 #elif defined(GL_ATI_separate_stencil)
1905 	glStencilOpSeparateATI(face, fail, zfail, zpass);
1906 #else
1907 	os::Printer::log("glStencilOpSeparate not supported", ELL_ERROR);
1908 #endif
1909 }
1910 
extGlCompressedTexImage2D(GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,const void * data)1911 inline void COpenGLExtensionHandler::extGlCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width,
1912 		GLsizei height, GLint border, GLsizei imageSize, const void* data)
1913 {
1914 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1915 	if (pGlCompressedTexImage2D)
1916 		pGlCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
1917 #elif defined(GL_ARB_texture_compression)
1918 	glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
1919 #else
1920 	os::Printer::log("glCompressedTexImage2D not supported", ELL_ERROR);
1921 #endif
1922 }
1923 
extGlBindFramebuffer(GLenum target,GLuint framebuffer)1924 inline void COpenGLExtensionHandler::extGlBindFramebuffer(GLenum target, GLuint framebuffer)
1925 {
1926 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1927 	if (pGlBindFramebuffer)
1928 		pGlBindFramebuffer(target, framebuffer);
1929 	else if (pGlBindFramebufferEXT)
1930 		pGlBindFramebufferEXT(target, framebuffer);
1931 #elif defined(GL_ARB_framebuffer_object)
1932 	glBindFramebuffer(target, framebuffer);
1933 #elif defined(GL_EXT_framebuffer_object)
1934 	glBindFramebufferEXT(target, framebuffer);
1935 #else
1936 	os::Printer::log("glBindFramebuffer not supported", ELL_ERROR);
1937 #endif
1938 }
1939 
extGlDeleteFramebuffers(GLsizei n,const GLuint * framebuffers)1940 inline void COpenGLExtensionHandler::extGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
1941 {
1942 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1943 	if (pGlDeleteFramebuffers)
1944 		pGlDeleteFramebuffers(n, framebuffers);
1945 	else if (pGlDeleteFramebuffersEXT)
1946 		pGlDeleteFramebuffersEXT(n, framebuffers);
1947 #elif defined(GL_ARB_framebuffer_object)
1948 	glDeleteFramebuffers(n, framebuffers);
1949 #elif defined(GL_EXT_framebuffer_object)
1950 	glDeleteFramebuffersEXT(n, framebuffers);
1951 #else
1952 	os::Printer::log("glDeleteFramebuffers not supported", ELL_ERROR);
1953 #endif
1954 }
1955 
extGlGenFramebuffers(GLsizei n,GLuint * framebuffers)1956 inline void COpenGLExtensionHandler::extGlGenFramebuffers(GLsizei n, GLuint *framebuffers)
1957 {
1958 	if (framebuffers)
1959 		memset(framebuffers,0,n*sizeof(GLuint));
1960 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1961 	if (pGlGenFramebuffers)
1962 		pGlGenFramebuffers(n, framebuffers);
1963 	else if (pGlGenFramebuffersEXT)
1964 		pGlGenFramebuffersEXT(n, framebuffers);
1965 #elif defined(GL_ARB_framebuffer_object)
1966 	glGenFramebuffers(n, framebuffers);
1967 #elif defined(GL_EXT_framebuffer_object)
1968 	glGenFramebuffersEXT(n, framebuffers);
1969 #else
1970 	os::Printer::log("glGenFramebuffers not supported", ELL_ERROR);
1971 #endif
1972 }
1973 
extGlCheckFramebufferStatus(GLenum target)1974 inline GLenum COpenGLExtensionHandler::extGlCheckFramebufferStatus(GLenum target)
1975 {
1976 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1977 	if (pGlCheckFramebufferStatus)
1978 		return pGlCheckFramebufferStatus(target);
1979 	else if (pGlCheckFramebufferStatusEXT)
1980 		return pGlCheckFramebufferStatusEXT(target);
1981 	else
1982 		return 0;
1983 #elif defined(GL_ARB_framebuffer_object)
1984 	return glCheckFramebufferStatus(target);
1985 #elif defined(GL_EXT_framebuffer_object)
1986 	return glCheckFramebufferStatusEXT(target);
1987 #else
1988 	os::Printer::log("glCheckFramebufferStatus not supported", ELL_ERROR);
1989 	return 0;
1990 #endif
1991 }
1992 
extGlFramebufferTexture2D(GLenum target,GLenum attachment,GLenum textarget,GLuint texture,GLint level)1993 inline void COpenGLExtensionHandler::extGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1994 {
1995 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
1996 	if (pGlFramebufferTexture2D)
1997 		pGlFramebufferTexture2D(target, attachment, textarget, texture, level);
1998 	else if (pGlFramebufferTexture2DEXT)
1999 		pGlFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
2000 #elif defined(GL_ARB_framebuffer_object)
2001 	glFramebufferTexture2D(target, attachment, textarget, texture, level);
2002 #elif defined(GL_EXT_framebuffer_object)
2003 	glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
2004 #else
2005 	os::Printer::log("glFramebufferTexture2D not supported", ELL_ERROR);
2006 #endif
2007 }
2008 
extGlBindRenderbuffer(GLenum target,GLuint renderbuffer)2009 inline void COpenGLExtensionHandler::extGlBindRenderbuffer(GLenum target, GLuint renderbuffer)
2010 {
2011 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2012 	if (pGlBindRenderbuffer)
2013 		pGlBindRenderbuffer(target, renderbuffer);
2014 	else if (pGlBindRenderbufferEXT)
2015 		pGlBindRenderbufferEXT(target, renderbuffer);
2016 #elif defined(GL_ARB_framebuffer_object)
2017 	glBindRenderbuffer(target, renderbuffer);
2018 #elif defined(GL_EXT_framebuffer_object)
2019 	glBindRenderbufferEXT(target, renderbuffer);
2020 #else
2021 	os::Printer::log("glBindRenderbuffer not supported", ELL_ERROR);
2022 #endif
2023 }
2024 
extGlDeleteRenderbuffers(GLsizei n,const GLuint * renderbuffers)2025 inline void COpenGLExtensionHandler::extGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
2026 {
2027 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2028 	if (pGlDeleteRenderbuffers)
2029 		pGlDeleteRenderbuffers(n, renderbuffers);
2030 	else if (pGlDeleteRenderbuffersEXT)
2031 		pGlDeleteRenderbuffersEXT(n, renderbuffers);
2032 #elif defined(GL_ARB_framebuffer_object)
2033 	glDeleteRenderbuffers(n, renderbuffers);
2034 #elif defined(GL_EXT_framebuffer_object)
2035 	glDeleteRenderbuffersEXT(n, renderbuffers);
2036 #else
2037 	os::Printer::log("glDeleteRenderbuffers not supported", ELL_ERROR);
2038 #endif
2039 }
2040 
extGlGenRenderbuffers(GLsizei n,GLuint * renderbuffers)2041 inline void COpenGLExtensionHandler::extGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
2042 {
2043 	if (renderbuffers)
2044 		memset(renderbuffers,0,n*sizeof(GLuint));
2045 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2046 	if (pGlGenRenderbuffers)
2047 		pGlGenRenderbuffers(n, renderbuffers);
2048 	else if (pGlGenRenderbuffersEXT)
2049 		pGlGenRenderbuffersEXT(n, renderbuffers);
2050 #elif defined(GL_ARB_framebuffer_object)
2051 	glGenRenderbuffers(n, renderbuffers);
2052 #elif defined(GL_EXT_framebuffer_object)
2053 	glGenRenderbuffersEXT(n, renderbuffers);
2054 #else
2055 	os::Printer::log("glGenRenderbuffers not supported", ELL_ERROR);
2056 #endif
2057 }
2058 
extGlRenderbufferStorage(GLenum target,GLenum internalformat,GLsizei width,GLsizei height)2059 inline void COpenGLExtensionHandler::extGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2060 {
2061 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2062 	if (pGlRenderbufferStorage)
2063 		pGlRenderbufferStorage(target, internalformat, width, height);
2064 	else if (pGlRenderbufferStorageEXT)
2065 		pGlRenderbufferStorageEXT(target, internalformat, width, height);
2066 #elif defined(GL_ARB_framebuffer_object)
2067 	glRenderbufferStorage(target, internalformat, width, height);
2068 #elif defined(GL_EXT_framebuffer_object)
2069 	glRenderbufferStorageEXT(target, internalformat, width, height);
2070 #else
2071 	os::Printer::log("glRenderbufferStorage not supported", ELL_ERROR);
2072 #endif
2073 }
2074 
extGlFramebufferRenderbuffer(GLenum target,GLenum attachment,GLenum renderbuffertarget,GLuint renderbuffer)2075 inline void COpenGLExtensionHandler::extGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2076 {
2077 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2078 	if (pGlFramebufferRenderbuffer)
2079 		pGlFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
2080 	else if (pGlFramebufferRenderbufferEXT)
2081 		pGlFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
2082 #elif defined(GL_ARB_framebuffer_object)
2083 	glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
2084 #elif defined(GL_EXT_framebuffer_object)
2085 	glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
2086 #else
2087 	os::Printer::log("glFramebufferRenderbuffer not supported", ELL_ERROR);
2088 #endif
2089 }
2090 
extGlGenerateMipmap(GLenum target)2091 inline void COpenGLExtensionHandler::extGlGenerateMipmap(GLenum target)
2092 {
2093 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2094 	if (pGlGenerateMipmap)
2095 		pGlGenerateMipmap(target);
2096 	else if (pGlGenerateMipmapEXT)
2097 		pGlGenerateMipmapEXT(target);
2098 #elif defined(GL_ARB_framebuffer_object)
2099 	glGenerateMipmap(target);
2100 #elif defined(GL_EXT_framebuffer_object)
2101 	glGenerateMipmapEXT(target);
2102 #else
2103 	os::Printer::log("glGenerateMipmap not supported", ELL_ERROR);
2104 #endif
2105 }
2106 
extGlActiveStencilFace(GLenum face)2107 inline void COpenGLExtensionHandler::extGlActiveStencilFace(GLenum face)
2108 {
2109 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2110 	if (pGlActiveStencilFaceEXT)
2111 		pGlActiveStencilFaceEXT(face);
2112 #elif defined(GL_EXT_stencil_two_side)
2113 	glActiveStencilFaceEXT(face);
2114 #else
2115 	os::Printer::log("glActiveStencilFace not supported", ELL_ERROR);
2116 #endif
2117 }
2118 
extGlDrawBuffers(GLsizei n,const GLenum * bufs)2119 inline void COpenGLExtensionHandler::extGlDrawBuffers(GLsizei n, const GLenum *bufs)
2120 {
2121 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2122 	if (pGlDrawBuffersARB)
2123 		pGlDrawBuffersARB(n, bufs);
2124 	else if (pGlDrawBuffersATI)
2125 		pGlDrawBuffersATI(n, bufs);
2126 #elif defined(GL_ARB_draw_buffers)
2127 	glDrawBuffersARB(n, bufs);
2128 #elif defined(GL_ATI_draw_buffers)
2129 	glDrawBuffersATI(n, bufs);
2130 #else
2131 	os::Printer::log("glDrawBuffers not supported", ELL_ERROR);
2132 #endif
2133 }
2134 
2135 
extGlGenBuffers(GLsizei n,GLuint * buffers)2136 inline void COpenGLExtensionHandler::extGlGenBuffers(GLsizei n, GLuint *buffers)
2137 {
2138 	if (buffers)
2139 		memset(buffers,0,n*sizeof(GLuint));
2140 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2141 	if (pGlGenBuffersARB)
2142 		pGlGenBuffersARB(n, buffers);
2143 #elif defined(GL_ARB_vertex_buffer_object)
2144 	glGenBuffers(n, buffers);
2145 #else
2146 	os::Printer::log("glGenBuffers not supported", ELL_ERROR);
2147 #endif
2148 }
2149 
extGlBindBuffer(GLenum target,GLuint buffer)2150 inline void COpenGLExtensionHandler::extGlBindBuffer(GLenum target, GLuint buffer)
2151 {
2152 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2153 	if (pGlBindBufferARB)
2154 		pGlBindBufferARB(target, buffer);
2155 #elif defined(GL_ARB_vertex_buffer_object)
2156 	glBindBuffer(target, buffer);
2157 #else
2158 	os::Printer::log("glBindBuffer not supported", ELL_ERROR);
2159 #endif
2160 }
2161 
extGlBufferData(GLenum target,GLsizeiptrARB size,const GLvoid * data,GLenum usage)2162 inline void COpenGLExtensionHandler::extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)
2163 {
2164 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2165 	if (pGlBufferDataARB)
2166 		pGlBufferDataARB(target, size, data, usage);
2167 #elif defined(GL_ARB_vertex_buffer_object)
2168 	glBufferData(target, size, data, usage);
2169 #else
2170 	os::Printer::log("glBufferData not supported", ELL_ERROR);
2171 #endif
2172 }
2173 
extGlDeleteBuffers(GLsizei n,const GLuint * buffers)2174 inline void COpenGLExtensionHandler::extGlDeleteBuffers(GLsizei n, const GLuint *buffers)
2175 {
2176 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2177 	if (pGlDeleteBuffersARB)
2178 		pGlDeleteBuffersARB(n, buffers);
2179 #elif defined(GL_ARB_vertex_buffer_object)
2180 	glDeleteBuffers(n, buffers);
2181 #else
2182 	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
2183 #endif
2184 }
2185 
extGlBufferSubData(GLenum target,GLintptrARB offset,GLsizeiptrARB size,const GLvoid * data)2186 inline void COpenGLExtensionHandler::extGlBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)
2187 {
2188 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2189 	if (pGlBufferSubDataARB)
2190 		pGlBufferSubDataARB(target, offset, size, data);
2191 #elif defined(GL_ARB_vertex_buffer_object)
2192 	glBufferSubData(target, offset, size, data);
2193 #else
2194 	os::Printer::log("glBufferSubData not supported", ELL_ERROR);
2195 #endif
2196 }
2197 
extGlGetBufferSubData(GLenum target,GLintptrARB offset,GLsizeiptrARB size,GLvoid * data)2198 inline void COpenGLExtensionHandler::extGlGetBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data)
2199 {
2200 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2201 	if (pGlGetBufferSubDataARB)
2202 		pGlGetBufferSubDataARB(target, offset, size, data);
2203 #elif defined(GL_ARB_vertex_buffer_object)
2204 	glGetBufferSubData(target, offset, size, data);
2205 #else
2206 	os::Printer::log("glGetBufferSubData not supported", ELL_ERROR);
2207 #endif
2208 }
2209 
extGlMapBuffer(GLenum target,GLenum access)2210 inline void *COpenGLExtensionHandler::extGlMapBuffer(GLenum target, GLenum access)
2211 {
2212 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2213 	if (pGlMapBufferARB)
2214 		return pGlMapBufferARB(target, access);
2215 	return 0;
2216 #elif defined(GL_ARB_vertex_buffer_object)
2217 	return glMapBuffer(target, access);
2218 #else
2219 	os::Printer::log("glMapBuffer not supported", ELL_ERROR);
2220 	return 0;
2221 #endif
2222 }
2223 
extGlUnmapBuffer(GLenum target)2224 inline GLboolean COpenGLExtensionHandler::extGlUnmapBuffer(GLenum target)
2225 {
2226 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2227 	if (pGlUnmapBufferARB)
2228 		return pGlUnmapBufferARB(target);
2229 	return false;
2230 #elif defined(GL_ARB_vertex_buffer_object)
2231 	return glUnmapBuffer(target);
2232 #else
2233 	os::Printer::log("glUnmapBuffer not supported", ELL_ERROR);
2234 	return false;
2235 #endif
2236 }
2237 
extGlIsBuffer(GLuint buffer)2238 inline GLboolean COpenGLExtensionHandler::extGlIsBuffer(GLuint buffer)
2239 {
2240 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2241 	if (pGlIsBufferARB)
2242 		return pGlIsBufferARB(buffer);
2243 	return false;
2244 #elif defined(GL_ARB_vertex_buffer_object)
2245 	return glIsBuffer(buffer);
2246 #else
2247 	os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);
2248 	return false;
2249 #endif
2250 }
2251 
extGlGetBufferParameteriv(GLenum target,GLenum pname,GLint * params)2252 inline void COpenGLExtensionHandler::extGlGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
2253 {
2254 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2255 	if (pGlGetBufferParameterivARB)
2256 		pGlGetBufferParameterivARB(target, pname, params);
2257 #elif defined(GL_ARB_vertex_buffer_object)
2258 	glGetBufferParameteriv(target, pname, params);
2259 #else
2260 	os::Printer::log("glGetBufferParameteriv not supported", ELL_ERROR);
2261 #endif
2262 }
2263 
extGlGetBufferPointerv(GLenum target,GLenum pname,GLvoid ** params)2264 inline void COpenGLExtensionHandler::extGlGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)
2265 {
2266 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2267 	if (pGlGetBufferPointervARB)
2268 		pGlGetBufferPointervARB(target, pname, params);
2269 #elif defined(GL_ARB_vertex_buffer_object)
2270 	glGetBufferPointerv(target, pname, params);
2271 #else
2272 	os::Printer::log("glGetBufferPointerv not supported", ELL_ERROR);
2273 #endif
2274 }
2275 
2276 
extGlProvokingVertex(GLenum mode)2277 inline void COpenGLExtensionHandler::extGlProvokingVertex(GLenum mode)
2278 {
2279 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2280 	if (FeatureAvailable[IRR_ARB_provoking_vertex] && pGlProvokingVertexARB)
2281 		pGlProvokingVertexARB(mode);
2282 	else if (FeatureAvailable[IRR_EXT_provoking_vertex] && pGlProvokingVertexEXT)
2283 		pGlProvokingVertexEXT(mode);
2284 #elif defined(GL_ARB_provoking_vertex)
2285 	glProvokingVertex(mode);
2286 #elif defined(GL_EXT_provoking_vertex)
2287 	glProvokingVertexEXT(mode);
2288 #else
2289 	os::Printer::log("glProvokingVertex not supported", ELL_ERROR);
2290 #endif
2291 }
2292 
2293 
extGlColorMaskIndexed(GLuint buf,GLboolean r,GLboolean g,GLboolean b,GLboolean a)2294 inline void COpenGLExtensionHandler::extGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a)
2295 {
2296 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2297 	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlColorMaskIndexedEXT)
2298 		pGlColorMaskIndexedEXT(buf, r, g, b, a);
2299 #elif defined(GL_EXT_draw_buffers2)
2300 	glColorMaskIndexedEXT(buf, r, g, b, a);
2301 #else
2302 	os::Printer::log("glColorMaskIndexed not supported", ELL_ERROR);
2303 #endif
2304 }
2305 
2306 
extGlEnableIndexed(GLenum target,GLuint index)2307 inline void COpenGLExtensionHandler::extGlEnableIndexed(GLenum target, GLuint index)
2308 {
2309 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2310 	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlEnableIndexedEXT)
2311 		pGlEnableIndexedEXT(target, index);
2312 #elif defined(GL_EXT_draw_buffers2)
2313 	glEnableIndexedEXT(target, index);
2314 #else
2315 	os::Printer::log("glEnableIndexed not supported", ELL_ERROR);
2316 #endif
2317 }
2318 
extGlDisableIndexed(GLenum target,GLuint index)2319 inline void COpenGLExtensionHandler::extGlDisableIndexed(GLenum target, GLuint index)
2320 {
2321 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2322 	if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlDisableIndexedEXT)
2323 		pGlDisableIndexedEXT(target, index);
2324 #elif defined(GL_EXT_draw_buffers2)
2325 	glDisableIndexedEXT(target, index);
2326 #else
2327 	os::Printer::log("glDisableIndexed not supported", ELL_ERROR);
2328 #endif
2329 }
2330 
extGlBlendFuncIndexed(GLuint buf,GLenum src,GLenum dst)2331 inline void COpenGLExtensionHandler::extGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst)
2332 {
2333 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2334 	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendFunciARB)
2335 		pGlBlendFunciARB(buf, src, dst);
2336 	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendFuncIndexedAMD)
2337 		pGlBlendFuncIndexedAMD(buf, src, dst);
2338 #elif defined(GL_ARB_draw_buffers_blend)
2339 	glBlendFunciARB(buf, src, dst);
2340 #elif defined(GL_AMD_draw_buffers_blend)
2341 	glBlendFuncIndexedAMD(buf, src, dst);
2342 #else
2343 	os::Printer::log("glBlendFuncIndexed not supported", ELL_ERROR);
2344 #endif
2345 }
2346 
extGlBlendEquationIndexed(GLuint buf,GLenum mode)2347 inline void COpenGLExtensionHandler::extGlBlendEquationIndexed(GLuint buf, GLenum mode)
2348 {
2349 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2350 	if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendEquationiARB)
2351 		pGlBlendEquationiARB(buf, mode);
2352 	else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendEquationIndexedAMD)
2353 		pGlBlendEquationIndexedAMD(buf, mode);
2354 #elif defined(GL_ARB_draw_buffers_blend)
2355 	glBlendEquationiARB(buf, mode);
2356 #elif defined(GL_AMD_draw_buffers_blend)
2357 	glBlendEquationIndexedAMD(buf, mode);
2358 #else
2359 	os::Printer::log("glBlendEquationIndexed not supported", ELL_ERROR);
2360 #endif
2361 }
2362 
extGlProgramParameteri(GLhandleARB program,GLenum pname,GLint value)2363 inline void COpenGLExtensionHandler::extGlProgramParameteri(GLhandleARB program, GLenum pname, GLint value)
2364 {
2365 #if defined(_IRR_OPENGL_USE_EXTPOINTER_)
2366 	if (queryFeature(EVDF_GEOMETRY_SHADER))
2367 	{
2368 		if (pGlProgramParameteriARB)
2369 			pGlProgramParameteriARB(program, pname, value);
2370 		else if (pGlProgramParameteriEXT)
2371 			pGlProgramParameteriEXT(program, pname, value);
2372 	}
2373 #elif defined(GL_ARB_geometry_shader4)
2374 	glProgramParameteriARB((size_t)program, pname, value);
2375 #elif defined(GL_EXT_geometry_shader4)
2376     #ifdef __clang__
2377     glProgramParameteriEXT((long)program, pname, value);
2378     #else
2379 	glProgramParameteriEXT((long GLuint)program, pname, value);
2380     #endif
2381 #elif defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4)
2382 	glProgramParameteriNV(program, pname, value);
2383 #else
2384 	os::Printer::log("glProgramParameteri not supported", ELL_ERROR);
2385 #endif
2386 }
2387 
extGlGenQueries(GLsizei n,GLuint * ids)2388 inline void COpenGLExtensionHandler::extGlGenQueries(GLsizei n, GLuint *ids)
2389 {
2390 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2391 	if (pGlGenQueriesARB)
2392 		pGlGenQueriesARB(n, ids);
2393 	else if (pGlGenOcclusionQueriesNV)
2394 		pGlGenOcclusionQueriesNV(n, ids);
2395 #elif defined(GL_ARB_occlusion_query)
2396 	glGenQueriesARB(n, ids);
2397 #elif defined(GL_NV_occlusion_query)
2398 	glGenOcclusionQueriesNV(n, ids);
2399 #else
2400 	os::Printer::log("glGenQueries not supported", ELL_ERROR);
2401 #endif
2402 }
2403 
extGlDeleteQueries(GLsizei n,const GLuint * ids)2404 inline void COpenGLExtensionHandler::extGlDeleteQueries(GLsizei n, const GLuint *ids)
2405 {
2406 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2407 	if (pGlDeleteQueriesARB)
2408 		pGlDeleteQueriesARB(n, ids);
2409 	else if (pGlDeleteOcclusionQueriesNV)
2410 		pGlDeleteOcclusionQueriesNV(n, ids);
2411 #elif defined(GL_ARB_occlusion_query)
2412 	glDeleteQueriesARB(n, ids);
2413 #elif defined(GL_NV_occlusion_query)
2414 	glDeleteOcclusionQueriesNV(n, ids);
2415 #else
2416 	os::Printer::log("glDeleteQueries not supported", ELL_ERROR);
2417 #endif
2418 }
2419 
extGlIsQuery(GLuint id)2420 inline GLboolean COpenGLExtensionHandler::extGlIsQuery(GLuint id)
2421 {
2422 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2423 	if (pGlIsQueryARB)
2424 		return pGlIsQueryARB(id);
2425 	else if (pGlIsOcclusionQueryNV)
2426 		return pGlIsOcclusionQueryNV(id);
2427 	return false;
2428 #elif defined(GL_ARB_occlusion_query)
2429 	return glIsQueryARB(id);
2430 #elif defined(GL_NV_occlusion_query)
2431 	return glIsOcclusionQueryNV(id);
2432 #else
2433 	return false;
2434 #endif
2435 }
2436 
extGlBeginQuery(GLenum target,GLuint id)2437 inline void COpenGLExtensionHandler::extGlBeginQuery(GLenum target, GLuint id)
2438 {
2439 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2440 	if (pGlBeginQueryARB)
2441 		pGlBeginQueryARB(target, id);
2442 	else if (pGlBeginOcclusionQueryNV)
2443 		pGlBeginOcclusionQueryNV(id);
2444 #elif defined(GL_ARB_occlusion_query)
2445 	glBeginQueryARB(target, id);
2446 #elif defined(GL_NV_occlusion_query)
2447 	glBeginOcclusionQueryNV(id);
2448 #else
2449 	os::Printer::log("glBeginQuery not supported", ELL_ERROR);
2450 #endif
2451 }
2452 
extGlEndQuery(GLenum target)2453 inline void COpenGLExtensionHandler::extGlEndQuery(GLenum target)
2454 {
2455 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2456 	if (pGlEndQueryARB)
2457 		pGlEndQueryARB(target);
2458 	else if (pGlEndOcclusionQueryNV)
2459 		pGlEndOcclusionQueryNV();
2460 #elif defined(GL_ARB_occlusion_query)
2461 	glEndQueryARB(target);
2462 #elif defined(GL_NV_occlusion_query)
2463 	glEndOcclusionQueryNV();
2464 #else
2465 	os::Printer::log("glEndQuery not supported", ELL_ERROR);
2466 #endif
2467 }
2468 
extGlGetQueryiv(GLenum target,GLenum pname,GLint * params)2469 inline void COpenGLExtensionHandler::extGlGetQueryiv(GLenum target, GLenum pname, GLint *params)
2470 {
2471 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2472 	if (pGlGetQueryivARB)
2473 		pGlGetQueryivARB(target, pname, params);
2474 #elif defined(GL_ARB_occlusion_query)
2475 	glGetQueryivARB(target, pname, params);
2476 #else
2477 	os::Printer::log("glGetQueryivARB not supported", ELL_ERROR);
2478 #endif
2479 }
2480 
extGlGetQueryObjectiv(GLuint id,GLenum pname,GLint * params)2481 inline void COpenGLExtensionHandler::extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
2482 {
2483 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2484 	if (pGlGetQueryObjectivARB)
2485 		pGlGetQueryObjectivARB(id, pname, params);
2486 	else if (pGlGetOcclusionQueryivNV)
2487 		pGlGetOcclusionQueryivNV(id, pname, params);
2488 #elif defined(GL_ARB_occlusion_query)
2489 	glGetQueryObjectivARB(id, pname, params);
2490 #elif defined(GL_NV_occlusion_query)
2491 	glGetOcclusionQueryivNV(id, pname, params);
2492 #else
2493 	os::Printer::log("glGetQueryObjectiv not supported", ELL_ERROR);
2494 #endif
2495 }
2496 
extGlGetQueryObjectuiv(GLuint id,GLenum pname,GLuint * params)2497 inline void COpenGLExtensionHandler::extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
2498 {
2499 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2500 	if (pGlGetQueryObjectuivARB)
2501 		pGlGetQueryObjectuivARB(id, pname, params);
2502 	else if (pGlGetOcclusionQueryuivNV)
2503 		pGlGetOcclusionQueryuivNV(id, pname, params);
2504 #elif defined(GL_ARB_occlusion_query)
2505 	glGetQueryObjectuivARB(id, pname, params);
2506 #elif defined(GL_NV_occlusion_query)
2507 	glGetOcclusionQueryuivNV(id, pname, params);
2508 #else
2509 	os::Printer::log("glGetQueryObjectuiv not supported", ELL_ERROR);
2510 #endif
2511 }
2512 
extGlSwapInterval(int interval)2513 inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)
2514 {
2515 	// we have wglext, so try to use that
2516 #if defined(_IRR_WINDOWS_API_) && defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)
2517 #ifdef WGL_EXT_swap_control
2518 	if (pWglSwapIntervalEXT)
2519 		pWglSwapIntervalEXT(interval);
2520 #endif
2521 #endif
2522 #ifdef _IRR_COMPILE_WITH_X11_DEVICE_
2523 	//TODO: Check GLX_EXT_swap_control and GLX_MESA_swap_control
2524 #ifdef GLX_SGI_swap_control
2525 	// does not work with interval==0
2526 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2527 	if (interval && pGlxSwapIntervalSGI)
2528 		pGlxSwapIntervalSGI(interval);
2529 #else
2530 	if (interval)
2531 		glXSwapIntervalSGI(interval);
2532 #endif
2533 #elif defined(GLX_EXT_swap_control)
2534 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2535 	Display *dpy = glXGetCurrentDisplay();
2536 	GLXDrawable drawable = glXGetCurrentDrawable();
2537 
2538 	if (pGlxSwapIntervalEXT)
2539 		pGlxSwapIntervalEXT(dpy, drawable, interval);
2540 #else
2541 	pGlXSwapIntervalEXT(dpy, drawable, interval);
2542 #endif
2543 #elif defined(GLX_MESA_swap_control)
2544 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2545 	if (pGlxSwapIntervalMESA)
2546 		pGlxSwapIntervalMESA(interval);
2547 #else
2548 	pGlXSwapIntervalMESA(interval);
2549 #endif
2550 #endif
2551 #endif
2552 }
2553 
extGlBlendEquation(GLenum mode)2554 inline void COpenGLExtensionHandler::extGlBlendEquation(GLenum mode)
2555 {
2556 #ifdef _IRR_OPENGL_USE_EXTPOINTER_
2557 	if (pGlBlendEquation)
2558 		pGlBlendEquation(mode);
2559 	else if (pGlBlendEquationEXT)
2560 		pGlBlendEquationEXT(mode);
2561 #elif defined(GL_EXT_blend_minmax) || defined(GL_EXT_blend_subtract) || defined(GL_EXT_blend_logic_op)
2562 	glBlendEquationEXT(mode);
2563 #elif defined(GL_VERSION_1_2)
2564 	glBlendEquation(mode);
2565 #else
2566 	os::Printer::log("glBlendEquation not supported", ELL_ERROR);
2567 #endif
2568 }
2569 
2570 
2571 }
2572 }
2573 
2574 #endif
2575 
2576 #endif
2577 
2578