]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COpenGLExtensionHandler.h
Reduce IrrCompileConfig usage to files that actually need it
[irrlicht.git] / source / Irrlicht / COpenGLExtensionHandler.h
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h\r
4 \r
5 #ifndef __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__\r
6 #define __C_OPEN_GL_FEATURE_MAP_H_INCLUDED__\r
7 \r
8 \r
9 #ifdef _IRR_COMPILE_WITH_OPENGL_\r
10 \r
11 #include "EDriverFeatures.h"\r
12 #include "irrTypes.h"\r
13 #include "os.h"\r
14 \r
15 #include "COpenGLCommon.h"\r
16 \r
17 #include "COpenGLCoreFeature.h"\r
18 \r
19 namespace irr\r
20 {\r
21 namespace video\r
22 {\r
23 \r
24 static const char* const OpenGLFeatureStrings[] = {\r
25         "GL_3DFX_multisample",\r
26         "GL_3DFX_tbuffer",\r
27         "GL_3DFX_texture_compression_FXT1",\r
28         "GL_AMD_blend_minmax_factor",\r
29         "GL_AMD_conservative_depth",\r
30         "GL_AMD_debug_output",\r
31         "GL_AMD_depth_clamp_separate",\r
32         "GL_AMD_draw_buffers_blend",\r
33         "GL_AMD_interleaved_elements",\r
34         "GL_AMD_multi_draw_indirect",\r
35         "GL_AMD_name_gen_delete",\r
36         "GL_AMD_performance_monitor",\r
37         "GL_AMD_pinned_memory",\r
38         "GL_AMD_query_buffer_object",\r
39         "GL_AMD_sample_positions",\r
40         "GL_AMD_seamless_cubemap_per_texture",\r
41         "GL_AMD_shader_atomic_counter_ops",\r
42         "GL_AMD_shader_stencil_export",\r
43         "GL_AMD_shader_trinary_minmax",\r
44         "GL_AMD_sparse_texture",\r
45         "GL_AMD_stencil_operation_extended",\r
46         "GL_AMD_texture_texture4",\r
47         "GL_AMD_transform_feedback3_lines_triangles",\r
48         "GL_AMD_vertex_shader_layer",\r
49         "GL_AMD_vertex_shader_tessellator",\r
50         "GL_AMD_vertex_shader_viewport_index",\r
51         "GL_APPLE_aux_depth_stencil",\r
52         "GL_APPLE_client_storage",\r
53         "GL_APPLE_element_array",\r
54         "GL_APPLE_fence",\r
55         "GL_APPLE_float_pixels",\r
56         "GL_APPLE_flush_buffer_range",\r
57         "GL_APPLE_object_purgeable",\r
58         "GL_APPLE_rgb_422",\r
59         "GL_APPLE_row_bytes",\r
60         "GL_APPLE_specular_vector",\r
61         "GL_APPLE_texture_range",\r
62         "GL_APPLE_transform_hint",\r
63         "GL_APPLE_vertex_array_object",\r
64         "GL_APPLE_vertex_array_range",\r
65         "GL_APPLE_vertex_program_evaluators",\r
66         "GL_APPLE_ycbcr_422",\r
67         "GL_ARB_arrays_of_arrays",\r
68         "GL_ARB_base_instance",\r
69         "GL_ARB_bindless_texture",\r
70         "GL_ARB_blend_func_extended",\r
71         "GL_ARB_buffer_storage",\r
72         "GL_ARB_cl_event",\r
73         "GL_ARB_clear_buffer_object",\r
74         "GL_ARB_clear_texture",\r
75         "GL_ARB_color_buffer_float",\r
76         "GL_ARB_compatibility",\r
77         "GL_ARB_compressed_texture_pixel_storage",\r
78         "GL_ARB_compute_shader",\r
79         "GL_ARB_compute_variable_group_size",\r
80         "GL_ARB_conservative_depth",\r
81         "GL_ARB_copy_buffer",\r
82         "GL_ARB_copy_image",\r
83         "GL_ARB_debug_output",\r
84         "GL_ARB_depth_buffer_float",\r
85         "GL_ARB_depth_clamp",\r
86         "GL_ARB_depth_texture",\r
87         "GL_ARB_direct_state_access",\r
88         "GL_ARB_draw_buffers",\r
89         "GL_ARB_draw_buffers_blend",\r
90         "GL_ARB_draw_elements_base_vertex",\r
91         "GL_ARB_draw_indirect",\r
92         "GL_ARB_draw_instanced",\r
93         "GL_ARB_ES2_compatibility",\r
94         "GL_ARB_ES3_compatibility",\r
95         "GL_ARB_enhanced_layouts",\r
96         "GL_ARB_explicit_attrib_location",\r
97         "GL_ARB_explicit_uniform_location",\r
98         "GL_ARB_fragment_coord_conventions",\r
99         "GL_ARB_fragment_layer_viewport",\r
100         "GL_ARB_fragment_program",\r
101         "GL_ARB_fragment_program_shadow",\r
102         "GL_ARB_fragment_shader",\r
103         "GL_ARB_framebuffer_no_attachments",\r
104         "GL_ARB_framebuffer_object",\r
105         "GL_ARB_framebuffer_sRGB",\r
106         "GL_ARB_geometry_shader4",\r
107         "GL_ARB_get_program_binary",\r
108         "GL_ARB_gpu_shader5",\r
109         "GL_ARB_gpu_shader_fp64",\r
110         "GL_ARB_half_float_pixel",\r
111         "GL_ARB_half_float_vertex",\r
112         "GL_ARB_imaging",\r
113         "GL_ARB_indirect_parameters",\r
114         "GL_ARB_instanced_arrays",\r
115         "GL_ARB_internalformat_query",\r
116         "GL_ARB_internalformat_query2",\r
117         "GL_ARB_invalidate_subdata",\r
118         "GL_ARB_map_buffer_alignment",\r
119         "GL_ARB_map_buffer_range",\r
120         "GL_ARB_matrix_palette",\r
121         "GL_ARB_multi_bind",\r
122         "GL_ARB_multi_draw_indirect",\r
123         "GL_ARB_multisample",\r
124         "GL_ARB_multitexture",\r
125         "GL_ARB_occlusion_query",\r
126         "GL_ARB_occlusion_query2",\r
127         "GL_ARB_pixel_buffer_object",\r
128         "GL_ARB_point_parameters",\r
129         "GL_ARB_point_sprite",\r
130         "GL_ARB_program_interface_query",\r
131         "GL_ARB_provoking_vertex",\r
132         "GL_ARB_query_buffer_object",\r
133         "GL_ARB_robust_buffer_access_behavior",\r
134         "GL_ARB_robustness",\r
135         "GL_ARB_robustness_isolation",\r
136         "GL_ARB_sample_shading",\r
137         "GL_ARB_sampler_objects",\r
138         "GL_ARB_seamless_cube_map",\r
139         "GL_ARB_seamless_cubemap_per_texture",\r
140         "GL_ARB_separate_shader_objects",\r
141         "GL_ARB_shader_atomic_counters",\r
142         "GL_ARB_shader_bit_encoding",\r
143         "GL_ARB_shader_draw_parameters",\r
144         "GL_ARB_shader_group_vote",\r
145         "GL_ARB_shader_image_load_store",\r
146         "GL_ARB_shader_image_size",\r
147         "GL_ARB_shader_objects",\r
148         "GL_ARB_shader_precision",\r
149         "GL_ARB_shader_stencil_export",\r
150         "GL_ARB_shader_storage_buffer_object",\r
151         "GL_ARB_shader_subroutine",\r
152         "GL_ARB_shader_texture_lod",\r
153         "GL_ARB_shading_language_100",\r
154         "GL_ARB_shading_language_420pack",\r
155         "GL_ARB_shading_language_include",\r
156         "GL_ARB_shading_language_packing",\r
157         "GL_ARB_shadow",\r
158         "GL_ARB_shadow_ambient",\r
159         "GL_ARB_sparse_texture",\r
160         "GL_ARB_stencil_texturing",\r
161         "GL_ARB_sync",\r
162         "GL_ARB_tessellation_shader",\r
163         "GL_ARB_texture_border_clamp",\r
164         "GL_ARB_texture_buffer_object",\r
165         "GL_ARB_texture_buffer_object_rgb32",\r
166         "GL_ARB_texture_buffer_range",\r
167         "GL_ARB_texture_compression",\r
168         "GL_ARB_texture_compression_bptc",\r
169         "GL_ARB_texture_compression_rgtc",\r
170         "GL_ARB_texture_cube_map",\r
171         "GL_ARB_texture_cube_map_array",\r
172         "GL_ARB_texture_env_add",\r
173         "GL_ARB_texture_env_combine",\r
174         "GL_ARB_texture_env_crossbar",\r
175         "GL_ARB_texture_env_dot3",\r
176         "GL_ARB_texture_float",\r
177         "GL_ARB_texture_gather",\r
178         "GL_ARB_texture_mirror_clamp_to_edge",\r
179         "GL_ARB_texture_mirrored_repeat",\r
180         "GL_ARB_texture_multisample",\r
181         "GL_ARB_texture_non_power_of_two",\r
182         "GL_ARB_texture_query_levels",\r
183         "GL_ARB_texture_query_lod",\r
184         "GL_ARB_texture_rectangle",\r
185         "GL_ARB_texture_rg",\r
186         "GL_ARB_texture_rgb10_a2ui",\r
187         "GL_ARB_texture_stencil8",\r
188         "GL_ARB_texture_storage",\r
189         "GL_ARB_texture_storage_multisample",\r
190         "GL_ARB_texture_swizzle",\r
191         "GL_ARB_texture_view",\r
192         "GL_ARB_timer_query",\r
193         "GL_ARB_transform_feedback2",\r
194         "GL_ARB_transform_feedback3",\r
195         "GL_ARB_transform_feedback_instanced",\r
196         "GL_ARB_transpose_matrix",\r
197         "GL_ARB_uniform_buffer_object",\r
198         "GL_ARB_vertex_array_bgra",\r
199         "GL_ARB_vertex_array_object",\r
200         "GL_ARB_vertex_attrib_64bit",\r
201         "GL_ARB_vertex_attrib_binding",\r
202         "GL_ARB_vertex_blend",\r
203         "GL_ARB_vertex_buffer_object",\r
204         "GL_ARB_vertex_program",\r
205         "GL_ARB_vertex_shader",\r
206         "GL_ARB_vertex_type_10f_11f_11f_rev",\r
207         "GL_ARB_vertex_type_2_10_10_10_rev",\r
208         "GL_ARB_viewport_array",\r
209         "GL_ARB_window_pos",\r
210         "GL_ATI_draw_buffers",\r
211         "GL_ATI_element_array",\r
212         "GL_ATI_envmap_bumpmap",\r
213         "GL_ATI_fragment_shader",\r
214         "GL_ATI_map_object_buffer",\r
215         "GL_ATI_meminfo",\r
216         "GL_ATI_pixel_format_float",\r
217         "GL_ATI_pn_triangles",\r
218         "GL_ATI_separate_stencil",\r
219         "GL_ATI_text_fragment_shader",\r
220         "GL_ATI_texture_env_combine3",\r
221         "GL_ATI_texture_float",\r
222         "GL_ATI_texture_mirror_once",\r
223         "GL_ATI_vertex_array_object",\r
224         "GL_ATI_vertex_attrib_array_object",\r
225         "GL_ATI_vertex_streams",\r
226         "GL_EXT_422_pixels",\r
227         "GL_EXT_abgr",\r
228         "GL_EXT_bgra",\r
229         "GL_EXT_bindable_uniform",\r
230         "GL_EXT_blend_color",\r
231         "GL_EXT_blend_equation_separate",\r
232         "GL_EXT_blend_func_separate",\r
233         "GL_EXT_blend_logic_op",\r
234         "GL_EXT_blend_minmax",\r
235         "GL_EXT_blend_subtract",\r
236         "GL_EXT_clip_volume_hint",\r
237         "GL_EXT_cmyka",\r
238         "GL_EXT_color_subtable",\r
239         "GL_EXT_compiled_vertex_array",\r
240         "GL_EXT_convolution",\r
241         "GL_EXT_coordinate_frame",\r
242         "GL_EXT_copy_texture",\r
243         "GL_EXT_cull_vertex",\r
244         "GL_EXT_debug_label",\r
245         "GL_EXT_debug_marker",\r
246         "GL_EXT_depth_bounds_test",\r
247         "GL_EXT_direct_state_access",\r
248         "GL_EXT_draw_buffers2",\r
249         "GL_EXT_draw_instanced",\r
250         "GL_EXT_draw_range_elements",\r
251         "GL_EXT_fog_coord",\r
252         "GL_EXT_framebuffer_blit",\r
253         "GL_EXT_framebuffer_multisample",\r
254         "GL_EXT_framebuffer_multisample_blit_scaled",\r
255         "GL_EXT_framebuffer_object",\r
256         "GL_EXT_framebuffer_sRGB",\r
257         "GL_EXT_geometry_shader4",\r
258         "GL_EXT_gpu_program_parameters",\r
259         "GL_EXT_gpu_shader4",\r
260         "GL_EXT_histogram",\r
261         "GL_EXT_index_array_formats",\r
262         "GL_EXT_index_func",\r
263         "GL_EXT_index_material",\r
264         "GL_EXT_index_texture",\r
265         "GL_EXT_light_texture",\r
266         "GL_EXT_misc_attribute",\r
267         "GL_EXT_multi_draw_arrays",\r
268         "GL_EXT_multisample",\r
269         "GL_EXT_packed_depth_stencil",\r
270         "GL_EXT_packed_float",\r
271         "GL_EXT_packed_pixels",\r
272         "GL_EXT_paletted_texture",\r
273         "GL_EXT_pixel_buffer_object",\r
274         "GL_EXT_pixel_transform",\r
275         "GL_EXT_pixel_transform_color_table",\r
276         "GL_EXT_point_parameters",\r
277         "GL_EXT_polygon_offset",\r
278         "GL_EXT_provoking_vertex",\r
279         "GL_EXT_rescale_normal",\r
280         "GL_EXT_secondary_color",\r
281         "GL_EXT_separate_shader_objects",\r
282         "GL_EXT_separate_specular_color",\r
283         "GL_EXT_shader_image_load_store",\r
284         "GL_EXT_shader_integer_mix",\r
285         "GL_EXT_shadow_funcs",\r
286         "GL_EXT_shared_texture_palette",\r
287         "GL_EXT_stencil_clear_tag",\r
288         "GL_EXT_stencil_two_side",\r
289         "GL_EXT_stencil_wrap",\r
290         "GL_EXT_subtexture",\r
291         "GL_EXT_texture",\r
292         "GL_EXT_texture3D",\r
293         "GL_EXT_texture_array",\r
294         "GL_EXT_texture_buffer_object",\r
295         "GL_EXT_texture_compression_latc",\r
296         "GL_EXT_texture_compression_rgtc",\r
297         "GL_EXT_texture_compression_s3tc",\r
298         "GL_EXT_texture_cube_map",\r
299         "GL_EXT_texture_env_add",\r
300         "GL_EXT_texture_env_combine",\r
301         "GL_EXT_texture_env_dot3",\r
302         "GL_EXT_texture_filter_anisotropic",\r
303         "GL_EXT_texture_integer",\r
304         "GL_EXT_texture_lod_bias",\r
305         "GL_EXT_texture_mirror_clamp",\r
306         "GL_EXT_texture_object",\r
307         "GL_EXT_texture_perturb_normal",\r
308         "GL_EXT_texture_shared_exponent",\r
309         "GL_EXT_texture_snorm",\r
310         "GL_EXT_texture_sRGB",\r
311         "GL_EXT_texture_sRGB_decode",\r
312         "GL_EXT_texture_swizzle",\r
313         "GL_EXT_timer_query",\r
314         "GL_EXT_transform_feedback",\r
315         "GL_EXT_vertex_array",\r
316         "GL_EXT_vertex_array_bgra",\r
317         "GL_EXT_vertex_attrib_64bit",\r
318         "GL_EXT_vertex_shader",\r
319         "GL_EXT_vertex_weighting",\r
320         "GL_EXT_x11_sync_object",\r
321         "GL_GREMEDY_frame_terminator",\r
322         "GL_GREMEDY_string_marker",\r
323         "GL_HP_convolution_border_modes",\r
324         "GL_HP_image_transform",\r
325         "GL_HP_occlusion_test",\r
326         "GL_HP_texture_lighting",\r
327         "GL_IBM_cull_vertex",\r
328         "GL_IBM_multimode_draw_arrays",\r
329         "GL_IBM_rasterpos_clip",\r
330         "GL_IBM_static_data",\r
331         "GL_IBM_texture_mirrored_repeat",\r
332         "GL_IBM_vertex_array_lists",\r
333         "GL_INGR_blend_func_separate",\r
334         "GL_INGR_color_clamp",\r
335         "GL_INGR_interlace_read",\r
336         "GL_INGR_palette_buffer",\r
337         "GL_INTEL_map_texture",\r
338         "GL_INTEL_parallel_arrays",\r
339         "GL_INTEL_texture_scissor",\r
340         "GL_KHR_debug",\r
341         "GL_KHR_texture_compression_astc_hdr",\r
342         "GL_KHR_texture_compression_astc_ldr",\r
343         "GL_MESA_pack_invert",\r
344         "GL_MESA_resize_buffers",\r
345         "GL_MESA_window_pos",\r
346         "GL_MESAX_texture_stack",\r
347         "GL_MESA_ycbcr_texture",\r
348         "GL_NVX_conditional_render",\r
349         "GL_NV_bindless_multi_draw_indirect",\r
350         "GL_NV_bindless_texture",\r
351         "GL_NV_blend_equation_advanced",\r
352         "GL_NV_blend_equation_advanced_coherent",\r
353         "GL_NV_blend_square",\r
354         "GL_NV_compute_program5",\r
355         "GL_NV_conditional_render",\r
356         "GL_NV_copy_depth_to_color",\r
357         "GL_NV_copy_image",\r
358         "GL_NV_deep_texture3D",\r
359         "GL_NV_depth_buffer_float",\r
360         "GL_NV_depth_clamp",\r
361         "GL_NV_draw_texture",\r
362         "GL_NV_evaluators",\r
363         "GL_NV_explicit_multisample",\r
364         "GL_NV_fence",\r
365         "GL_NV_float_buffer",\r
366         "GL_NV_fog_distance",\r
367         "GL_NV_fragment_program",\r
368         "GL_NV_fragment_program2",\r
369         "GL_NV_fragment_program4",\r
370         "GL_NV_fragment_program_option",\r
371         "GL_NV_framebuffer_multisample_coverage",\r
372         "GL_NV_geometry_program4",\r
373         "GL_NV_geometry_shader4",\r
374         "GL_NV_gpu_program4",\r
375         "GL_NV_gpu_program5",\r
376         "GL_NV_gpu_program5_mem_extended",\r
377         "GL_NV_gpu_shader5",\r
378         "GL_NV_half_float",\r
379         "GL_NV_light_max_exponent",\r
380         "GL_NV_multisample_coverage",\r
381         "GL_NV_multisample_filter_hint",\r
382         "GL_NV_occlusion_query",\r
383         "GL_NV_packed_depth_stencil",\r
384         "GL_NV_parameter_buffer_object",\r
385         "GL_NV_parameter_buffer_object2",\r
386         "GL_NV_path_rendering",\r
387         "GL_NV_pixel_data_range",\r
388         "GL_NV_point_sprite",\r
389         "GL_NV_present_video",\r
390         "GL_NV_primitive_restart",\r
391         "GL_NV_register_combiners",\r
392         "GL_NV_register_combiners2",\r
393         "GL_NV_shader_atomic_counters",\r
394         "GL_NV_shader_atomic_float",\r
395         "GL_NV_shader_buffer_load",\r
396         "GL_NV_shader_buffer_store",\r
397         "GL_NV_shader_storage_buffer_object",\r
398         "GL_NV_tessellation_program5",\r
399         "GL_NV_texgen_emboss",\r
400         "GL_NV_texgen_reflection",\r
401         "GL_NV_texture_barrier",\r
402         "GL_NV_texture_compression_vtc",\r
403         "GL_NV_texture_env_combine4",\r
404         "GL_NV_texture_expand_normal",\r
405         "GL_NV_texture_multisample",\r
406         "GL_NV_texture_rectangle",\r
407         "GL_NV_texture_shader",\r
408         "GL_NV_texture_shader2",\r
409         "GL_NV_texture_shader3",\r
410         "GL_NV_transform_feedback",\r
411         "GL_NV_transform_feedback2",\r
412         "GL_NV_vdpau_interop",\r
413         "GL_NV_vertex_array_range",\r
414         "GL_NV_vertex_array_range2",\r
415         "GL_NV_vertex_attrib_integer_64bit",\r
416         "GL_NV_vertex_buffer_unified_memory",\r
417         "GL_NV_vertex_program",\r
418         "GL_NV_vertex_program1_1",\r
419         "GL_NV_vertex_program2",\r
420         "GL_NV_vertex_program2_option",\r
421         "GL_NV_vertex_program3",\r
422         "GL_NV_vertex_program4",\r
423         "GL_NV_video_capture",\r
424         "GL_OES_byte_coordinates",\r
425         "GL_OES_compressed_paletted_texture",\r
426         "GL_OES_fixed_point",\r
427         "GL_OES_query_matrix",\r
428         "GL_OES_read_format",\r
429         "GL_OES_single_precision",\r
430         "GL_OML_interlace",\r
431         "GL_OML_resample",\r
432         "GL_OML_subsample",\r
433         "GL_PGI_misc_hints",\r
434         "GL_PGI_vertex_hints",\r
435         "GL_REND_screen_coordinates",\r
436         "GL_S3_s3tc",\r
437         "GL_SGI_color_matrix",\r
438         "GL_SGI_color_table",\r
439         "GL_SGI_texture_color_table",\r
440         "GL_SGIS_detail_texture",\r
441         "GL_SGIS_fog_function",\r
442         "GL_SGIS_generate_mipmap",\r
443         "GL_SGIS_multisample",\r
444         "GL_SGIS_pixel_texture",\r
445         "GL_SGIS_point_line_texgen",\r
446         "GL_SGIS_point_parameters",\r
447         "GL_SGIS_sharpen_texture",\r
448         "GL_SGIS_texture4D",\r
449         "GL_SGIS_texture_border_clamp",\r
450         "GL_SGIS_texture_color_mask",\r
451         "GL_SGIS_texture_edge_clamp",\r
452         "GL_SGIS_texture_filter4",\r
453         "GL_SGIS_texture_lod",\r
454         "GL_SGIS_texture_select",\r
455         "GL_SGIX_async",\r
456         "GL_SGIX_async_histogram",\r
457         "GL_SGIX_async_pixel",\r
458         "GL_SGIX_blend_alpha_minmax",\r
459         "GL_SGIX_calligraphic_fragment",\r
460         "GL_SGIX_clipmap",\r
461         "GL_SGIX_convolution_accuracy",\r
462         "GL_SGIX_depth_pass_instrument",\r
463         "GL_SGIX_depth_texture",\r
464         "GL_SGIX_flush_raster",\r
465         "GL_SGIX_fog_offset",\r
466         "GL_SGIX_fog_scale",\r
467         "GL_SGIX_fragment_lighting",\r
468         "GL_SGIX_framezoom",\r
469         "GL_SGIX_igloo_interface",\r
470         "GL_SGIX_instruments",\r
471         "GL_SGIX_interlace",\r
472         "GL_SGIX_ir_instrument1",\r
473         "GL_SGIX_list_priority",\r
474         "GL_SGIX_pixel_texture",\r
475         "GL_SGIX_pixel_tiles",\r
476         "GL_SGIX_polynomial_ffd",\r
477         "GL_SGIX_reference_plane",\r
478         "GL_SGIX_resample",\r
479         "GL_SGIX_scalebias_hint",\r
480         "GL_SGIX_shadow",\r
481         "GL_SGIX_shadow_ambient",\r
482         "GL_SGIX_sprite",\r
483         "GL_SGIX_subsample",\r
484         "GL_SGIX_tag_sample_buffer",\r
485         "GL_SGIX_texture_add_env",\r
486         "GL_SGIX_texture_coordinate_clamp",\r
487         "GL_SGIX_texture_lod_bias",\r
488         "GL_SGIX_texture_multi_buffer",\r
489         "GL_SGIX_texture_scale_bias",\r
490         "GL_SGIX_vertex_preclip",\r
491         "GL_SGIX_ycrcb",\r
492         "GL_SGIX_ycrcba",\r
493         "GL_SGIX_ycrcb_subsample",\r
494         "GL_SUN_convolution_border_modes",\r
495         "GL_SUN_global_alpha",\r
496         "GL_SUN_mesh_array",\r
497         "GL_SUN_slice_accum",\r
498         "GL_SUN_triangle_list",\r
499         "GL_SUN_vertex",\r
500         "GL_SUNX_constant_data",\r
501         "GL_WIN_phong_shading",\r
502         "GL_WIN_specular_fog",\r
503         // unofficial stuff\r
504         "GL_NVX_gpu_memory_info"\r
505 };\r
506 \r
507 \r
508 class COpenGLExtensionHandler\r
509 {\r
510         public:\r
511         enum EOpenGLFeatures {\r
512                 IRR_3DFX_multisample = 0,\r
513                 IRR_3DFX_tbuffer,\r
514                 IRR_3DFX_texture_compression_FXT1,\r
515                 IRR_AMD_blend_minmax_factor,\r
516                 IRR_AMD_conservative_depth,\r
517                 IRR_AMD_debug_output,\r
518                 IRR_AMD_depth_clamp_separate,\r
519                 IRR_AMD_draw_buffers_blend,\r
520                 IRR_AMD_interleaved_elements,\r
521                 IRR_AMD_multi_draw_indirect,\r
522                 IRR_AMD_name_gen_delete,\r
523                 IRR_AMD_performance_monitor,\r
524                 IRR_AMD_pinned_memory,\r
525                 IRR_AMD_query_buffer_object,\r
526                 IRR_AMD_sample_positions,\r
527                 IRR_AMD_seamless_cubemap_per_texture,\r
528                 IRR_AMD_shader_atomic_counter_ops,\r
529                 IRR_AMD_shader_stencil_export,\r
530                 IRR_AMD_shader_trinary_minmax,\r
531                 IRR_AMD_sparse_texture,\r
532                 IRR_AMD_stencil_operation_extended,\r
533                 IRR_AMD_texture_texture4,\r
534                 IRR_AMD_transform_feedback3_lines_triangles,\r
535                 IRR_AMD_vertex_shader_layer,\r
536                 IRR_AMD_vertex_shader_tessellator,\r
537                 IRR_AMD_vertex_shader_viewport_index,\r
538                 IRR_APPLE_aux_depth_stencil,\r
539                 IRR_APPLE_client_storage,\r
540                 IRR_APPLE_element_array,\r
541                 IRR_APPLE_fence,\r
542                 IRR_APPLE_float_pixels,\r
543                 IRR_APPLE_flush_buffer_range,\r
544                 IRR_APPLE_object_purgeable,\r
545                 IRR_APPLE_rgb_422,\r
546                 IRR_APPLE_row_bytes,\r
547                 IRR_APPLE_specular_vector,\r
548                 IRR_APPLE_texture_range,\r
549                 IRR_APPLE_transform_hint,\r
550                 IRR_APPLE_vertex_array_object,\r
551                 IRR_APPLE_vertex_array_range,\r
552                 IRR_APPLE_vertex_program_evaluators,\r
553                 IRR_APPLE_ycbcr_422,\r
554                 IRR_ARB_arrays_of_arrays,\r
555                 IRR_ARB_base_instance,\r
556                 IRR_ARB_bindless_texture,\r
557                 IRR_ARB_blend_func_extended,\r
558                 IRR_ARB_buffer_storage,\r
559                 IRR_ARB_cl_event,\r
560                 IRR_ARB_clear_buffer_object,\r
561                 IRR_ARB_clear_texture,\r
562                 IRR_ARB_color_buffer_float,\r
563                 IRR_ARB_compatibility,\r
564                 IRR_ARB_compressed_texture_pixel_storage,\r
565                 IRR_ARB_compute_shader,\r
566                 IRR_ARB_compute_variable_group_size,\r
567                 IRR_ARB_conservative_depth,\r
568                 IRR_ARB_copy_buffer,\r
569                 IRR_ARB_copy_image,\r
570                 IRR_ARB_debug_output,\r
571                 IRR_ARB_depth_buffer_float,\r
572                 IRR_ARB_depth_clamp,\r
573                 IRR_ARB_depth_texture,\r
574                 IRR_ARB_direct_state_access,\r
575                 IRR_ARB_draw_buffers,\r
576                 IRR_ARB_draw_buffers_blend,\r
577                 IRR_ARB_draw_elements_base_vertex,\r
578                 IRR_ARB_draw_indirect,\r
579                 IRR_ARB_draw_instanced,\r
580                 IRR_ARB_ES2_compatibility,\r
581                 IRR_ARB_ES3_compatibility,\r
582                 IRR_ARB_enhanced_layouts,\r
583                 IRR_ARB_explicit_attrib_location,\r
584                 IRR_ARB_explicit_uniform_location,\r
585                 IRR_ARB_fragment_coord_conventions,\r
586                 IRR_ARB_fragment_layer_viewport,\r
587                 IRR_ARB_fragment_program,\r
588                 IRR_ARB_fragment_program_shadow,\r
589                 IRR_ARB_fragment_shader,\r
590                 IRR_ARB_framebuffer_no_attachments,\r
591                 IRR_ARB_framebuffer_object,\r
592                 IRR_ARB_framebuffer_sRGB,\r
593                 IRR_ARB_geometry_shader4,\r
594                 IRR_ARB_get_program_binary,\r
595                 IRR_ARB_gpu_shader5,\r
596                 IRR_ARB_gpu_shader_fp64,\r
597                 IRR_ARB_half_float_pixel,\r
598                 IRR_ARB_half_float_vertex,\r
599                 IRR_ARB_imaging,\r
600                 IRR_ARB_indirect_parameters,\r
601                 IRR_ARB_instanced_arrays,\r
602                 IRR_ARB_internalformat_query,\r
603                 IRR_ARB_internalformat_query2,\r
604                 IRR_ARB_invalidate_subdata,\r
605                 IRR_ARB_map_buffer_alignment,\r
606                 IRR_ARB_map_buffer_range,\r
607                 IRR_ARB_matrix_palette,\r
608                 IRR_ARB_multi_bind,\r
609                 IRR_ARB_multi_draw_indirect,\r
610                 IRR_ARB_multisample,\r
611                 IRR_ARB_multitexture,\r
612                 IRR_ARB_occlusion_query,\r
613                 IRR_ARB_occlusion_query2,\r
614                 IRR_ARB_pixel_buffer_object,\r
615                 IRR_ARB_point_parameters,\r
616                 IRR_ARB_point_sprite,\r
617                 IRR_ARB_program_interface_query,\r
618                 IRR_ARB_provoking_vertex,\r
619                 IRR_ARB_query_buffer_object,\r
620                 IRR_ARB_robust_buffer_access_behavior,\r
621                 IRR_ARB_robustness,\r
622                 IRR_ARB_robustness_isolation,\r
623                 IRR_ARB_sample_shading,\r
624                 IRR_ARB_sampler_objects,\r
625                 IRR_ARB_seamless_cube_map,\r
626                 IRR_ARB_seamless_cubemap_per_texture,\r
627                 IRR_ARB_separate_shader_objects,\r
628                 IRR_ARB_shader_atomic_counters,\r
629                 IRR_ARB_shader_bit_encoding,\r
630                 IRR_ARB_shader_draw_parameters,\r
631                 IRR_ARB_shader_group_vote,\r
632                 IRR_ARB_shader_image_load_store,\r
633                 IRR_ARB_shader_image_size,\r
634                 IRR_ARB_shader_objects,\r
635                 IRR_ARB_shader_precision,\r
636                 IRR_ARB_shader_stencil_export,\r
637                 IRR_ARB_shader_storage_buffer_object,\r
638                 IRR_ARB_shader_subroutine,\r
639                 IRR_ARB_shader_texture_lod,\r
640                 IRR_ARB_shading_language_100,\r
641                 IRR_ARB_shading_language_420pack,\r
642                 IRR_ARB_shading_language_include,\r
643                 IRR_ARB_shading_language_packing,\r
644                 IRR_ARB_shadow,\r
645                 IRR_ARB_shadow_ambient,\r
646                 IRR_ARB_sparse_texture,\r
647                 IRR_ARB_stencil_texturing,\r
648                 IRR_ARB_sync,\r
649                 IRR_ARB_tessellation_shader,\r
650                 IRR_ARB_texture_border_clamp,\r
651                 IRR_ARB_texture_buffer_object,\r
652                 IRR_ARB_texture_buffer_object_rgb32,\r
653                 IRR_ARB_texture_buffer_range,\r
654                 IRR_ARB_texture_compression,\r
655                 IRR_ARB_texture_compression_bptc,\r
656                 IRR_ARB_texture_compression_rgtc,\r
657                 IRR_ARB_texture_cube_map,\r
658                 IRR_ARB_texture_cube_map_array,\r
659                 IRR_ARB_texture_env_add,\r
660                 IRR_ARB_texture_env_combine,\r
661                 IRR_ARB_texture_env_crossbar,\r
662                 IRR_ARB_texture_env_dot3,\r
663                 IRR_ARB_texture_float,\r
664                 IRR_ARB_texture_gather,\r
665                 IRR_ARB_texture_mirror_clamp_to_edge,\r
666                 IRR_ARB_texture_mirrored_repeat,\r
667                 IRR_ARB_texture_multisample,\r
668                 IRR_ARB_texture_non_power_of_two,\r
669                 IRR_ARB_texture_query_levels,\r
670                 IRR_ARB_texture_query_lod,\r
671                 IRR_ARB_texture_rectangle,\r
672                 IRR_ARB_texture_rg,\r
673                 IRR_ARB_texture_rgb10_a2ui,\r
674                 IRR_ARB_texture_stencil8,\r
675                 IRR_ARB_texture_storage,\r
676                 IRR_ARB_texture_storage_multisample,\r
677                 IRR_ARB_texture_swizzle,\r
678                 IRR_ARB_texture_view,\r
679                 IRR_ARB_timer_query,\r
680                 IRR_ARB_transform_feedback2,\r
681                 IRR_ARB_transform_feedback3,\r
682                 IRR_ARB_transform_feedback_instanced,\r
683                 IRR_ARB_transpose_matrix,\r
684                 IRR_ARB_uniform_buffer_object,\r
685                 IRR_ARB_vertex_array_bgra,\r
686                 IRR_ARB_vertex_array_object,\r
687                 IRR_ARB_vertex_attrib_64bit,\r
688                 IRR_ARB_vertex_attrib_binding,\r
689                 IRR_ARB_vertex_blend,\r
690                 IRR_ARB_vertex_buffer_object,\r
691                 IRR_ARB_vertex_program,\r
692                 IRR_ARB_vertex_shader,\r
693                 IRR_ARB_vertex_type_10f_11f_11f_rev,\r
694                 IRR_ARB_vertex_type_2_10_10_10_rev,\r
695                 IRR_ARB_viewport_array,\r
696                 IRR_ARB_window_pos,\r
697                 IRR_ATI_draw_buffers,\r
698                 IRR_ATI_element_array,\r
699                 IRR_ATI_envmap_bumpmap,\r
700                 IRR_ATI_fragment_shader,\r
701                 IRR_ATI_map_object_buffer,\r
702                 IRR_ATI_meminfo,\r
703                 IRR_ATI_pixel_format_float,\r
704                 IRR_ATI_pn_triangles,\r
705                 IRR_ATI_separate_stencil,\r
706                 IRR_ATI_text_fragment_shader,\r
707                 IRR_ATI_texture_env_combine3,\r
708                 IRR_ATI_texture_float,\r
709                 IRR_ATI_texture_mirror_once,\r
710                 IRR_ATI_vertex_array_object,\r
711                 IRR_ATI_vertex_attrib_array_object,\r
712                 IRR_ATI_vertex_streams,\r
713                 IRR_EXT_422_pixels,\r
714                 IRR_EXT_abgr,\r
715                 IRR_EXT_bgra,\r
716                 IRR_EXT_bindable_uniform,\r
717                 IRR_EXT_blend_color,\r
718                 IRR_EXT_blend_equation_separate,\r
719                 IRR_EXT_blend_func_separate,\r
720                 IRR_EXT_blend_logic_op,\r
721                 IRR_EXT_blend_minmax,\r
722                 IRR_EXT_blend_subtract,\r
723                 IRR_EXT_clip_volume_hint,\r
724                 IRR_EXT_cmyka,\r
725                 IRR_EXT_color_subtable,\r
726                 IRR_EXT_compiled_vertex_array,\r
727                 IRR_EXT_convolution,\r
728                 IRR_EXT_coordinate_frame,\r
729                 IRR_EXT_copy_texture,\r
730                 IRR_EXT_cull_vertex,\r
731                 IRR_EXT_debug_label,\r
732                 IRR_EXT_debug_marker,\r
733                 IRR_EXT_depth_bounds_test,\r
734                 IRR_EXT_direct_state_access,\r
735                 IRR_EXT_draw_buffers2,\r
736                 IRR_EXT_draw_instanced,\r
737                 IRR_EXT_draw_range_elements,\r
738                 IRR_EXT_fog_coord,\r
739                 IRR_EXT_framebuffer_blit,\r
740                 IRR_EXT_framebuffer_multisample,\r
741                 IRR_EXT_framebuffer_multisample_blit_scaled,\r
742                 IRR_EXT_framebuffer_object,\r
743                 IRR_EXT_framebuffer_sRGB,\r
744                 IRR_EXT_geometry_shader4,\r
745                 IRR_EXT_gpu_program_parameters,\r
746                 IRR_EXT_gpu_shader4,\r
747                 IRR_EXT_histogram,\r
748                 IRR_EXT_index_array_formats,\r
749                 IRR_EXT_index_func,\r
750                 IRR_EXT_index_material,\r
751                 IRR_EXT_index_texture,\r
752                 IRR_EXT_light_texture,\r
753                 IRR_EXT_misc_attribute,\r
754                 IRR_EXT_multi_draw_arrays,\r
755                 IRR_EXT_multisample,\r
756                 IRR_EXT_packed_depth_stencil,\r
757                 IRR_EXT_packed_float,\r
758                 IRR_EXT_packed_pixels,\r
759                 IRR_EXT_paletted_texture,\r
760                 IRR_EXT_pixel_buffer_object,\r
761                 IRR_EXT_pixel_transform,\r
762                 IRR_EXT_pixel_transform_color_table,\r
763                 IRR_EXT_point_parameters,\r
764                 IRR_EXT_polygon_offset,\r
765                 IRR_EXT_provoking_vertex,\r
766                 IRR_EXT_rescale_normal,\r
767                 IRR_EXT_secondary_color,\r
768                 IRR_EXT_separate_shader_objects,\r
769                 IRR_EXT_separate_specular_color,\r
770                 IRR_EXT_shader_image_load_store,\r
771                 IRR_EXT_shader_integer_mix,\r
772                 IRR_EXT_shadow_funcs,\r
773                 IRR_EXT_shared_texture_palette,\r
774                 IRR_EXT_stencil_clear_tag,\r
775                 IRR_EXT_stencil_two_side,\r
776                 IRR_EXT_stencil_wrap,\r
777                 IRR_EXT_subtexture,\r
778                 IRR_EXT_texture,\r
779                 IRR_EXT_texture3D,\r
780                 IRR_EXT_texture_array,\r
781                 IRR_EXT_texture_buffer_object,\r
782                 IRR_EXT_texture_compression_latc,\r
783                 IRR_EXT_texture_compression_rgtc,\r
784                 IRR_EXT_texture_compression_s3tc,\r
785                 IRR_EXT_texture_cube_map,\r
786                 IRR_EXT_texture_env_add,\r
787                 IRR_EXT_texture_env_combine,\r
788                 IRR_EXT_texture_env_dot3,\r
789                 IRR_EXT_texture_filter_anisotropic,\r
790                 IRR_EXT_texture_integer,\r
791                 IRR_EXT_texture_lod_bias,\r
792                 IRR_EXT_texture_mirror_clamp,\r
793                 IRR_EXT_texture_object,\r
794                 IRR_EXT_texture_perturb_normal,\r
795                 IRR_EXT_texture_shared_exponent,\r
796                 IRR_EXT_texture_snorm,\r
797                 IRR_EXT_texture_sRGB,\r
798                 IRR_EXT_texture_sRGB_decode,\r
799                 IRR_EXT_texture_swizzle,\r
800                 IRR_EXT_timer_query,\r
801                 IRR_EXT_transform_feedback,\r
802                 IRR_EXT_vertex_array,\r
803                 IRR_EXT_vertex_array_bgra,\r
804                 IRR_EXT_vertex_attrib_64bit,\r
805                 IRR_EXT_vertex_shader,\r
806                 IRR_EXT_vertex_weighting,\r
807                 IRR_EXT_x11_sync_object,\r
808                 IRR_GREMEDY_frame_terminator,\r
809                 IRR_GREMEDY_string_marker,\r
810                 IRR_HP_convolution_border_modes,\r
811                 IRR_HP_image_transform,\r
812                 IRR_HP_occlusion_test,\r
813                 IRR_HP_texture_lighting,\r
814                 IRR_IBM_cull_vertex,\r
815                 IRR_IBM_multimode_draw_arrays,\r
816                 IRR_IBM_rasterpos_clip,\r
817                 IRR_IBM_static_data,\r
818                 IRR_IBM_texture_mirrored_repeat,\r
819                 IRR_IBM_vertex_array_lists,\r
820                 IRR_INGR_blend_func_separate,\r
821                 IRR_INGR_color_clamp,\r
822                 IRR_INGR_interlace_read,\r
823                 IRR_INGR_palette_buffer,\r
824                 IRR_INTEL_map_texture,\r
825                 IRR_INTEL_parallel_arrays,\r
826                 IRR_INTEL_texture_scissor,\r
827                 IRR_KHR_debug,\r
828                 IRR_KHR_texture_compression_astc_hdr,\r
829                 IRR_KHR_texture_compression_astc_ldr,\r
830                 IRR_MESA_pack_invert,\r
831                 IRR_MESA_resize_buffers,\r
832                 IRR_MESA_window_pos,\r
833                 IRR_MESAX_texture_stack,\r
834                 IRR_MESA_ycbcr_texture,\r
835                 IRR_NVX_conditional_render,\r
836                 IRR_NV_bindless_multi_draw_indirect,\r
837                 IRR_NV_bindless_texture,\r
838                 IRR_NV_blend_equation_advanced,\r
839                 IRR_NV_blend_equation_advanced_coherent,\r
840                 IRR_NV_blend_square,\r
841                 IRR_NV_compute_program5,\r
842                 IRR_NV_conditional_render,\r
843                 IRR_NV_copy_depth_to_color,\r
844                 IRR_NV_copy_image,\r
845                 IRR_NV_deep_texture3D,\r
846                 IRR_NV_depth_buffer_float,\r
847                 IRR_NV_depth_clamp,\r
848                 IRR_NV_draw_texture,\r
849                 IRR_NV_evaluators,\r
850                 IRR_NV_explicit_multisample,\r
851                 IRR_NV_fence,\r
852                 IRR_NV_float_buffer,\r
853                 IRR_NV_fog_distance,\r
854                 IRR_NV_fragment_program,\r
855                 IRR_NV_fragment_program2,\r
856                 IRR_NV_fragment_program4,\r
857                 IRR_NV_fragment_program_option,\r
858                 IRR_NV_framebuffer_multisample_coverage,\r
859                 IRR_NV_geometry_program4,\r
860                 IRR_NV_geometry_shader4,\r
861                 IRR_NV_gpu_program4,\r
862                 IRR_NV_gpu_program5,\r
863                 IRR_NV_gpu_program5_mem_extended,\r
864                 IRR_NV_gpu_shader5,\r
865                 IRR_NV_half_float,\r
866                 IRR_NV_light_max_exponent,\r
867                 IRR_NV_multisample_coverage,\r
868                 IRR_NV_multisample_filter_hint,\r
869                 IRR_NV_occlusion_query,\r
870                 IRR_NV_packed_depth_stencil,\r
871                 IRR_NV_parameter_buffer_object,\r
872                 IRR_NV_parameter_buffer_object2,\r
873                 IRR_NV_path_rendering,\r
874                 IRR_NV_pixel_data_range,\r
875                 IRR_NV_point_sprite,\r
876                 IRR_NV_present_video,\r
877                 IRR_NV_primitive_restart,\r
878                 IRR_NV_register_combiners,\r
879                 IRR_NV_register_combiners2,\r
880                 IRR_NV_shader_atomic_counters,\r
881                 IRR_NV_shader_atomic_float,\r
882                 IRR_NV_shader_buffer_load,\r
883                 IRR_NV_shader_buffer_store,\r
884                 IRR_NV_shader_storage_buffer_object,\r
885                 IRR_NV_tessellation_program5,\r
886                 IRR_NV_texgen_emboss,\r
887                 IRR_NV_texgen_reflection,\r
888                 IRR_NV_texture_barrier,\r
889                 IRR_NV_texture_compression_vtc,\r
890                 IRR_NV_texture_env_combine4,\r
891                 IRR_NV_texture_expand_normal,\r
892                 IRR_NV_texture_multisample,\r
893                 IRR_NV_texture_rectangle,\r
894                 IRR_NV_texture_shader,\r
895                 IRR_NV_texture_shader2,\r
896                 IRR_NV_texture_shader3,\r
897                 IRR_NV_transform_feedback,\r
898                 IRR_NV_transform_feedback2,\r
899                 IRR_NV_vdpau_interop,\r
900                 IRR_NV_vertex_array_range,\r
901                 IRR_NV_vertex_array_range2,\r
902                 IRR_NV_vertex_attrib_integer_64bit,\r
903                 IRR_NV_vertex_buffer_unified_memory,\r
904                 IRR_NV_vertex_program,\r
905                 IRR_NV_vertex_program1_1,\r
906                 IRR_NV_vertex_program2,\r
907                 IRR_NV_vertex_program2_option,\r
908                 IRR_NV_vertex_program3,\r
909                 IRR_NV_vertex_program4,\r
910                 IRR_NV_video_capture,\r
911                 IRR_OES_byte_coordinates,\r
912                 IRR_OES_compressed_paletted_texture,\r
913                 IRR_OES_fixed_point,\r
914                 IRR_OES_query_matrix,\r
915                 IRR_OES_read_format,\r
916                 IRR_OES_single_precision,\r
917                 IRR_OML_interlace,\r
918                 IRR_OML_resample,\r
919                 IRR_OML_subsample,\r
920                 IRR_PGI_misc_hints,\r
921                 IRR_PGI_vertex_hints,\r
922                 IRR_REND_screen_coordinates,\r
923                 IRR_S3_s3tc,\r
924                 IRR_SGI_color_matrix,\r
925                 IRR_SGI_color_table,\r
926                 IRR_SGI_texture_color_table,\r
927                 IRR_SGIS_detail_texture,\r
928                 IRR_SGIS_fog_function,\r
929                 IRR_SGIS_generate_mipmap,\r
930                 IRR_SGIS_multisample,\r
931                 IRR_SGIS_pixel_texture,\r
932                 IRR_SGIS_point_line_texgen,\r
933                 IRR_SGIS_point_parameters,\r
934                 IRR_SGIS_sharpen_texture,\r
935                 IRR_SGIS_texture4D,\r
936                 IRR_SGIS_texture_border_clamp,\r
937                 IRR_SGIS_texture_color_mask,\r
938                 IRR_SGIS_texture_edge_clamp,\r
939                 IRR_SGIS_texture_filter4,\r
940                 IRR_SGIS_texture_lod,\r
941                 IRR_SGIS_texture_select,\r
942                 IRR_SGIX_async,\r
943                 IRR_SGIX_async_histogram,\r
944                 IRR_SGIX_async_pixel,\r
945                 IRR_SGIX_blend_alpha_minmax,\r
946                 IRR_SGIX_calligraphic_fragment,\r
947                 IRR_SGIX_clipmap,\r
948                 IRR_SGIX_convolution_accuracy,\r
949                 IRR_SGIX_depth_pass_instrument,\r
950                 IRR_SGIX_depth_texture,\r
951                 IRR_SGIX_flush_raster,\r
952                 IRR_SGIX_fog_offset,\r
953                 IRR_SGIX_fog_scale,\r
954                 IRR_SGIX_fragment_lighting,\r
955                 IRR_SGIX_framezoom,\r
956                 IRR_SGIX_igloo_interface,\r
957                 IRR_SGIX_instruments,\r
958                 IRR_SGIX_interlace,\r
959                 IRR_SGIX_ir_instrument1,\r
960                 IRR_SGIX_list_priority,\r
961                 IRR_SGIX_pixel_texture,\r
962                 IRR_SGIX_pixel_tiles,\r
963                 IRR_SGIX_polynomial_ffd,\r
964                 IRR_SGIX_reference_plane,\r
965                 IRR_SGIX_resample,\r
966                 IRR_SGIX_scalebias_hint,\r
967                 IRR_SGIX_shadow,\r
968                 IRR_SGIX_shadow_ambient,\r
969                 IRR_SGIX_sprite,\r
970                 IRR_SGIX_subsample,\r
971                 IRR_SGIX_tag_sample_buffer,\r
972                 IRR_SGIX_texture_add_env,\r
973                 IRR_SGIX_texture_coordinate_clamp,\r
974                 IRR_SGIX_texture_lod_bias,\r
975                 IRR_SGIX_texture_multi_buffer,\r
976                 IRR_SGIX_texture_scale_bias,\r
977                 IRR_SGIX_vertex_preclip,\r
978                 IRR_SGIX_ycrcb,\r
979                 IRR_SGIX_ycrcba,\r
980                 IRR_SGIX_ycrcb_subsample,\r
981                 IRR_SUN_convolution_border_modes,\r
982                 IRR_SUN_global_alpha,\r
983                 IRR_SUN_mesh_array,\r
984                 IRR_SUN_slice_accum,\r
985                 IRR_SUN_triangle_list,\r
986                 IRR_SUN_vertex,\r
987                 IRR_SUNX_constant_data,\r
988                 IRR_WIN_phong_shading,\r
989                 IRR_WIN_specular_fog,\r
990                 IRR_NVX_gpu_memory_info,\r
991                 IRR_OpenGL_Feature_Count\r
992         };\r
993 \r
994 \r
995         // constructor\r
996         COpenGLExtensionHandler();\r
997 \r
998         // deferred initialization\r
999         void initExtensions(bool stencilBuffer);\r
1000 \r
1001         const COpenGLCoreFeature& getFeature() const;\r
1002 \r
1003         //! queries the features of the driver, returns true if feature is available\r
1004         bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const;\r
1005 \r
1006         //! queries the features of the driver, returns true if feature is available\r
1007         bool queryOpenGLFeature(EOpenGLFeatures feature) const\r
1008         {\r
1009                 return FeatureAvailable[feature];\r
1010         }\r
1011 \r
1012         //! show all features with availability\r
1013         void dump(ELOG_LEVEL logLevel) const;\r
1014 \r
1015         void dumpFramebufferFormats() const;\r
1016 \r
1017         // Some variables for properties\r
1018         bool StencilBuffer;\r
1019         bool TextureCompressionExtension;\r
1020 \r
1021         // Some non-boolean properties\r
1022         //! Maximum hardware lights supported\r
1023         u8 MaxLights;\r
1024         //! Maximal Anisotropy\r
1025         u8 MaxAnisotropy;\r
1026         //! Number of user clipplanes\r
1027         u8 MaxUserClipPlanes;\r
1028         //! Number of auxiliary buffers\r
1029         u8 MaxAuxBuffers;\r
1030         //! Optimal number of indices per meshbuffer\r
1031         u32 MaxIndices;\r
1032         //! Maximal texture dimension\r
1033         u32 MaxTextureSize;\r
1034         //! Maximal vertices handled by geometry shaders\r
1035         u32 MaxGeometryVerticesOut;\r
1036         //! Maximal LOD Bias\r
1037         f32 MaxTextureLODBias;\r
1038         //! Minimal and maximal supported thickness for lines without smoothing\r
1039         GLfloat DimAliasedLine[2];\r
1040         //! Minimal and maximal supported thickness for points without smoothing\r
1041         GLfloat DimAliasedPoint[2];\r
1042         //! Minimal and maximal supported thickness for lines with smoothing\r
1043         GLfloat DimSmoothedLine[2];\r
1044         //! Minimal and maximal supported thickness for points with smoothing\r
1045         GLfloat DimSmoothedPoint[2];\r
1046 \r
1047         //! OpenGL version as Integer: 100*Major+Minor, i.e. 2.1 becomes 201\r
1048         u16 Version;\r
1049         //! GLSL version as Integer: 100*Major+Minor\r
1050         u16 ShaderLanguageVersion;\r
1051 \r
1052         bool OcclusionQuerySupport;\r
1053 \r
1054         // Info needed for workarounds.\r
1055         bool IsAtiRadeonX;\r
1056 \r
1057         //! Workaround until direct state access with framebuffers is stable enough in drivers\r
1058         // https://devtalk.nvidia.com/default/topic/1030494/opengl/bug-amp-amp-spec-violation-checknamedframebufferstatus-returns-gl_framebuffer_incomplete_dimensions_ext-under-gl-4-5-core/\r
1059         // https://stackoverflow.com/questions/51304706/problems-with-attaching-textures-of-different-sizes-to-fbo\r
1060     static bool needsDSAFramebufferHack;\r
1061 \r
1062         // public access to the (loaded) extensions.\r
1063         // general functions\r
1064         void irrGlActiveTexture(GLenum texture);\r
1065         void irrGlClientActiveTexture(GLenum texture);\r
1066         void extGlPointParameterf(GLint loc, GLfloat f);\r
1067         void extGlPointParameterfv(GLint loc, const GLfloat *v);\r
1068         void extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\r
1069         void extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);\r
1070         void irrGlCompressedTexImage2D(GLenum target, GLint level,\r
1071                 GLenum internalformat, GLsizei width, GLsizei height,\r
1072                 GLint border, GLsizei imageSize, const void* data);\r
1073         void irrGlCompressedTexSubImage2D(GLenum target, GLint level,\r
1074                 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,\r
1075                 GLenum format, GLsizei imageSize, const void* data);\r
1076 \r
1077         // shader programming\r
1078         void extGlGenPrograms(GLsizei n, GLuint *programs);\r
1079         void extGlBindProgram(GLenum target, GLuint program);\r
1080         void extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string);\r
1081         void extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string);\r
1082         void extGlDeletePrograms(GLsizei n, const GLuint *programs);\r
1083         void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);\r
1084         GLhandleARB extGlCreateShaderObject(GLenum shaderType);\r
1085         GLuint extGlCreateShader(GLenum shaderType);\r
1086         // note: Due to the type confusion between shader_objects and OpenGL 2.0\r
1087         // we have to add the ARB extension for proper method definitions in case\r
1088         // that handleARB and uint are the same type\r
1089         void extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);\r
1090         void extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings);\r
1091         // note: Due to the type confusion between shader_objects and OpenGL 2.0\r
1092         // we have to add the ARB extension for proper method definitions in case\r
1093         // that handleARB and uint are the same type\r
1094         void extGlCompileShaderARB(GLhandleARB shader);\r
1095         void extGlCompileShader(GLuint shader);\r
1096         GLhandleARB extGlCreateProgramObject(void);\r
1097         GLuint extGlCreateProgram(void);\r
1098         void extGlAttachObject(GLhandleARB program, GLhandleARB shader);\r
1099         void extGlAttachShader(GLuint program, GLuint shader);\r
1100         void extGlLinkProgramARB(GLhandleARB program);\r
1101         // note: Due to the type confusion between shader_objects and OpenGL 2.0\r
1102         // we have to add the ARB extension for proper method definitions in case\r
1103         // that handleARB and uint are the same type\r
1104         void extGlLinkProgram(GLuint program);\r
1105         void extGlUseProgramObject(GLhandleARB prog);\r
1106         void irrGlUseProgram(GLuint prog);\r
1107         void extGlDeleteObject(GLhandleARB object);\r
1108         void extGlDeleteProgram(GLuint object);\r
1109         void extGlDeleteShader(GLuint shader);\r
1110         void extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);\r
1111         void extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders);\r
1112         void extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);\r
1113         void extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);\r
1114         void extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog);\r
1115         void extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param);\r
1116         void extGlGetShaderiv(GLuint shader, GLenum type, GLint *param);\r
1117         void extGlGetProgramiv(GLuint program, GLenum type, GLint *param);\r
1118         GLint extGlGetUniformLocationARB(GLhandleARB program, const char *name);\r
1119         GLint extGlGetUniformLocation(GLuint program, const char *name);\r
1120         void extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v);\r
1121         void extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v);\r
1122         void extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v);\r
1123         void extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v);\r
1124         void extGlUniform1bv(GLint loc, GLsizei count, const bool *v);\r
1125         void extGlUniform2bv(GLint loc, GLsizei count, const bool *v);\r
1126         void extGlUniform3bv(GLint loc, GLsizei count, const bool *v);\r
1127         void extGlUniform4bv(GLint loc, GLsizei count, const bool *v);\r
1128         void extGlUniform1iv(GLint loc, GLsizei count, const GLint *v);\r
1129         void extGlUniform2iv(GLint loc, GLsizei count, const GLint *v);\r
1130         void extGlUniform3iv(GLint loc, GLsizei count, const GLint *v);\r
1131         void extGlUniform4iv(GLint loc, GLsizei count, const GLint *v);\r
1132         void extGlUniform1uiv(GLint loc, GLsizei count, const GLuint *v);\r
1133         void extGlUniform2uiv(GLint loc, GLsizei count, const GLuint *v);\r
1134         void extGlUniform3uiv(GLint loc, GLsizei count, const GLuint *v);\r
1135         void extGlUniform4uiv(GLint loc, GLsizei count, const GLuint *v);\r
1136         void extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1137         void extGlUniformMatrix2x3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1138         void extGlUniformMatrix2x4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1139         void extGlUniformMatrix3x2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1140         void extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1141         void extGlUniformMatrix3x4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1142         void extGlUniformMatrix4x2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1143         void extGlUniformMatrix4x3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1144         void extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v);\r
1145         void extGlGetActiveUniformARB(GLhandleARB program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);\r
1146         void extGlGetActiveUniform(GLuint program, GLuint index, GLsizei maxlength, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\r
1147 \r
1148         // framebuffer objects\r
1149         void irrGlBindFramebuffer(GLenum target, GLuint framebuffer);\r
1150         void irrGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);\r
1151         void irrGlGenFramebuffers(GLsizei n, GLuint *framebuffers);\r
1152         GLenum irrGlCheckFramebufferStatus(GLenum target);\r
1153         void irrGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
1154         void irrGlBindRenderbuffer(GLenum target, GLuint renderbuffer);\r
1155         void irrGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);\r
1156         void irrGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers);\r
1157         void irrGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\r
1158         void irrGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r
1159         void irrGlGenerateMipmap(GLenum target);\r
1160         void irrGlActiveStencilFace(GLenum face);\r
1161         void irrGlDrawBuffer(GLenum mode);\r
1162         void irrGlDrawBuffers(GLsizei n, const GLenum *bufs);\r
1163 \r
1164         // vertex buffer object\r
1165         void extGlGenBuffers(GLsizei n, GLuint *buffers);\r
1166         void extGlBindBuffer(GLenum target, GLuint buffer);\r
1167         void extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);\r
1168         void extGlDeleteBuffers(GLsizei n, const GLuint *buffers);\r
1169         void extGlBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);\r
1170         void extGlGetBufferSubData (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);\r
1171         void *extGlMapBuffer (GLenum target, GLenum access);\r
1172         GLboolean extGlUnmapBuffer (GLenum target);\r
1173         GLboolean extGlIsBuffer (GLuint buffer);\r
1174         void extGlGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);\r
1175         void extGlGetBufferPointerv (GLenum target, GLenum pname, GLvoid **params);\r
1176         void extGlProvokingVertex(GLenum mode);\r
1177         void extGlProgramParameteri(GLuint program, GLenum pname, GLint value);\r
1178 \r
1179         // occlusion query\r
1180         void extGlGenQueries(GLsizei n, GLuint *ids);\r
1181         void extGlDeleteQueries(GLsizei n, const GLuint *ids);\r
1182         GLboolean extGlIsQuery(GLuint id);\r
1183         void extGlBeginQuery(GLenum target, GLuint id);\r
1184         void extGlEndQuery(GLenum target);\r
1185         void extGlGetQueryiv(GLenum target, GLenum pname, GLint *params);\r
1186         void extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params);\r
1187         void extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);\r
1188 \r
1189         // blend\r
1190         void irrGlBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r
1191         void irrGlBlendEquation(GLenum mode);\r
1192 \r
1193         // indexed\r
1194         void irrGlEnableIndexed(GLenum target, GLuint index);\r
1195         void irrGlDisableIndexed(GLenum target, GLuint index);\r
1196         void irrGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\r
1197         void irrGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst);\r
1198         void irrGlBlendFuncSeparateIndexed(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\r
1199         void irrGlBlendEquationIndexed(GLuint buf, GLenum mode);\r
1200         void irrGlBlendEquationSeparateIndexed(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\r
1201 \r
1202     void extGlTextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);\r
1203     void extGlTextureStorage2D(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\r
1204     void extGlTextureStorage3D(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\r
1205         void extGlGetTextureImage(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels);\r
1206     void extGlNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\r
1207     void extGlTextureParameteri(GLuint texture, GLenum pname, GLint param);\r
1208         void extGlTextureParameterf(GLuint texture,     GLenum pname, GLfloat param);\r
1209         void extGlTextureParameteriv(GLuint texture, GLenum pname, const GLint* params);\r
1210         void extGlTextureParameterfv(GLuint texture, GLenum pname, const GLfloat* params);\r
1211     void extGlCreateTextures(GLenum target, GLsizei n, GLuint* textures);\r
1212     void extGlCreateFramebuffers(GLsizei n, GLuint* framebuffers);\r
1213     void extGlBindTextures(GLuint first, GLsizei count, const GLuint *textures, const GLenum* targets);\r
1214     void extGlGenerateTextureMipmap(GLuint texture, GLenum target);\r
1215 \r
1216 \r
1217         // generic vsync setting method for several extensions\r
1218         void extGlSwapInterval(int interval);\r
1219 \r
1220         // the global feature array\r
1221         bool FeatureAvailable[IRR_OpenGL_Feature_Count];\r
1222 \r
1223         protected:\r
1224                 COpenGLCoreFeature Feature;\r
1225 \r
1226         #if defined(_IRR_OPENGL_USE_EXTPOINTER_)\r
1227                 PFNGLACTIVETEXTUREPROC pGlActiveTexture;\r
1228                 PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB;\r
1229                 PFNGLCLIENTACTIVETEXTUREARBPROC pGlClientActiveTextureARB;\r
1230                 PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;\r
1231                 PFNGLGENPROGRAMSNVPROC pGlGenProgramsNV;\r
1232                 PFNGLBINDPROGRAMARBPROC pGlBindProgramARB;\r
1233                 PFNGLBINDPROGRAMNVPROC pGlBindProgramNV;\r
1234                 PFNGLDELETEPROGRAMSARBPROC pGlDeleteProgramsARB;\r
1235                 PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsNV;\r
1236                 PFNGLPROGRAMSTRINGARBPROC pGlProgramStringARB;\r
1237                 PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;\r
1238                 PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;\r
1239                 PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;\r
1240                 PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;\r
1241                 PFNGLCOMPILESHADERARBPROC pGlCompileShaderARB;\r
1242                 PFNGLCREATEPROGRAMOBJECTARBPROC pGlCreateProgramObjectARB;\r
1243                 PFNGLATTACHOBJECTARBPROC pGlAttachObjectARB;\r
1244                 PFNGLLINKPROGRAMARBPROC pGlLinkProgramARB;\r
1245                 PFNGLUSEPROGRAMOBJECTARBPROC pGlUseProgramObjectARB;\r
1246                 PFNGLDELETEOBJECTARBPROC pGlDeleteObjectARB;\r
1247                 PFNGLCREATEPROGRAMPROC pGlCreateProgram;\r
1248                 PFNGLUSEPROGRAMPROC pGlUseProgram;\r
1249                 PFNGLDELETEPROGRAMPROC pGlDeleteProgram;\r
1250                 PFNGLDELETESHADERPROC pGlDeleteShader;\r
1251                 PFNGLGETATTACHEDOBJECTSARBPROC pGlGetAttachedObjectsARB;\r
1252                 PFNGLGETATTACHEDSHADERSPROC pGlGetAttachedShaders;\r
1253                 PFNGLCREATESHADERPROC pGlCreateShader;\r
1254                 PFNGLSHADERSOURCEPROC pGlShaderSource;\r
1255                 PFNGLCOMPILESHADERPROC pGlCompileShader;\r
1256                 PFNGLATTACHSHADERPROC pGlAttachShader;\r
1257                 PFNGLLINKPROGRAMPROC pGlLinkProgram;\r
1258                 PFNGLGETINFOLOGARBPROC pGlGetInfoLogARB;\r
1259                 PFNGLGETSHADERINFOLOGPROC pGlGetShaderInfoLog;\r
1260                 PFNGLGETPROGRAMINFOLOGPROC pGlGetProgramInfoLog;\r
1261                 PFNGLGETOBJECTPARAMETERIVARBPROC pGlGetObjectParameterivARB;\r
1262                 PFNGLGETSHADERIVPROC pGlGetShaderiv;\r
1263                 PFNGLGETSHADERIVPROC pGlGetProgramiv;\r
1264                 PFNGLGETUNIFORMLOCATIONARBPROC pGlGetUniformLocationARB;\r
1265                 PFNGLGETUNIFORMLOCATIONPROC pGlGetUniformLocation;\r
1266                 PFNGLUNIFORM1FVARBPROC pGlUniform1fvARB;\r
1267                 PFNGLUNIFORM2FVARBPROC pGlUniform2fvARB;\r
1268                 PFNGLUNIFORM3FVARBPROC pGlUniform3fvARB;\r
1269                 PFNGLUNIFORM4FVARBPROC pGlUniform4fvARB;\r
1270                 PFNGLUNIFORM1IVARBPROC pGlUniform1ivARB;\r
1271                 PFNGLUNIFORM2IVARBPROC pGlUniform2ivARB;\r
1272                 PFNGLUNIFORM3IVARBPROC pGlUniform3ivARB;\r
1273                 PFNGLUNIFORM4IVARBPROC pGlUniform4ivARB;\r
1274                 PFNGLUNIFORM1UIVPROC pGlUniform1uiv;\r
1275                 PFNGLUNIFORM2UIVPROC pGlUniform2uiv;\r
1276                 PFNGLUNIFORM3UIVPROC pGlUniform3uiv;\r
1277                 PFNGLUNIFORM4UIVPROC pGlUniform4uiv;\r
1278                 PFNGLUNIFORMMATRIX2FVARBPROC pGlUniformMatrix2fvARB;\r
1279                 PFNGLUNIFORMMATRIX2X3FVPROC pGlUniformMatrix2x3fv;\r
1280                 PFNGLUNIFORMMATRIX2X4FVPROC pGlUniformMatrix2x4fv;\r
1281                 PFNGLUNIFORMMATRIX3X2FVPROC pGlUniformMatrix3x2fv;\r
1282                 PFNGLUNIFORMMATRIX3FVARBPROC pGlUniformMatrix3fvARB;\r
1283                 PFNGLUNIFORMMATRIX3X4FVPROC pGlUniformMatrix3x4fv;\r
1284                 PFNGLUNIFORMMATRIX4X2FVPROC pGlUniformMatrix4x2fv;\r
1285                 PFNGLUNIFORMMATRIX4X3FVPROC pGlUniformMatrix4x3fv;\r
1286                 PFNGLUNIFORMMATRIX4FVARBPROC pGlUniformMatrix4fvARB;\r
1287                 PFNGLGETACTIVEUNIFORMARBPROC pGlGetActiveUniformARB;\r
1288                 PFNGLGETACTIVEUNIFORMPROC pGlGetActiveUniform;\r
1289                 PFNGLPOINTPARAMETERFARBPROC  pGlPointParameterfARB;\r
1290                 PFNGLPOINTPARAMETERFVARBPROC pGlPointParameterfvARB;\r
1291                 PFNGLSTENCILFUNCSEPARATEPROC pGlStencilFuncSeparate;\r
1292                 PFNGLSTENCILOPSEPARATEPROC pGlStencilOpSeparate;\r
1293                 PFNGLSTENCILFUNCSEPARATEATIPROC pGlStencilFuncSeparateATI;\r
1294                 PFNGLSTENCILOPSEPARATEATIPROC pGlStencilOpSeparateATI;\r
1295                 PFNGLCOMPRESSEDTEXIMAGE2DPROC pGlCompressedTexImage2D;\r
1296                 PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC pGlCompressedTexSubImage2D;\r
1297                 // ARB framebuffer object\r
1298                 PFNGLBINDFRAMEBUFFERPROC pGlBindFramebuffer;\r
1299                 PFNGLDELETEFRAMEBUFFERSPROC pGlDeleteFramebuffers;\r
1300                 PFNGLGENFRAMEBUFFERSPROC pGlGenFramebuffers;\r
1301                 PFNGLCHECKFRAMEBUFFERSTATUSPROC pGlCheckFramebufferStatus;\r
1302                 PFNGLFRAMEBUFFERTEXTURE2DPROC pGlFramebufferTexture2D;\r
1303                 PFNGLBINDRENDERBUFFERPROC pGlBindRenderbuffer;\r
1304                 PFNGLDELETERENDERBUFFERSPROC pGlDeleteRenderbuffers;\r
1305                 PFNGLGENRENDERBUFFERSPROC pGlGenRenderbuffers;\r
1306                 PFNGLRENDERBUFFERSTORAGEPROC pGlRenderbufferStorage;\r
1307                 PFNGLFRAMEBUFFERRENDERBUFFERPROC pGlFramebufferRenderbuffer;\r
1308                 PFNGLGENERATEMIPMAPPROC pGlGenerateMipmap;\r
1309                 // EXT framebuffer object\r
1310                 PFNGLBINDFRAMEBUFFEREXTPROC pGlBindFramebufferEXT;\r
1311                 PFNGLDELETEFRAMEBUFFERSEXTPROC pGlDeleteFramebuffersEXT;\r
1312                 PFNGLGENFRAMEBUFFERSEXTPROC pGlGenFramebuffersEXT;\r
1313                 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC pGlCheckFramebufferStatusEXT;\r
1314                 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC pGlFramebufferTexture2DEXT;\r
1315                 PFNGLBINDRENDERBUFFEREXTPROC pGlBindRenderbufferEXT;\r
1316                 PFNGLDELETERENDERBUFFERSEXTPROC pGlDeleteRenderbuffersEXT;\r
1317                 PFNGLGENRENDERBUFFERSEXTPROC pGlGenRenderbuffersEXT;\r
1318                 PFNGLRENDERBUFFERSTORAGEEXTPROC pGlRenderbufferStorageEXT;\r
1319                 PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC pGlFramebufferRenderbufferEXT;\r
1320                 PFNGLGENERATEMIPMAPEXTPROC pGlGenerateMipmapEXT;\r
1321                 PFNGLACTIVESTENCILFACEEXTPROC pGlActiveStencilFaceEXT;\r
1322                 PFNGLDRAWBUFFERSARBPROC pGlDrawBuffersARB;\r
1323                 PFNGLDRAWBUFFERSATIPROC pGlDrawBuffersATI;\r
1324                 PFNGLGENBUFFERSARBPROC pGlGenBuffersARB;\r
1325                 PFNGLBINDBUFFERARBPROC pGlBindBufferARB;\r
1326                 PFNGLBUFFERDATAARBPROC pGlBufferDataARB;\r
1327                 PFNGLDELETEBUFFERSARBPROC pGlDeleteBuffersARB;\r
1328                 PFNGLBUFFERSUBDATAARBPROC pGlBufferSubDataARB;\r
1329                 PFNGLGETBUFFERSUBDATAARBPROC pGlGetBufferSubDataARB;\r
1330                 PFNGLMAPBUFFERARBPROC pGlMapBufferARB;\r
1331                 PFNGLUNMAPBUFFERARBPROC pGlUnmapBufferARB;\r
1332                 PFNGLISBUFFERARBPROC pGlIsBufferARB;\r
1333                 PFNGLGETBUFFERPARAMETERIVARBPROC pGlGetBufferParameterivARB;\r
1334                 PFNGLGETBUFFERPOINTERVARBPROC pGlGetBufferPointervARB;\r
1335                 PFNGLPROVOKINGVERTEXPROC pGlProvokingVertexARB;\r
1336                 PFNGLPROVOKINGVERTEXEXTPROC pGlProvokingVertexEXT;\r
1337                 PFNGLPROGRAMPARAMETERIARBPROC pGlProgramParameteriARB;\r
1338                 PFNGLPROGRAMPARAMETERIEXTPROC pGlProgramParameteriEXT;\r
1339                 PFNGLGENQUERIESARBPROC pGlGenQueriesARB;\r
1340                 PFNGLDELETEQUERIESARBPROC pGlDeleteQueriesARB;\r
1341                 PFNGLISQUERYARBPROC pGlIsQueryARB;\r
1342                 PFNGLBEGINQUERYARBPROC pGlBeginQueryARB;\r
1343                 PFNGLENDQUERYARBPROC pGlEndQueryARB;\r
1344                 PFNGLGETQUERYIVARBPROC pGlGetQueryivARB;\r
1345                 PFNGLGETQUERYOBJECTIVARBPROC pGlGetQueryObjectivARB;\r
1346                 PFNGLGETQUERYOBJECTUIVARBPROC pGlGetQueryObjectuivARB;\r
1347                 PFNGLGENOCCLUSIONQUERIESNVPROC pGlGenOcclusionQueriesNV;\r
1348                 PFNGLDELETEOCCLUSIONQUERIESNVPROC pGlDeleteOcclusionQueriesNV;\r
1349                 PFNGLISOCCLUSIONQUERYNVPROC pGlIsOcclusionQueryNV;\r
1350                 PFNGLBEGINOCCLUSIONQUERYNVPROC pGlBeginOcclusionQueryNV;\r
1351                 PFNGLENDOCCLUSIONQUERYNVPROC pGlEndOcclusionQueryNV;\r
1352                 PFNGLGETOCCLUSIONQUERYIVNVPROC pGlGetOcclusionQueryivNV;\r
1353                 PFNGLGETOCCLUSIONQUERYUIVNVPROC pGlGetOcclusionQueryuivNV;\r
1354                 // Blend\r
1355                 PFNGLBLENDFUNCSEPARATEEXTPROC pGlBlendFuncSeparateEXT;\r
1356                 PFNGLBLENDFUNCSEPARATEPROC pGlBlendFuncSeparate;\r
1357                 PFNGLBLENDEQUATIONEXTPROC pGlBlendEquationEXT;\r
1358                 PFNGLBLENDEQUATIONPROC pGlBlendEquation;\r
1359                 PFNGLBLENDEQUATIONSEPARATEEXTPROC pGlBlendEquationSeparateEXT;\r
1360                 PFNGLBLENDEQUATIONSEPARATEPROC pGlBlendEquationSeparate;\r
1361                 // Indexed\r
1362                 PFNGLENABLEINDEXEDEXTPROC pGlEnableIndexedEXT;\r
1363                 PFNGLDISABLEINDEXEDEXTPROC pGlDisableIndexedEXT;\r
1364                 PFNGLCOLORMASKINDEXEDEXTPROC pGlColorMaskIndexedEXT;\r
1365                 PFNGLBLENDFUNCINDEXEDAMDPROC pGlBlendFuncIndexedAMD;\r
1366                 PFNGLBLENDFUNCIPROC pGlBlendFunciARB;\r
1367                 PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC pGlBlendFuncSeparateIndexedAMD;\r
1368                 PFNGLBLENDFUNCSEPARATEIPROC pGlBlendFuncSeparateiARB;\r
1369                 PFNGLBLENDEQUATIONINDEXEDAMDPROC pGlBlendEquationIndexedAMD;\r
1370                 PFNGLBLENDEQUATIONIPROC pGlBlendEquationiARB;\r
1371                 PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC pGlBlendEquationSeparateIndexedAMD;\r
1372                 PFNGLBLENDEQUATIONSEPARATEIPROC pGlBlendEquationSeparateiARB;\r
1373 \r
1374                 // DSA\r
1375         PFNGLTEXTURESTORAGE2DPROC pGlTextureStorage2D;\r
1376         PFNGLTEXTURESTORAGE3DPROC pGlTextureStorage3D;\r
1377         PFNGLTEXTURESUBIMAGE2DPROC pGlTextureSubImage2D;\r
1378                 PFNGLGETTEXTUREIMAGEPROC pGlGetTextureImage;\r
1379         PFNGLNAMEDFRAMEBUFFERTEXTUREPROC pGlNamedFramebufferTexture;\r
1380         PFNGLTEXTUREPARAMETERIPROC pGlTextureParameteri;\r
1381                 PFNGLTEXTUREPARAMETERFPROC pGlTextureParameterf;\r
1382                 PFNGLTEXTUREPARAMETERIVPROC pGlTextureParameteriv;\r
1383                 PFNGLTEXTUREPARAMETERFVPROC pGlTextureParameterfv;\r
1384 \r
1385         PFNGLCREATETEXTURESPROC pGlCreateTextures;\r
1386         PFNGLCREATEFRAMEBUFFERSPROC pGlCreateFramebuffers;\r
1387         PFNGLBINDTEXTURESPROC pGlBindTextures;\r
1388         PFNGLGENERATETEXTUREMIPMAPPROC pGlGenerateTextureMipmap;\r
1389         // DSA with EXT or functions to simulate it\r
1390         PFNGLTEXTURESTORAGE2DEXTPROC pGlTextureStorage2DEXT;\r
1391         PFNGLTEXSTORAGE2DPROC pGlTexStorage2D;\r
1392         PFNGLTEXTURESTORAGE3DEXTPROC pGlTextureStorage3DEXT;\r
1393         PFNGLTEXSTORAGE3DPROC pGlTexStorage3D;\r
1394                 PFNGLTEXTURESUBIMAGE2DEXTPROC pGlTextureSubImage2DEXT;\r
1395                 PFNGLGETTEXTUREIMAGEEXTPROC pGlGetTextureImageEXT;\r
1396         PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC pGlNamedFramebufferTextureEXT;\r
1397         PFNGLFRAMEBUFFERTEXTUREPROC pGlFramebufferTexture;\r
1398         PFNGLGENERATETEXTUREMIPMAPEXTPROC pGlGenerateTextureMipmapEXT;\r
1399 \r
1400                 #if defined(WGL_EXT_swap_control)\r
1401                 PFNWGLSWAPINTERVALEXTPROC pWglSwapIntervalEXT;\r
1402                 #endif\r
1403                 #if defined(GLX_SGI_swap_control)\r
1404                 PFNGLXSWAPINTERVALSGIPROC pGlxSwapIntervalSGI;\r
1405                 #endif\r
1406                 #if defined(GLX_EXT_swap_control)\r
1407                 PFNGLXSWAPINTERVALEXTPROC pGlxSwapIntervalEXT;\r
1408                 #endif\r
1409                 #if defined(GLX_MESA_swap_control)\r
1410                 PFNGLXSWAPINTERVALMESAPROC pGlxSwapIntervalMESA;\r
1411                 #endif\r
1412         #endif\r
1413 };\r
1414 \r
1415 inline void COpenGLExtensionHandler::irrGlActiveTexture(GLenum texture)\r
1416 {\r
1417 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1418         if (pGlActiveTexture)\r
1419                 pGlActiveTexture(texture);\r
1420         else if (pGlActiveTextureARB)\r
1421                 pGlActiveTextureARB(texture);\r
1422 #else\r
1423 #ifdef GL_ARB_multitexture\r
1424                 glActiveTextureARB(texture);\r
1425 #else\r
1426                 glActiveTexture(texture);\r
1427 #endif\r
1428 #endif\r
1429 }\r
1430 \r
1431 inline void COpenGLExtensionHandler::irrGlClientActiveTexture(GLenum texture)\r
1432 {\r
1433 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1434         if (pGlClientActiveTextureARB)\r
1435                 pGlClientActiveTextureARB(texture);\r
1436 #else\r
1437         glClientActiveTextureARB(texture);\r
1438 #endif\r
1439 }\r
1440 \r
1441 inline void COpenGLExtensionHandler::extGlGenPrograms(GLsizei n, GLuint *programs)\r
1442 {\r
1443         if (programs)\r
1444                 memset(programs,0,n*sizeof(GLuint));\r
1445 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1446         if (pGlGenProgramsARB)\r
1447                 pGlGenProgramsARB(n, programs);\r
1448         else if (pGlGenProgramsNV)\r
1449                 pGlGenProgramsNV(n, programs);\r
1450 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)\r
1451         glGenProgramsARB(n,programs);\r
1452 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)\r
1453         glGenProgramsNV(n,programs);\r
1454 #else\r
1455         os::Printer::log("glGenPrograms not supported", ELL_ERROR);\r
1456 #endif\r
1457 }\r
1458 \r
1459 inline void COpenGLExtensionHandler::extGlBindProgram(GLenum target, GLuint program)\r
1460 {\r
1461 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1462         if (pGlBindProgramARB)\r
1463                 pGlBindProgramARB(target, program);\r
1464         else if (pGlBindProgramNV)\r
1465                 pGlBindProgramNV(target, program);\r
1466 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)\r
1467         glBindProgramARB(target, program);\r
1468 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)\r
1469         glBindProgramNV(target, program);\r
1470 #else\r
1471         os::Printer::log("glBindProgram not supported", ELL_ERROR);\r
1472 #endif\r
1473 }\r
1474 \r
1475 inline void COpenGLExtensionHandler::extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string)\r
1476 {\r
1477 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1478         if (pGlProgramStringARB)\r
1479                 pGlProgramStringARB(target, format, len, string);\r
1480 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)\r
1481         glProgramStringARB(target,format,len,string);\r
1482 #else\r
1483         os::Printer::log("glProgramString not supported", ELL_ERROR);\r
1484 #endif\r
1485 }\r
1486 \r
1487 inline void COpenGLExtensionHandler::extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string)\r
1488 {\r
1489 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1490         if (pGlLoadProgramNV)\r
1491                 pGlLoadProgramNV(target, id, len, string);\r
1492 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)\r
1493         glLoadProgramNV(target,id,len,string);\r
1494 #else\r
1495         os::Printer::log("glLoadProgram not supported", ELL_ERROR);\r
1496 #endif\r
1497 }\r
1498 \r
1499 inline void COpenGLExtensionHandler::extGlDeletePrograms(GLsizei n, const GLuint *programs)\r
1500 {\r
1501 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1502         if (pGlDeleteProgramsARB)\r
1503                 pGlDeleteProgramsARB(n, programs);\r
1504         else if (pGlDeleteProgramsNV)\r
1505                 pGlDeleteProgramsNV(n, programs);\r
1506 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)\r
1507         glDeleteProgramsARB(n,programs);\r
1508 #elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)\r
1509         glDeleteProgramsNV(n,programs);\r
1510 #else\r
1511         os::Printer::log("glDeletePrograms not supported", ELL_ERROR);\r
1512 #endif\r
1513 }\r
1514 \r
1515 inline void COpenGLExtensionHandler::extGlProgramLocalParameter4fv(GLenum n, GLuint i, const GLfloat *f)\r
1516 {\r
1517 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1518         if (pGlProgramLocalParameter4fvARB)\r
1519                 pGlProgramLocalParameter4fvARB(n,i,f);\r
1520 #elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)\r
1521         glProgramLocalParameter4fvARB(n,i,f);\r
1522 #else\r
1523         os::Printer::log("glProgramLocalParameter4fv not supported", ELL_ERROR);\r
1524 #endif\r
1525 }\r
1526 \r
1527 inline GLhandleARB COpenGLExtensionHandler::extGlCreateShaderObject(GLenum shaderType)\r
1528 {\r
1529 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1530         if (pGlCreateShaderObjectARB)\r
1531                 return pGlCreateShaderObjectARB(shaderType);\r
1532 #elif defined(GL_ARB_shader_objects)\r
1533         return glCreateShaderObjectARB(shaderType);\r
1534 #else\r
1535         os::Printer::log("glCreateShaderObject not supported", ELL_ERROR);\r
1536 #endif\r
1537         return 0;\r
1538 }\r
1539 \r
1540 inline GLuint COpenGLExtensionHandler::extGlCreateShader(GLenum shaderType)\r
1541 {\r
1542 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1543         if (pGlCreateShader)\r
1544                 return pGlCreateShader(shaderType);\r
1545 #elif defined(GL_VERSION_2_0)\r
1546         return glCreateShader(shaderType);\r
1547 #else\r
1548         os::Printer::log("glCreateShader not supported", ELL_ERROR);\r
1549 #endif\r
1550         return 0;\r
1551 }\r
1552 \r
1553 inline void COpenGLExtensionHandler::extGlShaderSourceARB(GLhandleARB shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)\r
1554 {\r
1555 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1556         if (pGlShaderSourceARB)\r
1557                 pGlShaderSourceARB(shader, numOfStrings, strings, lenOfStrings);\r
1558 #elif defined(GL_ARB_shader_objects)\r
1559         glShaderSourceARB(shader, numOfStrings, strings, (GLint *)lenOfStrings);\r
1560 #else\r
1561         os::Printer::log("glShaderSource not supported", ELL_ERROR);\r
1562 #endif\r
1563 }\r
1564 \r
1565 inline void COpenGLExtensionHandler::extGlShaderSource(GLuint shader, GLsizei numOfStrings, const char **strings, const GLint *lenOfStrings)\r
1566 {\r
1567 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1568         if (pGlShaderSource)\r
1569                 pGlShaderSource(shader, numOfStrings, strings, lenOfStrings);\r
1570 #elif defined(GL_VERSION_2_0)\r
1571         glShaderSource(shader, numOfStrings, strings, (GLint *)lenOfStrings);\r
1572 #else\r
1573         os::Printer::log("glShaderSource not supported", ELL_ERROR);\r
1574 #endif\r
1575 }\r
1576 \r
1577 inline void COpenGLExtensionHandler::extGlCompileShaderARB(GLhandleARB shader)\r
1578 {\r
1579 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1580         if (pGlCompileShaderARB)\r
1581                 pGlCompileShaderARB(shader);\r
1582 #elif defined(GL_ARB_shader_objects)\r
1583         glCompileShaderARB(shader);\r
1584 #else\r
1585         os::Printer::log("glCompileShader not supported", ELL_ERROR);\r
1586 #endif\r
1587 }\r
1588 \r
1589 inline void COpenGLExtensionHandler::extGlCompileShader(GLuint shader)\r
1590 {\r
1591 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1592         if (pGlCompileShader)\r
1593                 pGlCompileShader(shader);\r
1594 #elif defined(GL_VERSION_2_0)\r
1595         glCompileShader(shader);\r
1596 #else\r
1597         os::Printer::log("glCompileShader not supported", ELL_ERROR);\r
1598 #endif\r
1599 }\r
1600 \r
1601 inline GLhandleARB COpenGLExtensionHandler::extGlCreateProgramObject(void)\r
1602 {\r
1603 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1604         if (pGlCreateProgramObjectARB)\r
1605                 return pGlCreateProgramObjectARB();\r
1606 #elif defined(GL_ARB_shader_objects)\r
1607         return glCreateProgramObjectARB();\r
1608 #else\r
1609         os::Printer::log("glCreateProgramObject not supported", ELL_ERROR);\r
1610 #endif\r
1611         return 0;\r
1612 }\r
1613 \r
1614 inline GLuint COpenGLExtensionHandler::extGlCreateProgram(void)\r
1615 {\r
1616 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1617         if (pGlCreateProgram)\r
1618                 return pGlCreateProgram();\r
1619 #elif defined(GL_VERSION_2_0)\r
1620         return glCreateProgram();\r
1621 #else\r
1622         os::Printer::log("glCreateProgram not supported", ELL_ERROR);\r
1623 #endif\r
1624         return 0;\r
1625 }\r
1626 \r
1627 inline void COpenGLExtensionHandler::extGlAttachObject(GLhandleARB program, GLhandleARB shader)\r
1628 {\r
1629 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1630         if (pGlAttachObjectARB)\r
1631                 pGlAttachObjectARB(program, shader);\r
1632 #elif defined(GL_ARB_shader_objects)\r
1633         glAttachObjectARB(program, shader);\r
1634 #else\r
1635         os::Printer::log("glAttachObject not supported", ELL_ERROR);\r
1636 #endif\r
1637 }\r
1638 \r
1639 inline void COpenGLExtensionHandler::extGlAttachShader(GLuint program, GLuint shader)\r
1640 {\r
1641 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1642         if (pGlAttachShader)\r
1643                 pGlAttachShader(program, shader);\r
1644 #elif defined(GL_VERSION_2_0)\r
1645         glAttachShader(program, shader);\r
1646 #else\r
1647         os::Printer::log("glAttachShader not supported", ELL_ERROR);\r
1648 #endif\r
1649 }\r
1650 \r
1651 inline void COpenGLExtensionHandler::extGlLinkProgramARB(GLhandleARB program)\r
1652 {\r
1653 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1654         if (pGlLinkProgramARB)\r
1655                 pGlLinkProgramARB(program);\r
1656 #elif defined(GL_ARB_shader_objects)\r
1657         glLinkProgramARB(program);\r
1658 #else\r
1659         os::Printer::log("glLinkProgram not supported", ELL_ERROR);\r
1660 #endif\r
1661 }\r
1662 \r
1663 inline void COpenGLExtensionHandler::extGlLinkProgram(GLuint program)\r
1664 {\r
1665 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1666         if (pGlLinkProgram)\r
1667                 pGlLinkProgram(program);\r
1668 #elif defined(GL_VERSION_2_0)\r
1669         glLinkProgram(program);\r
1670 #else\r
1671         os::Printer::log("glLinkProgram not supported", ELL_ERROR);\r
1672 #endif\r
1673 }\r
1674 \r
1675 inline void COpenGLExtensionHandler::extGlUseProgramObject(GLhandleARB prog)\r
1676 {\r
1677 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1678         if (pGlUseProgramObjectARB)\r
1679                 pGlUseProgramObjectARB(prog);\r
1680 #elif defined(GL_ARB_shader_objects)\r
1681         glUseProgramObjectARB(prog);\r
1682 #else\r
1683         os::Printer::log("glUseProgramObject not supported", ELL_ERROR);\r
1684 #endif\r
1685 }\r
1686 \r
1687 inline void COpenGLExtensionHandler::irrGlUseProgram(GLuint prog)\r
1688 {\r
1689 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1690         if (pGlUseProgram)\r
1691                 pGlUseProgram(prog);\r
1692 #elif defined(GL_VERSION_2_0)\r
1693         glUseProgram(prog);\r
1694 #else\r
1695         os::Printer::log("glUseProgram not supported", ELL_ERROR);\r
1696 #endif\r
1697 }\r
1698 \r
1699 inline void COpenGLExtensionHandler::extGlDeleteObject(GLhandleARB object)\r
1700 {\r
1701 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1702         if (pGlDeleteObjectARB)\r
1703                 pGlDeleteObjectARB(object);\r
1704 #elif defined(GL_ARB_shader_objects)\r
1705         glDeleteObjectARB(object);\r
1706 #else\r
1707         os::Printer::log("glDeleteObject not supported", ELL_ERROR);\r
1708 #endif\r
1709 }\r
1710 \r
1711 inline void COpenGLExtensionHandler::extGlDeleteProgram(GLuint object)\r
1712 {\r
1713 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1714         if (pGlDeleteProgram)\r
1715                 pGlDeleteProgram(object);\r
1716 #elif defined(GL_VERSION_2_0)\r
1717         glDeleteProgram(object);\r
1718 #else\r
1719         os::Printer::log("glDeleteProgram not supported", ELL_ERROR);\r
1720 #endif\r
1721 }\r
1722 \r
1723 inline void COpenGLExtensionHandler::extGlDeleteShader(GLuint shader)\r
1724 {\r
1725 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1726         if (pGlDeleteShader)\r
1727                 pGlDeleteShader(shader);\r
1728 #elif defined(GL_VERSION_2_0)\r
1729         glDeleteShader(shader);\r
1730 #else\r
1731         os::Printer::log("glDeleteShader not supported", ELL_ERROR);\r
1732 #endif\r
1733 }\r
1734 \r
1735 inline void COpenGLExtensionHandler::extGlGetAttachedObjects(GLhandleARB program, GLsizei maxcount, GLsizei* count, GLhandleARB* shaders)\r
1736 {\r
1737         if (count)\r
1738                 *count=0;\r
1739 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1740         if (pGlGetAttachedObjectsARB)\r
1741                 pGlGetAttachedObjectsARB(program, maxcount, count, shaders);\r
1742 #elif defined(GL_ARB_shader_objects)\r
1743         glGetAttachedObjectsARB(program, maxcount, count, shaders);\r
1744 #else\r
1745         os::Printer::log("glGetAttachedObjects not supported", ELL_ERROR);\r
1746 #endif\r
1747 }\r
1748 \r
1749 inline void COpenGLExtensionHandler::extGlGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)\r
1750 {\r
1751         if (count)\r
1752                 *count=0;\r
1753 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1754         if (pGlGetAttachedShaders)\r
1755                 pGlGetAttachedShaders(program, maxcount, count, shaders);\r
1756 #elif defined(GL_VERSION_2_0)\r
1757         glGetAttachedShaders(program, maxcount, count, shaders);\r
1758 #else\r
1759         os::Printer::log("glGetAttachedShaders not supported", ELL_ERROR);\r
1760 #endif\r
1761 }\r
1762 \r
1763 inline void COpenGLExtensionHandler::extGlGetInfoLog(GLhandleARB object, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog)\r
1764 {\r
1765         if (length)\r
1766                 *length=0;\r
1767 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1768         if (pGlGetInfoLogARB)\r
1769                 pGlGetInfoLogARB(object, maxLength, length, infoLog);\r
1770 #elif defined(GL_ARB_shader_objects)\r
1771         glGetInfoLogARB(object, maxLength, length, infoLog);\r
1772 #else\r
1773         os::Printer::log("glGetInfoLog not supported", ELL_ERROR);\r
1774 #endif\r
1775 }\r
1776 \r
1777 inline void COpenGLExtensionHandler::extGlGetShaderInfoLog(GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog)\r
1778 {\r
1779         if (length)\r
1780                 *length=0;\r
1781 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1782         if (pGlGetShaderInfoLog)\r
1783                 pGlGetShaderInfoLog(shader, maxLength, length, infoLog);\r
1784 #elif defined(GL_VERSION_2_0)\r
1785         glGetShaderInfoLog(shader, maxLength, length, infoLog);\r
1786 #else\r
1787         os::Printer::log("glGetShaderInfoLog not supported", ELL_ERROR);\r
1788 #endif\r
1789 }\r
1790 \r
1791 inline void COpenGLExtensionHandler::extGlGetProgramInfoLog(GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog)\r
1792 {\r
1793         if (length)\r
1794                 *length=0;\r
1795 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1796         if (pGlGetProgramInfoLog)\r
1797                 pGlGetProgramInfoLog(program, maxLength, length, infoLog);\r
1798 #elif defined(GL_VERSION_2_0)\r
1799         glGetProgramInfoLog(program, maxLength, length, infoLog);\r
1800 #else\r
1801         os::Printer::log("glGetProgramInfoLog not supported", ELL_ERROR);\r
1802 #endif\r
1803 }\r
1804 \r
1805 inline void COpenGLExtensionHandler::extGlGetObjectParameteriv(GLhandleARB object, GLenum type, GLint *param)\r
1806 {\r
1807 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1808         if (pGlGetObjectParameterivARB)\r
1809                 pGlGetObjectParameterivARB(object, type, param);\r
1810 #elif defined(GL_ARB_shader_objects)\r
1811         glGetObjectParameterivARB(object, type, param);\r
1812 #else\r
1813         os::Printer::log("glGetObjectParameteriv not supported", ELL_ERROR);\r
1814 #endif\r
1815 }\r
1816 \r
1817 inline void COpenGLExtensionHandler::extGlGetShaderiv(GLuint shader, GLenum type, GLint *param)\r
1818 {\r
1819 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1820         if (pGlGetShaderiv)\r
1821                 pGlGetShaderiv(shader, type, param);\r
1822 #elif defined(GL_VERSION_2_0)\r
1823         glGetShaderiv(shader, type, param);\r
1824 #else\r
1825         os::Printer::log("glGetShaderiv not supported", ELL_ERROR);\r
1826 #endif\r
1827 }\r
1828 \r
1829 inline void COpenGLExtensionHandler::extGlGetProgramiv(GLuint program, GLenum type, GLint *param)\r
1830 {\r
1831 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1832         if (pGlGetProgramiv)\r
1833                 pGlGetProgramiv(program, type, param);\r
1834 #elif defined(GL_VERSION_2_0)\r
1835         glGetProgramiv(program, type, param);\r
1836 #else\r
1837         os::Printer::log("glGetProgramiv not supported", ELL_ERROR);\r
1838 #endif\r
1839 }\r
1840 \r
1841 inline GLint COpenGLExtensionHandler::extGlGetUniformLocationARB(GLhandleARB program, const char *name)\r
1842 {\r
1843 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1844         if (pGlGetUniformLocationARB)\r
1845                 return pGlGetUniformLocationARB(program, name);\r
1846 #elif defined(GL_ARB_shader_objects)\r
1847         return glGetUniformLocationARB(program, name);\r
1848 #else\r
1849         os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);\r
1850 #endif\r
1851         return 0;\r
1852 }\r
1853 \r
1854 inline GLint COpenGLExtensionHandler::extGlGetUniformLocation(GLuint program, const char *name)\r
1855 {\r
1856 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1857         if (pGlGetUniformLocation)\r
1858                 return pGlGetUniformLocation(program, name);\r
1859 #elif defined(GL_VERSION_2_0)\r
1860         return glGetUniformLocation(program, name);\r
1861 #else\r
1862         os::Printer::log("glGetUniformLocation not supported", ELL_ERROR);\r
1863 #endif\r
1864         return 0;\r
1865 }\r
1866 \r
1867 inline void COpenGLExtensionHandler::extGlUniform1fv(GLint loc, GLsizei count, const GLfloat *v)\r
1868 {\r
1869 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1870         if (pGlUniform1fvARB)\r
1871                 pGlUniform1fvARB(loc, count, v);\r
1872 #elif defined(GL_ARB_shader_objects)\r
1873         glUniform1fvARB(loc, count, v);\r
1874 #else\r
1875         os::Printer::log("glUniform1fv not supported", ELL_ERROR);\r
1876 #endif\r
1877 }\r
1878 \r
1879 inline void COpenGLExtensionHandler::extGlUniform2fv(GLint loc, GLsizei count, const GLfloat *v)\r
1880 {\r
1881 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1882         if (pGlUniform2fvARB)\r
1883                 pGlUniform2fvARB(loc, count, v);\r
1884 #elif defined(GL_ARB_shader_objects)\r
1885         glUniform2fvARB(loc, count, v);\r
1886 #else\r
1887         os::Printer::log("glUniform2fv not supported", ELL_ERROR);\r
1888 #endif\r
1889 }\r
1890 \r
1891 inline void COpenGLExtensionHandler::extGlUniform3fv(GLint loc, GLsizei count, const GLfloat *v)\r
1892 {\r
1893 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1894         if (pGlUniform3fvARB)\r
1895                 pGlUniform3fvARB(loc, count, v);\r
1896 #elif defined(GL_ARB_shader_objects)\r
1897         glUniform3fvARB(loc, count, v);\r
1898 #else\r
1899         os::Printer::log("glUniform3fv not supported", ELL_ERROR);\r
1900 #endif\r
1901 }\r
1902 \r
1903 inline void COpenGLExtensionHandler::extGlUniform4fv(GLint loc, GLsizei count, const GLfloat *v)\r
1904 {\r
1905 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1906         if (pGlUniform4fvARB)\r
1907                 pGlUniform4fvARB(loc, count, v);\r
1908 #elif defined(GL_ARB_shader_objects)\r
1909         glUniform4fvARB(loc, count, v);\r
1910 #else\r
1911         os::Printer::log("glUniform4fv not supported", ELL_ERROR);\r
1912 #endif\r
1913 }\r
1914 \r
1915 inline void COpenGLExtensionHandler::extGlUniform1uiv(GLint loc, GLsizei count, const GLuint *v)\r
1916 {\r
1917 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1918         if (pGlUniform1uiv)\r
1919                 pGlUniform1uiv(loc, count, v);\r
1920 #elif defined(GL_VERSION_3_0)\r
1921         glUniform1uiv(loc, count, v);\r
1922 #endif\r
1923 }\r
1924 \r
1925 inline void COpenGLExtensionHandler::extGlUniform2uiv(GLint loc, GLsizei count, const GLuint *v)\r
1926 {\r
1927 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1928         if (pGlUniform2uiv)\r
1929                 pGlUniform2uiv(loc, count, v);\r
1930 #elif defined(GL_VERSION_3_0)\r
1931         glUniform2uiv(loc, count, v);\r
1932 #endif\r
1933 }\r
1934 \r
1935 inline void COpenGLExtensionHandler::extGlUniform3uiv(GLint loc, GLsizei count, const GLuint *v)\r
1936 {\r
1937 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1938         if (pGlUniform3uiv)\r
1939                 pGlUniform3uiv(loc, count, v);\r
1940 #elif defined(GL_VERSION_3_0)\r
1941         glUniform3uiv(loc, count, v);\r
1942 #endif\r
1943 }\r
1944 \r
1945 inline void COpenGLExtensionHandler::extGlUniform4uiv(GLint loc, GLsizei count, const GLuint *v)\r
1946 {\r
1947 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1948         if (pGlUniform4uiv)\r
1949                 pGlUniform4uiv(loc, count, v);\r
1950 #elif defined(GL_VERSION_3_0)\r
1951         glUniform4uiv(loc, count, v);\r
1952 #endif\r
1953 }\r
1954 \r
1955 inline void COpenGLExtensionHandler::extGlUniform1iv(GLint loc, GLsizei count, const GLint *v)\r
1956 {\r
1957 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1958         if (pGlUniform1ivARB)\r
1959                 pGlUniform1ivARB(loc, count, v);\r
1960 #elif defined(GL_ARB_shader_objects)\r
1961         glUniform1ivARB(loc, count, v);\r
1962 #else\r
1963         os::Printer::log("glUniform1iv not supported", ELL_ERROR);\r
1964 #endif\r
1965 }\r
1966 \r
1967 inline void COpenGLExtensionHandler::extGlUniform2iv(GLint loc, GLsizei count, const GLint *v)\r
1968 {\r
1969 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1970         if (pGlUniform2ivARB)\r
1971                 pGlUniform2ivARB(loc, count, v);\r
1972 #elif defined(GL_ARB_shader_objects)\r
1973         glUniform2ivARB(loc, count, v);\r
1974 #else\r
1975         os::Printer::log("glUniform2iv not supported", ELL_ERROR);\r
1976 #endif\r
1977 }\r
1978 \r
1979 inline void COpenGLExtensionHandler::extGlUniform3iv(GLint loc, GLsizei count, const GLint *v)\r
1980 {\r
1981 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1982         if (pGlUniform3ivARB)\r
1983                 pGlUniform3ivARB(loc, count, v);\r
1984 #elif defined(GL_ARB_shader_objects)\r
1985         glUniform3ivARB(loc, count, v);\r
1986 #else\r
1987         os::Printer::log("glUniform3iv not supported", ELL_ERROR);\r
1988 #endif\r
1989 }\r
1990 \r
1991 inline void COpenGLExtensionHandler::extGlUniform4iv(GLint loc, GLsizei count, const GLint *v)\r
1992 {\r
1993 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
1994         if (pGlUniform4ivARB)\r
1995                 pGlUniform4ivARB(loc, count, v);\r
1996 #elif defined(GL_ARB_shader_objects)\r
1997         glUniform4ivARB(loc, count, v);\r
1998 #else\r
1999         os::Printer::log("glUniform4iv not supported", ELL_ERROR);\r
2000 #endif\r
2001 }\r
2002 \r
2003 inline void COpenGLExtensionHandler::extGlUniformMatrix2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)\r
2004 {\r
2005 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2006         if (pGlUniformMatrix2fvARB)\r
2007                 pGlUniformMatrix2fvARB(loc, count, transpose, v);\r
2008 #elif defined(GL_ARB_shader_objects)\r
2009         glUniformMatrix2fvARB(loc, count, transpose, v);\r
2010 #else\r
2011         os::Printer::log("glUniformMatrix2fv not supported", ELL_ERROR);\r
2012 #endif\r
2013 }\r
2014 \r
2015 inline void COpenGLExtensionHandler::extGlUniformMatrix2x3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2016 {\r
2017 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2018         if (pGlUniformMatrix2x3fv)\r
2019                 pGlUniformMatrix2x3fv(loc, count, transpose, v);\r
2020         else\r
2021                 os::Printer::log("glUniformMatrix2x3fv not supported", ELL_ERROR);\r
2022 #endif\r
2023 }\r
2024 \r
2025 inline void COpenGLExtensionHandler::extGlUniformMatrix2x4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2026 {\r
2027 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2028         if (pGlUniformMatrix2x4fv)\r
2029                 pGlUniformMatrix2x4fv(loc, count, transpose, v);\r
2030         else\r
2031                 os::Printer::log("glUniformMatrix2x4fv not supported", ELL_ERROR);\r
2032 #endif\r
2033 }\r
2034 \r
2035 inline void COpenGLExtensionHandler::extGlUniformMatrix3x2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2036 {\r
2037 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2038         if (pGlUniformMatrix3x2fv)\r
2039                 pGlUniformMatrix3x2fv(loc, count, transpose, v);\r
2040         else\r
2041                 os::Printer::log("glUniformMatrix3x2fv not supported", ELL_ERROR);\r
2042 #endif\r
2043 }\r
2044 \r
2045 inline void COpenGLExtensionHandler::extGlUniformMatrix3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)\r
2046 {\r
2047 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2048         if (pGlUniformMatrix3fvARB)\r
2049                 pGlUniformMatrix3fvARB(loc, count, transpose, v);\r
2050 #elif defined(GL_ARB_shader_objects)\r
2051         glUniformMatrix3fvARB(loc, count, transpose, v);\r
2052 #else\r
2053         os::Printer::log("glUniformMatrix3fv not supported", ELL_ERROR);\r
2054 #endif\r
2055 }\r
2056 \r
2057 inline void COpenGLExtensionHandler::extGlUniformMatrix3x4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2058 {\r
2059 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2060         if (pGlUniformMatrix3x4fv)\r
2061                 pGlUniformMatrix3x4fv(loc, count, transpose, v);\r
2062         else\r
2063                 os::Printer::log("glUniformMatrix3x4fv not supported", ELL_ERROR);\r
2064 #endif\r
2065 }\r
2066 \r
2067 inline void COpenGLExtensionHandler::extGlUniformMatrix4x2fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2068 {\r
2069 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2070         if (pGlUniformMatrix4x2fv)\r
2071                 pGlUniformMatrix4x2fv(loc, count, transpose, v);\r
2072         else\r
2073                 os::Printer::log("glUniformMatrix4x2fv not supported", ELL_ERROR);\r
2074 #endif\r
2075 }\r
2076 \r
2077 inline void COpenGLExtensionHandler::extGlUniformMatrix4x3fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat* v)\r
2078 {\r
2079 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2080         if (pGlUniformMatrix4x3fv)\r
2081                 pGlUniformMatrix4x3fv(loc, count, transpose, v);\r
2082         else\r
2083                 os::Printer::log("glUniformMatrix4x3fv not supported", ELL_ERROR);\r
2084 #endif\r
2085 }\r
2086 \r
2087 inline void COpenGLExtensionHandler::extGlUniformMatrix4fv(GLint loc, GLsizei count, GLboolean transpose, const GLfloat *v)\r
2088 {\r
2089 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2090         if (pGlUniformMatrix4fvARB)\r
2091                 pGlUniformMatrix4fvARB(loc, count, transpose, v);\r
2092 #elif defined(GL_ARB_shader_objects)\r
2093         glUniformMatrix4fvARB(loc, count, transpose, v);\r
2094 #else\r
2095         os::Printer::log("glUniformMatrix4fv not supported", ELL_ERROR);\r
2096 #endif\r
2097 }\r
2098 \r
2099 inline void COpenGLExtensionHandler::extGlGetActiveUniformARB(GLhandleARB program,\r
2100                 GLuint index, GLsizei maxlength, GLsizei *length,\r
2101                 GLint *size, GLenum *type, GLcharARB *name)\r
2102 {\r
2103         if (length)\r
2104                 *length=0;\r
2105 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2106         if (pGlGetActiveUniformARB)\r
2107                 pGlGetActiveUniformARB(program, index, maxlength, length, size, type, name);\r
2108 #elif defined(GL_ARB_shader_objects)\r
2109         glGetActiveUniformARB(program, index, maxlength, length, size, type, name);\r
2110 #else\r
2111         os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);\r
2112 #endif\r
2113 }\r
2114 \r
2115 inline void COpenGLExtensionHandler::extGlGetActiveUniform(GLuint program,\r
2116                 GLuint index, GLsizei maxlength, GLsizei *length,\r
2117                 GLint *size, GLenum *type, GLchar *name)\r
2118 {\r
2119         if (length)\r
2120                 *length=0;\r
2121 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2122         if (pGlGetActiveUniform)\r
2123                 pGlGetActiveUniform(program, index, maxlength, length, size, type, name);\r
2124 #elif defined(GL_VERSION_2_0)\r
2125         glGetActiveUniform(program, index, maxlength, length, size, type, name);\r
2126 #else\r
2127         os::Printer::log("glGetActiveUniform not supported", ELL_ERROR);\r
2128 #endif\r
2129 }\r
2130 \r
2131 inline void COpenGLExtensionHandler::extGlPointParameterf(GLint loc, GLfloat f)\r
2132 {\r
2133 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2134         if (pGlPointParameterfARB)\r
2135                 pGlPointParameterfARB(loc, f);\r
2136 #elif defined(GL_ARB_point_parameters)\r
2137         glPointParameterfARB(loc, f);\r
2138 #else\r
2139         os::Printer::log("glPointParameterf not supported", ELL_ERROR);\r
2140 #endif\r
2141 }\r
2142 \r
2143 inline void COpenGLExtensionHandler::extGlPointParameterfv(GLint loc, const GLfloat *v)\r
2144 {\r
2145 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2146         if (pGlPointParameterfvARB)\r
2147                 pGlPointParameterfvARB(loc, v);\r
2148 #elif defined(GL_ARB_point_parameters)\r
2149         glPointParameterfvARB(loc, v);\r
2150 #else\r
2151         os::Printer::log("glPointParameterfv not supported", ELL_ERROR);\r
2152 #endif\r
2153 }\r
2154 \r
2155 inline void COpenGLExtensionHandler::extGlStencilFuncSeparate (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)\r
2156 {\r
2157 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2158         if (pGlStencilFuncSeparate)\r
2159                 pGlStencilFuncSeparate(frontfunc, backfunc, ref, mask);\r
2160         else if (pGlStencilFuncSeparateATI)\r
2161                 pGlStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);\r
2162 #elif defined(GL_VERSION_2_0)\r
2163         glStencilFuncSeparate(frontfunc, backfunc, ref, mask);\r
2164 #elif defined(GL_ATI_separate_stencil)\r
2165         glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);\r
2166 #else\r
2167         os::Printer::log("glStencilFuncSeparate not supported", ELL_ERROR);\r
2168 #endif\r
2169 }\r
2170 \r
2171 inline void COpenGLExtensionHandler::extGlStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)\r
2172 {\r
2173 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2174         if (pGlStencilOpSeparate)\r
2175                 pGlStencilOpSeparate(face, fail, zfail, zpass);\r
2176         else if (pGlStencilOpSeparateATI)\r
2177                 pGlStencilOpSeparateATI(face, fail, zfail, zpass);\r
2178 #elif defined(GL_VERSION_2_0)\r
2179         glStencilOpSeparate(face, fail, zfail, zpass);\r
2180 #elif defined(GL_ATI_separate_stencil)\r
2181         glStencilOpSeparateATI(face, fail, zfail, zpass);\r
2182 #else\r
2183         os::Printer::log("glStencilOpSeparate not supported", ELL_ERROR);\r
2184 #endif\r
2185 }\r
2186 \r
2187 inline void COpenGLExtensionHandler::irrGlCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width,\r
2188                 GLsizei height, GLint border, GLsizei imageSize, const void* data)\r
2189 {\r
2190 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2191         if (pGlCompressedTexImage2D)\r
2192                 pGlCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);\r
2193 #elif defined(GL_ARB_texture_compression)\r
2194         glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);\r
2195 #else\r
2196         os::Printer::log("glCompressedTexImage2D not supported", ELL_ERROR);\r
2197 #endif\r
2198 }\r
2199 \r
2200 inline void COpenGLExtensionHandler::irrGlCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,\r
2201                 GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)\r
2202 {\r
2203 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2204         if (pGlCompressedTexSubImage2D)\r
2205                 pGlCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);\r
2206 #elif defined(GL_ARB_texture_compression)\r
2207         glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);\r
2208 #else\r
2209         os::Printer::log("glCompressedTexSubImage2D not supported", ELL_ERROR);\r
2210 #endif\r
2211 }\r
2212 \r
2213 inline void COpenGLExtensionHandler::irrGlBindFramebuffer(GLenum target, GLuint framebuffer)\r
2214 {\r
2215 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2216         if (pGlBindFramebuffer)\r
2217                 pGlBindFramebuffer(target, framebuffer);\r
2218         else if (pGlBindFramebufferEXT)\r
2219                 pGlBindFramebufferEXT(target, framebuffer);\r
2220 #elif defined(GL_ARB_framebuffer_object)\r
2221         glBindFramebuffer(target, framebuffer);\r
2222 #elif defined(GL_EXT_framebuffer_object)\r
2223         glBindFramebufferEXT(target, framebuffer);\r
2224 #else\r
2225         os::Printer::log("glBindFramebuffer not supported", ELL_ERROR);\r
2226 #endif\r
2227 }\r
2228 \r
2229 inline void COpenGLExtensionHandler::irrGlDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)\r
2230 {\r
2231 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2232         if (pGlDeleteFramebuffers)\r
2233                 pGlDeleteFramebuffers(n, framebuffers);\r
2234         else if (pGlDeleteFramebuffersEXT)\r
2235                 pGlDeleteFramebuffersEXT(n, framebuffers);\r
2236 #elif defined(GL_ARB_framebuffer_object)\r
2237         glDeleteFramebuffers(n, framebuffers);\r
2238 #elif defined(GL_EXT_framebuffer_object)\r
2239         glDeleteFramebuffersEXT(n, framebuffers);\r
2240 #else\r
2241         os::Printer::log("glDeleteFramebuffers not supported", ELL_ERROR);\r
2242 #endif\r
2243 }\r
2244 \r
2245 inline void COpenGLExtensionHandler::irrGlGenFramebuffers(GLsizei n, GLuint *framebuffers)\r
2246 {\r
2247         if (framebuffers)\r
2248                 memset(framebuffers,0,n*sizeof(GLuint));\r
2249 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2250         if (pGlGenFramebuffers)\r
2251                 pGlGenFramebuffers(n, framebuffers);\r
2252         else if (pGlGenFramebuffersEXT)\r
2253                 pGlGenFramebuffersEXT(n, framebuffers);\r
2254 #elif defined(GL_ARB_framebuffer_object)\r
2255         glGenFramebuffers(n, framebuffers);\r
2256 #elif defined(GL_EXT_framebuffer_object)\r
2257         glGenFramebuffersEXT(n, framebuffers);\r
2258 #else\r
2259         os::Printer::log("glGenFramebuffers not supported", ELL_ERROR);\r
2260 #endif\r
2261 }\r
2262 \r
2263 inline GLenum COpenGLExtensionHandler::irrGlCheckFramebufferStatus(GLenum target)\r
2264 {\r
2265 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2266         if (pGlCheckFramebufferStatus)\r
2267                 return pGlCheckFramebufferStatus(target);\r
2268         else if (pGlCheckFramebufferStatusEXT)\r
2269                 return pGlCheckFramebufferStatusEXT(target);\r
2270         else\r
2271                 return 0;\r
2272 #elif defined(GL_ARB_framebuffer_object)\r
2273         return glCheckFramebufferStatus(target);\r
2274 #elif defined(GL_EXT_framebuffer_object)\r
2275         return glCheckFramebufferStatusEXT(target);\r
2276 #else\r
2277         os::Printer::log("glCheckFramebufferStatus not supported", ELL_ERROR);\r
2278         return 0;\r
2279 #endif\r
2280 }\r
2281 \r
2282 inline void COpenGLExtensionHandler::irrGlFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\r
2283 {\r
2284 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2285         if (pGlFramebufferTexture2D)\r
2286                 pGlFramebufferTexture2D(target, attachment, textarget, texture, level);\r
2287         else if (pGlFramebufferTexture2DEXT)\r
2288                 pGlFramebufferTexture2DEXT(target, attachment, textarget, texture, level);\r
2289 #elif defined(GL_ARB_framebuffer_object)\r
2290         glFramebufferTexture2D(target, attachment, textarget, texture, level);\r
2291 #elif defined(GL_EXT_framebuffer_object)\r
2292         glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);\r
2293 #else\r
2294         os::Printer::log("glFramebufferTexture2D not supported", ELL_ERROR);\r
2295 #endif\r
2296 }\r
2297 \r
2298 inline void COpenGLExtensionHandler::irrGlBindRenderbuffer(GLenum target, GLuint renderbuffer)\r
2299 {\r
2300 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2301         if (pGlBindRenderbuffer)\r
2302                 pGlBindRenderbuffer(target, renderbuffer);\r
2303         else if (pGlBindRenderbufferEXT)\r
2304                 pGlBindRenderbufferEXT(target, renderbuffer);\r
2305 #elif defined(GL_ARB_framebuffer_object)\r
2306         glBindRenderbuffer(target, renderbuffer);\r
2307 #elif defined(GL_EXT_framebuffer_object)\r
2308         glBindRenderbufferEXT(target, renderbuffer);\r
2309 #else\r
2310         os::Printer::log("glBindRenderbuffer not supported", ELL_ERROR);\r
2311 #endif\r
2312 }\r
2313 \r
2314 inline void COpenGLExtensionHandler::irrGlDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)\r
2315 {\r
2316 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2317         if (pGlDeleteRenderbuffers)\r
2318                 pGlDeleteRenderbuffers(n, renderbuffers);\r
2319         else if (pGlDeleteRenderbuffersEXT)\r
2320                 pGlDeleteRenderbuffersEXT(n, renderbuffers);\r
2321 #elif defined(GL_ARB_framebuffer_object)\r
2322         glDeleteRenderbuffers(n, renderbuffers);\r
2323 #elif defined(GL_EXT_framebuffer_object)\r
2324         glDeleteRenderbuffersEXT(n, renderbuffers);\r
2325 #else\r
2326         os::Printer::log("glDeleteRenderbuffers not supported", ELL_ERROR);\r
2327 #endif\r
2328 }\r
2329 \r
2330 inline void COpenGLExtensionHandler::irrGlGenRenderbuffers(GLsizei n, GLuint *renderbuffers)\r
2331 {\r
2332         if (renderbuffers)\r
2333                 memset(renderbuffers,0,n*sizeof(GLuint));\r
2334 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2335         if (pGlGenRenderbuffers)\r
2336                 pGlGenRenderbuffers(n, renderbuffers);\r
2337         else if (pGlGenRenderbuffersEXT)\r
2338                 pGlGenRenderbuffersEXT(n, renderbuffers);\r
2339 #elif defined(GL_ARB_framebuffer_object)\r
2340         glGenRenderbuffers(n, renderbuffers);\r
2341 #elif defined(GL_EXT_framebuffer_object)\r
2342         glGenRenderbuffersEXT(n, renderbuffers);\r
2343 #else\r
2344         os::Printer::log("glGenRenderbuffers not supported", ELL_ERROR);\r
2345 #endif\r
2346 }\r
2347 \r
2348 inline void COpenGLExtensionHandler::irrGlRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)\r
2349 {\r
2350 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2351         if (pGlRenderbufferStorage)\r
2352                 pGlRenderbufferStorage(target, internalformat, width, height);\r
2353         else if (pGlRenderbufferStorageEXT)\r
2354                 pGlRenderbufferStorageEXT(target, internalformat, width, height);\r
2355 #elif defined(GL_ARB_framebuffer_object)\r
2356         glRenderbufferStorage(target, internalformat, width, height);\r
2357 #elif defined(GL_EXT_framebuffer_object)\r
2358         glRenderbufferStorageEXT(target, internalformat, width, height);\r
2359 #else\r
2360         os::Printer::log("glRenderbufferStorage not supported", ELL_ERROR);\r
2361 #endif\r
2362 }\r
2363 \r
2364 inline void COpenGLExtensionHandler::irrGlFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\r
2365 {\r
2366 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2367         if (pGlFramebufferRenderbuffer)\r
2368                 pGlFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);\r
2369         else if (pGlFramebufferRenderbufferEXT)\r
2370                 pGlFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);\r
2371 #elif defined(GL_ARB_framebuffer_object)\r
2372         glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);\r
2373 #elif defined(GL_EXT_framebuffer_object)\r
2374         glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);\r
2375 #else\r
2376         os::Printer::log("glFramebufferRenderbuffer not supported", ELL_ERROR);\r
2377 #endif\r
2378 }\r
2379 \r
2380 inline void COpenGLExtensionHandler::irrGlGenerateMipmap(GLenum target)\r
2381 {\r
2382 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2383         if (pGlGenerateMipmap)\r
2384                 pGlGenerateMipmap(target);\r
2385         else if (pGlGenerateMipmapEXT)\r
2386                 pGlGenerateMipmapEXT(target);\r
2387 #elif defined(GL_ARB_framebuffer_object)\r
2388         glGenerateMipmap(target);\r
2389 #elif defined(GL_EXT_framebuffer_object)\r
2390         glGenerateMipmapEXT(target);\r
2391 #else\r
2392         os::Printer::log("glGenerateMipmap not supported", ELL_ERROR);\r
2393 #endif\r
2394 }\r
2395 \r
2396 inline void COpenGLExtensionHandler::irrGlActiveStencilFace(GLenum face)\r
2397 {\r
2398 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2399         if (pGlActiveStencilFaceEXT)\r
2400                 pGlActiveStencilFaceEXT(face);\r
2401 #elif defined(GL_EXT_stencil_two_side)\r
2402         glActiveStencilFaceEXT(face);\r
2403 #else\r
2404         os::Printer::log("glActiveStencilFace not supported", ELL_ERROR);\r
2405 #endif\r
2406 }\r
2407 \r
2408 inline void COpenGLExtensionHandler::irrGlDrawBuffer(GLenum mode)\r
2409 {\r
2410         glDrawBuffer(mode);\r
2411 }\r
2412 \r
2413 inline void COpenGLExtensionHandler::irrGlDrawBuffers(GLsizei n, const GLenum *bufs)\r
2414 {\r
2415 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2416         if (pGlDrawBuffersARB)\r
2417                 pGlDrawBuffersARB(n, bufs);\r
2418         else if (pGlDrawBuffersATI)\r
2419                 pGlDrawBuffersATI(n, bufs);\r
2420 #elif defined(GL_ARB_draw_buffers)\r
2421         glDrawBuffersARB(n, bufs);\r
2422 #elif defined(GL_ATI_draw_buffers)\r
2423         glDrawBuffersATI(n, bufs);\r
2424 #else\r
2425         os::Printer::log("glDrawBuffers not supported", ELL_ERROR);\r
2426 #endif\r
2427 }\r
2428 \r
2429 \r
2430 inline void COpenGLExtensionHandler::extGlGenBuffers(GLsizei n, GLuint *buffers)\r
2431 {\r
2432         if (buffers)\r
2433                 memset(buffers,0,n*sizeof(GLuint));\r
2434 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2435         if (pGlGenBuffersARB)\r
2436                 pGlGenBuffersARB(n, buffers);\r
2437 #elif defined(GL_ARB_vertex_buffer_object)\r
2438         glGenBuffers(n, buffers);\r
2439 #else\r
2440         os::Printer::log("glGenBuffers not supported", ELL_ERROR);\r
2441 #endif\r
2442 }\r
2443 \r
2444 inline void COpenGLExtensionHandler::extGlBindBuffer(GLenum target, GLuint buffer)\r
2445 {\r
2446 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2447         if (pGlBindBufferARB)\r
2448                 pGlBindBufferARB(target, buffer);\r
2449 #elif defined(GL_ARB_vertex_buffer_object)\r
2450         glBindBuffer(target, buffer);\r
2451 #else\r
2452         os::Printer::log("glBindBuffer not supported", ELL_ERROR);\r
2453 #endif\r
2454 }\r
2455 \r
2456 inline void COpenGLExtensionHandler::extGlBufferData(GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage)\r
2457 {\r
2458 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2459         if (pGlBufferDataARB)\r
2460                 pGlBufferDataARB(target, size, data, usage);\r
2461 #elif defined(GL_ARB_vertex_buffer_object)\r
2462         glBufferData(target, size, data, usage);\r
2463 #else\r
2464         os::Printer::log("glBufferData not supported", ELL_ERROR);\r
2465 #endif\r
2466 }\r
2467 \r
2468 inline void COpenGLExtensionHandler::extGlDeleteBuffers(GLsizei n, const GLuint *buffers)\r
2469 {\r
2470 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2471         if (pGlDeleteBuffersARB)\r
2472                 pGlDeleteBuffersARB(n, buffers);\r
2473 #elif defined(GL_ARB_vertex_buffer_object)\r
2474         glDeleteBuffers(n, buffers);\r
2475 #else\r
2476         os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);\r
2477 #endif\r
2478 }\r
2479 \r
2480 inline void COpenGLExtensionHandler::extGlBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data)\r
2481 {\r
2482 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2483         if (pGlBufferSubDataARB)\r
2484                 pGlBufferSubDataARB(target, offset, size, data);\r
2485 #elif defined(GL_ARB_vertex_buffer_object)\r
2486         glBufferSubData(target, offset, size, data);\r
2487 #else\r
2488         os::Printer::log("glBufferSubData not supported", ELL_ERROR);\r
2489 #endif\r
2490 }\r
2491 \r
2492 inline void COpenGLExtensionHandler::extGlGetBufferSubData(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data)\r
2493 {\r
2494 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2495         if (pGlGetBufferSubDataARB)\r
2496                 pGlGetBufferSubDataARB(target, offset, size, data);\r
2497 #elif defined(GL_ARB_vertex_buffer_object)\r
2498         glGetBufferSubData(target, offset, size, data);\r
2499 #else\r
2500         os::Printer::log("glGetBufferSubData not supported", ELL_ERROR);\r
2501 #endif\r
2502 }\r
2503 \r
2504 inline void *COpenGLExtensionHandler::extGlMapBuffer(GLenum target, GLenum access)\r
2505 {\r
2506 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2507         if (pGlMapBufferARB)\r
2508                 return pGlMapBufferARB(target, access);\r
2509         return 0;\r
2510 #elif defined(GL_ARB_vertex_buffer_object)\r
2511         return glMapBuffer(target, access);\r
2512 #else\r
2513         os::Printer::log("glMapBuffer not supported", ELL_ERROR);\r
2514         return 0;\r
2515 #endif\r
2516 }\r
2517 \r
2518 inline GLboolean COpenGLExtensionHandler::extGlUnmapBuffer(GLenum target)\r
2519 {\r
2520 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2521         if (pGlUnmapBufferARB)\r
2522                 return pGlUnmapBufferARB(target);\r
2523         return false;\r
2524 #elif defined(GL_ARB_vertex_buffer_object)\r
2525         return glUnmapBuffer(target);\r
2526 #else\r
2527         os::Printer::log("glUnmapBuffer not supported", ELL_ERROR);\r
2528         return false;\r
2529 #endif\r
2530 }\r
2531 \r
2532 inline GLboolean COpenGLExtensionHandler::extGlIsBuffer(GLuint buffer)\r
2533 {\r
2534 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2535         if (pGlIsBufferARB)\r
2536                 return pGlIsBufferARB(buffer);\r
2537         return false;\r
2538 #elif defined(GL_ARB_vertex_buffer_object)\r
2539         return glIsBuffer(buffer);\r
2540 #else\r
2541         os::Printer::log("glDeleteBuffers not supported", ELL_ERROR);\r
2542         return false;\r
2543 #endif\r
2544 }\r
2545 \r
2546 inline void COpenGLExtensionHandler::extGlGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)\r
2547 {\r
2548 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2549         if (pGlGetBufferParameterivARB)\r
2550                 pGlGetBufferParameterivARB(target, pname, params);\r
2551 #elif defined(GL_ARB_vertex_buffer_object)\r
2552         glGetBufferParameteriv(target, pname, params);\r
2553 #else\r
2554         os::Printer::log("glGetBufferParameteriv not supported", ELL_ERROR);\r
2555 #endif\r
2556 }\r
2557 \r
2558 inline void COpenGLExtensionHandler::extGlGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)\r
2559 {\r
2560 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2561         if (pGlGetBufferPointervARB)\r
2562                 pGlGetBufferPointervARB(target, pname, params);\r
2563 #elif defined(GL_ARB_vertex_buffer_object)\r
2564         glGetBufferPointerv(target, pname, params);\r
2565 #else\r
2566         os::Printer::log("glGetBufferPointerv not supported", ELL_ERROR);\r
2567 #endif\r
2568 }\r
2569 \r
2570 \r
2571 inline void COpenGLExtensionHandler::extGlProvokingVertex(GLenum mode)\r
2572 {\r
2573 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2574         if (FeatureAvailable[IRR_ARB_provoking_vertex] && pGlProvokingVertexARB)\r
2575                 pGlProvokingVertexARB(mode);\r
2576         else if (FeatureAvailable[IRR_EXT_provoking_vertex] && pGlProvokingVertexEXT)\r
2577                 pGlProvokingVertexEXT(mode);\r
2578 #elif defined(GL_ARB_provoking_vertex)\r
2579         glProvokingVertex(mode);\r
2580 #elif defined(GL_EXT_provoking_vertex)\r
2581         glProvokingVertexEXT(mode);\r
2582 #else\r
2583         os::Printer::log("glProvokingVertex not supported", ELL_ERROR);\r
2584 #endif\r
2585 }\r
2586 \r
2587 inline void COpenGLExtensionHandler::extGlProgramParameteri(GLuint program, GLenum pname, GLint value)\r
2588 {\r
2589 #if defined(_IRR_OPENGL_USE_EXTPOINTER_)\r
2590         if (queryFeature(EVDF_GEOMETRY_SHADER))\r
2591         {\r
2592                 if (pGlProgramParameteriARB)\r
2593                         pGlProgramParameteriARB(program, pname, value);\r
2594                 else if (pGlProgramParameteriEXT)\r
2595                         pGlProgramParameteriEXT(program, pname, value);\r
2596         }\r
2597 #elif defined(GL_ARB_geometry_shader4)\r
2598         glProgramParameteriARB(program, pname, value);\r
2599 #elif defined(GL_EXT_geometry_shader4)\r
2600         glProgramParameteriEXT(program, pname, value);\r
2601 #elif defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4)\r
2602         glProgramParameteriNV(program, pname, value);\r
2603 #else\r
2604         os::Printer::log("glProgramParameteri not supported", ELL_ERROR);\r
2605 #endif\r
2606 }\r
2607 \r
2608 inline void COpenGLExtensionHandler::extGlGenQueries(GLsizei n, GLuint *ids)\r
2609 {\r
2610 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2611         if (pGlGenQueriesARB)\r
2612                 pGlGenQueriesARB(n, ids);\r
2613         else if (pGlGenOcclusionQueriesNV)\r
2614                 pGlGenOcclusionQueriesNV(n, ids);\r
2615 #elif defined(GL_ARB_occlusion_query)\r
2616         glGenQueriesARB(n, ids);\r
2617 #elif defined(GL_NV_occlusion_query)\r
2618         glGenOcclusionQueriesNV(n, ids);\r
2619 #else\r
2620         os::Printer::log("glGenQueries not supported", ELL_ERROR);\r
2621 #endif\r
2622 }\r
2623 \r
2624 inline void COpenGLExtensionHandler::extGlDeleteQueries(GLsizei n, const GLuint *ids)\r
2625 {\r
2626 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2627         if (pGlDeleteQueriesARB)\r
2628                 pGlDeleteQueriesARB(n, ids);\r
2629         else if (pGlDeleteOcclusionQueriesNV)\r
2630                 pGlDeleteOcclusionQueriesNV(n, ids);\r
2631 #elif defined(GL_ARB_occlusion_query)\r
2632         glDeleteQueriesARB(n, ids);\r
2633 #elif defined(GL_NV_occlusion_query)\r
2634         glDeleteOcclusionQueriesNV(n, ids);\r
2635 #else\r
2636         os::Printer::log("glDeleteQueries not supported", ELL_ERROR);\r
2637 #endif\r
2638 }\r
2639 \r
2640 inline GLboolean COpenGLExtensionHandler::extGlIsQuery(GLuint id)\r
2641 {\r
2642 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2643         if (pGlIsQueryARB)\r
2644                 return pGlIsQueryARB(id);\r
2645         else if (pGlIsOcclusionQueryNV)\r
2646                 return pGlIsOcclusionQueryNV(id);\r
2647         return false;\r
2648 #elif defined(GL_ARB_occlusion_query)\r
2649         return glIsQueryARB(id);\r
2650 #elif defined(GL_NV_occlusion_query)\r
2651         return glIsOcclusionQueryNV(id);\r
2652 #else\r
2653         return false;\r
2654 #endif\r
2655 }\r
2656 \r
2657 inline void COpenGLExtensionHandler::extGlBeginQuery(GLenum target, GLuint id)\r
2658 {\r
2659 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2660         if (pGlBeginQueryARB)\r
2661                 pGlBeginQueryARB(target, id);\r
2662         else if (pGlBeginOcclusionQueryNV)\r
2663                 pGlBeginOcclusionQueryNV(id);\r
2664 #elif defined(GL_ARB_occlusion_query)\r
2665         glBeginQueryARB(target, id);\r
2666 #elif defined(GL_NV_occlusion_query)\r
2667         glBeginOcclusionQueryNV(id);\r
2668 #else\r
2669         os::Printer::log("glBeginQuery not supported", ELL_ERROR);\r
2670 #endif\r
2671 }\r
2672 \r
2673 inline void COpenGLExtensionHandler::extGlEndQuery(GLenum target)\r
2674 {\r
2675 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2676         if (pGlEndQueryARB)\r
2677                 pGlEndQueryARB(target);\r
2678         else if (pGlEndOcclusionQueryNV)\r
2679                 pGlEndOcclusionQueryNV();\r
2680 #elif defined(GL_ARB_occlusion_query)\r
2681         glEndQueryARB(target);\r
2682 #elif defined(GL_NV_occlusion_query)\r
2683         glEndOcclusionQueryNV();\r
2684 #else\r
2685         os::Printer::log("glEndQuery not supported", ELL_ERROR);\r
2686 #endif\r
2687 }\r
2688 \r
2689 inline void COpenGLExtensionHandler::extGlGetQueryiv(GLenum target, GLenum pname, GLint *params)\r
2690 {\r
2691 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2692         if (pGlGetQueryivARB)\r
2693                 pGlGetQueryivARB(target, pname, params);\r
2694 #elif defined(GL_ARB_occlusion_query)\r
2695         glGetQueryivARB(target, pname, params);\r
2696 #else\r
2697         os::Printer::log("glGetQueryivARB not supported", ELL_ERROR);\r
2698 #endif\r
2699 }\r
2700 \r
2701 inline void COpenGLExtensionHandler::extGlGetQueryObjectiv(GLuint id, GLenum pname, GLint *params)\r
2702 {\r
2703 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2704         if (pGlGetQueryObjectivARB)\r
2705                 pGlGetQueryObjectivARB(id, pname, params);\r
2706         else if (pGlGetOcclusionQueryivNV)\r
2707                 pGlGetOcclusionQueryivNV(id, pname, params);\r
2708 #elif defined(GL_ARB_occlusion_query)\r
2709         glGetQueryObjectivARB(id, pname, params);\r
2710 #elif defined(GL_NV_occlusion_query)\r
2711         glGetOcclusionQueryivNV(id, pname, params);\r
2712 #else\r
2713         os::Printer::log("glGetQueryObjectiv not supported", ELL_ERROR);\r
2714 #endif\r
2715 }\r
2716 \r
2717 inline void COpenGLExtensionHandler::extGlGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)\r
2718 {\r
2719 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2720         if (pGlGetQueryObjectuivARB)\r
2721                 pGlGetQueryObjectuivARB(id, pname, params);\r
2722         else if (pGlGetOcclusionQueryuivNV)\r
2723                 pGlGetOcclusionQueryuivNV(id, pname, params);\r
2724 #elif defined(GL_ARB_occlusion_query)\r
2725         glGetQueryObjectuivARB(id, pname, params);\r
2726 #elif defined(GL_NV_occlusion_query)\r
2727         glGetOcclusionQueryuivNV(id, pname, params);\r
2728 #else\r
2729         os::Printer::log("glGetQueryObjectuiv not supported", ELL_ERROR);\r
2730 #endif\r
2731 }\r
2732 \r
2733 inline void COpenGLExtensionHandler::irrGlBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)\r
2734 {\r
2735 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2736         if (pGlBlendFuncSeparate)\r
2737                 pGlBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);\r
2738         else if (pGlBlendFuncSeparateEXT)\r
2739                 pGlBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);\r
2740 #elif defined(GL_VERSION_1_4)\r
2741         glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);\r
2742 #elif defined(GL_EXT_blend_func_separate)\r
2743         glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);\r
2744 #else\r
2745         os::Printer::log("glBlendFuncSeparate not supported", ELL_ERROR);\r
2746 #endif\r
2747 }\r
2748 \r
2749 inline void COpenGLExtensionHandler::irrGlBlendEquation(GLenum mode)\r
2750 {\r
2751 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2752         if (pGlBlendEquation)\r
2753                 pGlBlendEquation(mode);\r
2754         else if (pGlBlendEquationEXT)\r
2755                 pGlBlendEquationEXT(mode);\r
2756 #elif defined(GL_VERSION_1_4)\r
2757         glBlendEquation(mode);\r
2758 #elif defined(GL_EXT_blend_minmax)\r
2759         glBlendEquationEXT(mode);\r
2760 #else\r
2761         os::Printer::log("glBlendEquation not supported", ELL_ERROR);\r
2762 #endif\r
2763 }\r
2764 \r
2765 inline void COpenGLExtensionHandler::irrGlEnableIndexed(GLenum target, GLuint index)\r
2766 {\r
2767 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2768         if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlEnableIndexedEXT)\r
2769                 pGlEnableIndexedEXT(target, index);\r
2770 #elif defined(GL_EXT_draw_buffers2)\r
2771         glEnableIndexedEXT(target, index);\r
2772 #else\r
2773         os::Printer::log("glEnableIndexed not supported", ELL_ERROR);\r
2774 #endif\r
2775 }\r
2776 \r
2777 inline void COpenGLExtensionHandler::irrGlDisableIndexed(GLenum target, GLuint index)\r
2778 {\r
2779 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2780         if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlDisableIndexedEXT)\r
2781                 pGlDisableIndexedEXT(target, index);\r
2782 #elif defined(GL_EXT_draw_buffers2)\r
2783         glDisableIndexedEXT(target, index);\r
2784 #else\r
2785         os::Printer::log("glDisableIndexed not supported", ELL_ERROR);\r
2786 #endif\r
2787 }\r
2788 \r
2789 inline void COpenGLExtensionHandler::irrGlColorMaskIndexed(GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a)\r
2790 {\r
2791 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2792         if (FeatureAvailable[IRR_EXT_draw_buffers2] && pGlColorMaskIndexedEXT)\r
2793                 pGlColorMaskIndexedEXT(buf, r, g, b, a);\r
2794 #elif defined(GL_EXT_draw_buffers2)\r
2795         glColorMaskIndexedEXT(buf, r, g, b, a);\r
2796 #else\r
2797         os::Printer::log("glColorMaskIndexed not supported", ELL_ERROR);\r
2798 #endif\r
2799 }\r
2800 \r
2801 inline void COpenGLExtensionHandler::irrGlBlendFuncIndexed(GLuint buf, GLenum src, GLenum dst)\r
2802 {\r
2803 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2804         if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendFunciARB)\r
2805                 pGlBlendFunciARB(buf, src, dst);\r
2806         else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendFuncIndexedAMD)\r
2807                 pGlBlendFuncIndexedAMD(buf, src, dst);\r
2808 #elif defined(GL_ARB_draw_buffers_blend)\r
2809         glBlendFunciARB(buf, src, dst);\r
2810 #elif defined(GL_AMD_draw_buffers_blend)\r
2811         glBlendFuncIndexedAMD(buf, src, dst);\r
2812 #else\r
2813         os::Printer::log("glBlendFuncIndexed not supported", ELL_ERROR);\r
2814 #endif\r
2815 }\r
2816 \r
2817 inline void COpenGLExtensionHandler::irrGlBlendFuncSeparateIndexed(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)\r
2818 {\r
2819 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2820         if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendFuncSeparateiARB)\r
2821                 pGlBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);\r
2822         else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendFuncSeparateIndexedAMD)\r
2823                 pGlBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);\r
2824 #elif defined(GL_ARB_draw_buffers_blend)\r
2825         glBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);\r
2826 #elif defined(GL_AMD_draw_buffers_blend)\r
2827         glBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);\r
2828 #else\r
2829         os::Printer::log("glBlendFuncSeparateIndexed not supported", ELL_ERROR);\r
2830 #endif\r
2831 }\r
2832 \r
2833 inline void COpenGLExtensionHandler::irrGlBlendEquationIndexed(GLuint buf, GLenum mode)\r
2834 {\r
2835 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2836         if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendEquationiARB)\r
2837                 pGlBlendEquationiARB(buf, mode);\r
2838         else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendEquationIndexedAMD)\r
2839                 pGlBlendEquationIndexedAMD(buf, mode);\r
2840 #elif defined(GL_ARB_draw_buffers_blend)\r
2841         glBlendEquationiARB(buf, mode);\r
2842 #elif defined(GL_AMD_draw_buffers_blend)\r
2843         glBlendEquationIndexedAMD(buf, mode);\r
2844 #else\r
2845         os::Printer::log("glBlendEquationIndexed not supported", ELL_ERROR);\r
2846 #endif\r
2847 }\r
2848 \r
2849 inline void COpenGLExtensionHandler::irrGlBlendEquationSeparateIndexed(GLuint buf, GLenum modeRGB, GLenum modeAlpha)\r
2850 {\r
2851 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2852         if (FeatureAvailable[IRR_ARB_draw_buffers_blend] && pGlBlendEquationSeparateiARB)\r
2853                 pGlBlendEquationSeparateiARB(buf, modeRGB, modeAlpha);\r
2854         else if (FeatureAvailable[IRR_AMD_draw_buffers_blend] && pGlBlendEquationSeparateIndexedAMD)\r
2855                 pGlBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha);\r
2856 #elif defined(GL_ARB_draw_buffers_blend)\r
2857         glBlendEquationSeparateiARB(buf, modeRGB, modeAlpha);\r
2858 #elif defined(GL_AMD_draw_buffers_blend)\r
2859         glBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha);\r
2860 #else\r
2861         os::Printer::log("glBlendEquationSeparateIndexed not supported", ELL_ERROR);\r
2862 #endif\r
2863 }\r
2864 \r
2865 inline void COpenGLExtensionHandler::extGlTextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)\r
2866 {\r
2867     if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
2868     {\r
2869 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2870         if (pGlTextureSubImage2D)\r
2871             pGlTextureSubImage2D(texture, level, xoffset, yoffset,width, height,format, type, pixels);\r
2872 #elif defined(GL_VERSION_4_5)\r
2873         glTextureSubImage2D(texture, level, xoffset, yoffset,width, height,format, type, pixels);\r
2874 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2875     }\r
2876     else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
2877     {\r
2878 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2879         if (pGlTextureSubImage2DEXT)\r
2880             pGlTextureSubImage2DEXT(texture, target, level, xoffset, yoffset,width, height,format, type, pixels);\r
2881 #elif defined(GL_EXT_direct_state_access)\r
2882         glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset,width, height,format, type, pixels);\r
2883 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2884     }\r
2885     else\r
2886     {\r
2887         GLint bound;\r
2888         switch (target)\r
2889         {\r
2890 #ifdef GL_VERSION_3_0\r
2891             case GL_TEXTURE_1D_ARRAY:\r
2892                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY, &bound);\r
2893                 break;\r
2894 #elif GL_EXT_texture_array\r
2895                         case GL_TEXTURE_1D_ARRAY_EXT:\r
2896                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY_EXT, &bound);\r
2897                 break;\r
2898 #endif\r
2899             case GL_TEXTURE_2D:\r
2900                 glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound);\r
2901                 break;\r
2902 #ifdef GL_VERSION_3_2\r
2903             case GL_TEXTURE_2D_MULTISAMPLE:\r
2904                 glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE, &bound);\r
2905                 break;\r
2906 #endif\r
2907             case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:\r
2908             case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:\r
2909             case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:\r
2910             case GL_TEXTURE_CUBE_MAP_POSITIVE_X:\r
2911             case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:\r
2912             case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:\r
2913                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &bound);\r
2914                 break;\r
2915 #ifdef GL_VERSION_3_1\r
2916             case GL_TEXTURE_RECTANGLE:\r
2917                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE, &bound);\r
2918                 break;\r
2919 #elif defined(GL_ARB_texture_rectangle)\r
2920                         case GL_TEXTURE_RECTANGLE_ARB:\r
2921                                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &bound);\r
2922                 break;\r
2923 #endif\r
2924             default:\r
2925                 return;\r
2926         }\r
2927         glBindTexture(target, texture);\r
2928         glTexSubImage2D(target, level, xoffset, yoffset,width, height,format, type, pixels);\r
2929         glBindTexture(target, bound);\r
2930     }\r
2931 }\r
2932 \r
2933 inline void COpenGLExtensionHandler::extGlTextureStorage2D(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)\r
2934 {\r
2935     if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
2936     {\r
2937 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2938         if (pGlTextureStorage2D)\r
2939             pGlTextureStorage2D(texture,levels,internalformat,width,height);\r
2940 #elif defined(GL_VERSION_4_5)\r
2941         glTextureStorage2D(texture,levels,internalformat,width,height);\r
2942 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2943     }\r
2944     else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
2945     {\r
2946 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2947         if (pGlTextureStorage2DEXT)\r
2948             pGlTextureStorage2DEXT(texture,target,levels,internalformat,width,height);\r
2949 #elif defined(GL_EXT_direct_state_access)\r
2950         glTextureStorage2DEXT(texture,target,levels,internalformat,width,height);\r
2951 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2952     }\r
2953 \r
2954 #if defined(GL_VERSION_4_2) || defined(_IRR_OPENGL_USE_EXTPOINTER_)\r
2955     else\r
2956 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2957     if (pGlTexStorage2D)\r
2958 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2959     {\r
2960         GLint bound;\r
2961         switch (target)\r
2962         {\r
2963 #ifdef GL_VERSION_3_0\r
2964             case GL_TEXTURE_1D_ARRAY:\r
2965                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY, &bound);\r
2966                 break;\r
2967 #elif GL_EXT_texture_array\r
2968                         case GL_TEXTURE_1D_ARRAY_EXT:\r
2969                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY_EXT, &bound);\r
2970                 break;\r
2971 #endif\r
2972             case GL_TEXTURE_2D:\r
2973                 glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound);\r
2974                 break;\r
2975             case GL_TEXTURE_CUBE_MAP:\r
2976                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &bound);\r
2977                 break;\r
2978 #ifdef GL_VERSION_3_1\r
2979             case GL_TEXTURE_RECTANGLE:\r
2980                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE, &bound);\r
2981                 break;\r
2982 #elif defined(GL_ARB_texture_rectangle)\r
2983                         case GL_TEXTURE_RECTANGLE_ARB:\r
2984                                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &bound);\r
2985                 break;\r
2986 #endif\r
2987             default:\r
2988                 return;\r
2989         }\r
2990         glBindTexture(target, texture);\r
2991 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
2992         pGlTexStorage2D(target,levels,internalformat,width,height);\r
2993 #else\r
2994         glTexStorage2D(target,levels,internalformat,width,height);\r
2995 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
2996         glBindTexture(target, bound);\r
2997     }\r
2998 #endif // GL_VERSION_4_2 || _IRR_OPENGL_USE_EXTPOINTER_\r
2999 }\r
3000 \r
3001 inline void COpenGLExtensionHandler::extGlTextureStorage3D(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)\r
3002 {\r
3003     if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
3004     {\r
3005 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3006         if (pGlTextureStorage3D)\r
3007             pGlTextureStorage3D(texture,levels,internalformat,width,height,depth);\r
3008 #elif defined(GL_VERSION_4_5)\r
3009         glTextureStorage3D(texture,levels,internalformat,width,height,depth);\r
3010 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3011     }\r
3012     else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
3013     {\r
3014 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3015         if (pGlTextureStorage3DEXT)\r
3016             pGlTextureStorage3DEXT(texture,target,levels,internalformat,width,height,depth);\r
3017 #elif defined(GL_EXT_direct_state_access)\r
3018         glTextureStorage3DEXT(texture,target,levels,internalformat,width,height,depth);\r
3019 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3020     }\r
3021 #if defined(GL_VERSION_4_2) || defined(_IRR_OPENGL_USE_EXTPOINTER_)\r
3022     else\r
3023 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3024     if (pGlTexStorage3D)\r
3025 #endif // _IRR_OPENGL_USE_EX TPOINTER_\r
3026     {\r
3027         GLint bound;\r
3028         switch (target)\r
3029         {\r
3030 #ifdef GL_VERSION_3_0\r
3031             case GL_TEXTURE_2D_ARRAY:\r
3032                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY, &bound);\r
3033                 break;\r
3034 #elif GL_EXT_texture_array\r
3035                         case GL_TEXTURE_2D_ARRAY_EXT:\r
3036                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY_EXT, &bound);\r
3037                 break;\r
3038 #endif\r
3039             case GL_TEXTURE_3D:\r
3040                 glGetIntegerv(GL_TEXTURE_BINDING_3D, &bound);\r
3041                 break;\r
3042 #ifdef GL_VERSION_4_0\r
3043             case GL_TEXTURE_CUBE_MAP_ARRAY:\r
3044                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY, &bound);\r
3045                 break;\r
3046 #elif defined(GL_ARB_texture_cube_map_array)\r
3047                         case GL_TEXTURE_CUBE_MAP_ARRAY_ARB:\r
3048                                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB, &bound);\r
3049                                 break;\r
3050 #endif\r
3051             default:\r
3052                 return;\r
3053         }\r
3054         glBindTexture(target, texture);\r
3055 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3056         pGlTexStorage3D(target,levels,internalformat,width,height,depth);\r
3057 #else\r
3058         glTexStorage3D(target,levels,internalformat,width,height,depth);\r
3059 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3060         glBindTexture(target, bound);\r
3061     }\r
3062 #endif // GL_VERSION_4_2 || _IRR_OPENGL_USE_EXTPOINTER_\r
3063 }\r
3064 \r
3065 inline void COpenGLExtensionHandler::extGlGetTextureImage(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels)\r
3066 {\r
3067         if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
3068         {\r
3069 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3070                 if (pGlGetTextureImage)\r
3071                         pGlGetTextureImage(texture,level,format,type,bufSize,pixels);\r
3072 #elif defined(GL_VERSION_4_5)\r
3073                 glGetTextureImage(texture,level,format,type,bufSize,pixels);\r
3074 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3075         }\r
3076         else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
3077         {\r
3078 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3079                 if (pGlGetTextureImageEXT)\r
3080                         pGlGetTextureImageEXT(texture,target,level,format,type,pixels);\r
3081 #elif defined(GL_EXT_direct_state_access)\r
3082                 glGetTextureImageEXT(texture,target,level,format,type,pixels);\r
3083 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3084         }\r
3085         else\r
3086         {\r
3087                 GLint bound;\r
3088                 switch (target)\r
3089                 {\r
3090 #ifdef GL_VERSION_3_0\r
3091                         case GL_TEXTURE_2D_ARRAY:\r
3092                                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY, &bound);\r
3093                                 break;\r
3094 #elif GL_EXT_texture_array\r
3095                         case GL_TEXTURE_2D_ARRAY_EXT:\r
3096                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY_EXT, &bound);\r
3097                 break;\r
3098 #endif\r
3099                         case GL_TEXTURE_3D:\r
3100                                 glGetIntegerv(GL_TEXTURE_BINDING_3D, &bound);\r
3101                                 break;\r
3102 #ifdef GL_VERSION_4_0\r
3103                         case GL_TEXTURE_CUBE_MAP_ARRAY:\r
3104                                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY, &bound);\r
3105                                 break;\r
3106 #elif defined(GL_ARB_texture_cube_map_array)\r
3107                         case GL_TEXTURE_CUBE_MAP_ARRAY_ARB:\r
3108                                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB, &bound);\r
3109                                 break;\r
3110 #endif\r
3111                         default:\r
3112                                 return;\r
3113                 }\r
3114                 glBindTexture(target, texture);\r
3115                 glGetTexImage(target,level,format,type,pixels);\r
3116                 glBindTexture(target, bound);\r
3117         }\r
3118 }\r
3119 \r
3120 inline void COpenGLExtensionHandler::extGlNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)\r
3121 {\r
3122 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3123     if (!needsDSAFramebufferHack)\r
3124     {\r
3125         if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
3126         {\r
3127             pGlNamedFramebufferTexture(framebuffer, attachment, texture, level);\r
3128             return;\r
3129         }\r
3130         else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
3131         {\r
3132             pGlNamedFramebufferTextureEXT(framebuffer, attachment, texture, level);\r
3133             return;\r
3134         }\r
3135     }\r
3136 \r
3137     GLuint bound;\r
3138     glGetIntegerv(GL_FRAMEBUFFER_BINDING,reinterpret_cast<GLint*>(&bound));\r
3139 \r
3140     if (bound!=framebuffer)\r
3141         pGlBindFramebuffer(GL_FRAMEBUFFER,framebuffer);\r
3142     pGlFramebufferTexture(GL_FRAMEBUFFER,attachment,texture,level);\r
3143     if (bound!=framebuffer)\r
3144         pGlBindFramebuffer(GL_FRAMEBUFFER,bound);\r
3145 #endif\r
3146 }\r
3147 \r
3148 inline void COpenGLExtensionHandler::extGlTextureParameteri(GLuint texture, GLenum pname, GLint param)\r
3149 {\r
3150 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3151     if (pGlTextureParameteri)\r
3152         pGlTextureParameteri(texture, pname, param);\r
3153 #endif//_IRR_OPENGL_USE_EXTPOINTER_\r
3154 }\r
3155 \r
3156 inline void COpenGLExtensionHandler::extGlTextureParameterf(GLuint texture, GLenum pname, GLfloat param)\r
3157 {\r
3158 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3159         if (pGlTextureParameterf)\r
3160                 pGlTextureParameterf(texture, pname, param);\r
3161 #endif//_IRR_OPENGL_USE_EXTPOINTER_\r
3162 }\r
3163 \r
3164 inline void COpenGLExtensionHandler::extGlTextureParameteriv(GLuint texture, GLenum pname, const GLint* params)\r
3165 {\r
3166 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3167         if (pGlTextureParameteriv)\r
3168                 pGlTextureParameteriv(texture, pname, params);\r
3169 #endif//_IRR_OPENGL_USE_EXTPOINTER_\r
3170 }\r
3171 \r
3172 inline void COpenGLExtensionHandler::extGlTextureParameterfv(GLuint texture, GLenum pname, const GLfloat* params)\r
3173 {\r
3174 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3175         if (pGlTextureParameterfv)\r
3176                 pGlTextureParameterfv(texture, pname, params);\r
3177 #endif//_IRR_OPENGL_USE_EXTPOINTER_\r
3178 }\r
3179 \r
3180 inline void COpenGLExtensionHandler::extGlCreateTextures(GLenum target, GLsizei n, GLuint* textures)\r
3181 {\r
3182     if (Version>=405)\r
3183     {\r
3184 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3185         if (pGlCreateTextures)\r
3186             pGlCreateTextures(target,n,textures);\r
3187         else if (textures)\r
3188             memset(textures,0,n*sizeof(GLuint));\r
3189 #elif defined(GL_VERSION_4_5)\r
3190         glCreateTextures(target,n,textures);\r
3191 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3192     }\r
3193     else\r
3194     {\r
3195         glGenTextures(n,textures);\r
3196     }\r
3197 }\r
3198 \r
3199 inline void COpenGLExtensionHandler::extGlCreateFramebuffers(GLsizei n, GLuint* framebuffers)\r
3200 {\r
3201 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3202     if (!needsDSAFramebufferHack)\r
3203     {\r
3204         if (Version>=405)\r
3205         {\r
3206             pGlCreateFramebuffers(n, framebuffers);\r
3207             return;\r
3208         }\r
3209     }\r
3210 \r
3211     pGlGenFramebuffers(n, framebuffers);\r
3212 #endif\r
3213 }\r
3214 \r
3215 inline void COpenGLExtensionHandler::extGlBindTextures(GLuint first, GLsizei count, const GLuint *textures, const GLenum* targets)\r
3216 {\r
3217     const GLenum supportedTargets[] = { GL_TEXTURE_1D, GL_TEXTURE_2D // GL 1.x\r
3218                                         ,GL_TEXTURE_3D  // GL 2.x\r
3219 #ifdef GL_VERSION_3_1\r
3220                                         ,GL_TEXTURE_RECTANGLE\r
3221 #elif defined(GL_ARB_texture_rectangle)\r
3222                                                                                 ,GL_TEXTURE_RECTANGLE_ARB\r
3223 #endif\r
3224                                         ,GL_TEXTURE_CUBE_MAP\r
3225 #ifdef GL_VERSION_3_0\r
3226                                         ,GL_TEXTURE_1D_ARRAY,GL_TEXTURE_2D_ARRAY // GL 3.x\r
3227 #elif GL_EXT_texture_array\r
3228                                                                                 ,GL_TEXTURE_1D_ARRAY_EXT,GL_TEXTURE_2D_ARRAY_EXT\r
3229 #endif\r
3230 #ifdef GL_VERSION_3_1\r
3231                                                                                 ,GL_TEXTURE_BUFFER\r
3232 #elif defined(GL_ARB_texture_buffer_object)\r
3233                                                                                 ,GL_TEXTURE_BUFFER_ARB\r
3234 #elif defined(GL_EXT_texture_buffer_object)\r
3235                                                                                 ,GL_TEXTURE_BUFFER_EXT\r
3236 #endif\r
3237 #ifdef GL_VERSION_4_0\r
3238                                         ,GL_TEXTURE_CUBE_MAP_ARRAY      // GL 4.x\r
3239 #elif defined(GL_ARB_texture_cube_map_array)\r
3240                                                                                 ,GL_TEXTURE_CUBE_MAP_ARRAY_ARB\r
3241 #endif\r
3242 #ifdef GL_VERSION_3_2\r
3243                                         ,GL_TEXTURE_2D_MULTISAMPLE,GL_TEXTURE_2D_MULTISAMPLE_ARRAY\r
3244 #endif\r
3245         };\r
3246 \r
3247     if (Version>=404||FeatureAvailable[IRR_ARB_multi_bind])\r
3248     {\r
3249 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3250         if (pGlBindTextures)\r
3251             pGlBindTextures(first,count,textures);\r
3252 #elif defined(GL_VERSION_4_4)\r
3253         glBindTextures(first,count,textures);\r
3254 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3255     }\r
3256     else\r
3257     {\r
3258         GLint activeTex = 0;\r
3259         glGetIntegerv(GL_ACTIVE_TEXTURE,&activeTex);\r
3260 \r
3261         for (GLsizei i=0; i<count; i++)\r
3262         {\r
3263             GLuint texture = textures ? textures[i]:0;\r
3264 \r
3265             GLuint unit = first+i;\r
3266                         irrGlActiveTexture(GL_TEXTURE0 + unit);\r
3267 \r
3268             if (texture)\r
3269                 glBindTexture(targets[i],texture);\r
3270             else\r
3271             {\r
3272                 for (size_t j=0; j<sizeof(supportedTargets)/sizeof(GLenum); j++)\r
3273                     glBindTexture(supportedTargets[j],0);\r
3274             }\r
3275         }\r
3276 \r
3277                 irrGlActiveTexture(activeTex);\r
3278     }\r
3279 }\r
3280 \r
3281 inline void COpenGLExtensionHandler::extGlGenerateTextureMipmap(GLuint texture, GLenum target)\r
3282 {\r
3283     if (Version>=405 || FeatureAvailable[IRR_ARB_direct_state_access])\r
3284     {\r
3285 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3286         if (pGlGenerateTextureMipmap)\r
3287             pGlGenerateTextureMipmap(texture);\r
3288 #elif defined(GL_VERSION_4_5)\r
3289         glGenerateTextureMipmap(texture);\r
3290 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3291     }\r
3292     else if (FeatureAvailable[IRR_EXT_direct_state_access])\r
3293     {\r
3294 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3295         if (pGlGenerateTextureMipmapEXT)\r
3296             pGlGenerateTextureMipmapEXT(texture,target);\r
3297 #elif defined(GL_EXT_direct_state_access)\r
3298         glGenerateTextureMipmapEXT(texture,target);\r
3299 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3300     }\r
3301 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3302     else if (pGlGenerateMipmap)\r
3303 #else\r
3304     else\r
3305 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3306     {\r
3307         GLint bound;\r
3308         switch (target)\r
3309         {\r
3310             case GL_TEXTURE_1D:\r
3311                 glGetIntegerv(GL_TEXTURE_BINDING_1D, &bound);\r
3312                 break;\r
3313 #ifdef GL_VERSION_3_0\r
3314             case GL_TEXTURE_1D_ARRAY:\r
3315                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY, &bound);\r
3316                 break;\r
3317 #elif GL_EXT_texture_array\r
3318                         case GL_TEXTURE_1D_ARRAY_EXT:\r
3319                 glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY_EXT, &bound);\r
3320                 break;\r
3321 #endif\r
3322             case GL_TEXTURE_2D:\r
3323                 glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound);\r
3324                 break;\r
3325 #ifdef GL_VERSION_3_0\r
3326             case GL_TEXTURE_2D_ARRAY:\r
3327                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY, &bound);\r
3328                 break;\r
3329 #elif GL_EXT_texture_array\r
3330                         case GL_TEXTURE_2D_ARRAY_EXT:\r
3331                 glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY_EXT, &bound);\r
3332                 break;\r
3333 #endif\r
3334 #ifdef GL_VERSION_3_2\r
3335             case GL_TEXTURE_2D_MULTISAMPLE:\r
3336                 glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE, &bound);\r
3337                 break;\r
3338             case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:\r
3339                 glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, &bound);\r
3340                 break;\r
3341 #endif\r
3342             case GL_TEXTURE_3D:\r
3343                 glGetIntegerv(GL_TEXTURE_BINDING_3D, &bound);\r
3344                 break;\r
3345 #ifdef GL_VERSION_3_1\r
3346             case GL_TEXTURE_BUFFER:\r
3347                 glGetIntegerv(GL_TEXTURE_BINDING_BUFFER, &bound);\r
3348                 break;\r
3349 #elif defined(GL_ARB_texture_buffer_object)\r
3350                         case GL_TEXTURE_BUFFER_ARB:\r
3351                                 glGetIntegerv(GL_TEXTURE_BINDING_BUFFER_ARB, &bound);\r
3352                                 break;\r
3353 #elif defined(GL_EXT_texture_buffer_object)\r
3354                         case GL_TEXTURE_BUFFER_EXT:\r
3355                                 glGetIntegerv(GL_TEXTURE_BINDING_BUFFER_EXT, &bound);\r
3356                                 break;\r
3357 #endif\r
3358             case GL_TEXTURE_CUBE_MAP:\r
3359                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &bound);\r
3360                 break;\r
3361 #ifdef GL_VERSION_4_0\r
3362             case GL_TEXTURE_CUBE_MAP_ARRAY:\r
3363                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY, &bound);\r
3364                 break;\r
3365 #elif defined(GL_ARB_texture_cube_map_array)\r
3366                         case GL_TEXTURE_CUBE_MAP_ARRAY_ARB:\r
3367                                 glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB, &bound);\r
3368                                 break;\r
3369 #endif\r
3370 #ifdef GL_VERSION_3_1\r
3371             case GL_TEXTURE_RECTANGLE:\r
3372                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE, &bound);\r
3373                 break;\r
3374 #elif defined(GL_ARB_texture_rectangle)\r
3375                         case GL_TEXTURE_RECTANGLE_ARB:\r
3376                                 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &bound);\r
3377                 break;\r
3378 #endif\r
3379             default:\r
3380                 os::Printer::log("DevSH would like to ask you what are you doing!!??\n",ELL_ERROR);\r
3381                 return;\r
3382         }\r
3383         glBindTexture(target, texture);\r
3384 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3385         pGlGenerateMipmap(target);\r
3386 #else\r
3387         glGenerateMipmap(target);\r
3388 #endif // _IRR_OPENGL_USE_EXTPOINTER_\r
3389         glBindTexture(target, bound);\r
3390     }\r
3391 }\r
3392 \r
3393 inline void COpenGLExtensionHandler::extGlSwapInterval(int interval)\r
3394 {\r
3395         // we have wglext, so try to use that\r
3396 #if defined(_IRR_WINDOWS_API_) && defined(_IRR_COMPILE_WITH_WINDOWS_DEVICE_)\r
3397 #ifdef WGL_EXT_swap_control\r
3398         if (pWglSwapIntervalEXT)\r
3399                 pWglSwapIntervalEXT(interval);\r
3400 #endif\r
3401 #endif\r
3402 #ifdef _IRR_COMPILE_WITH_X11_DEVICE_\r
3403 #if defined(GLX_MESA_swap_control)\r
3404 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3405         if (pGlxSwapIntervalMESA)\r
3406                 pGlxSwapIntervalMESA(interval);\r
3407 #else\r
3408         pGlXSwapIntervalMESA(interval);\r
3409 #endif\r
3410 #elif defined(GLX_EXT_swap_control)\r
3411         Display *dpy = glXGetCurrentDisplay();\r
3412         GLXDrawable drawable = glXGetCurrentDrawable();\r
3413 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3414         if (pGlxSwapIntervalEXT)\r
3415                 pGlxSwapIntervalEXT(dpy, drawable, interval);\r
3416 #else\r
3417         pGlXSwapIntervalEXT(dpy, drawable, interval);\r
3418 #endif\r
3419 #elif defined(GLX_SGI_swap_control)\r
3420         // does not work with interval==0\r
3421 #ifdef _IRR_OPENGL_USE_EXTPOINTER_\r
3422         if (interval && pGlxSwapIntervalSGI)\r
3423                 pGlxSwapIntervalSGI(interval);\r
3424 #else\r
3425         if (interval)\r
3426                 glXSwapIntervalSGI(interval);\r
3427 #endif\r
3428         }\r
3429 #endif\r
3430 #endif\r
3431 }\r
3432 \r
3433 \r
3434 }\r
3435 }\r
3436 \r
3437 #endif\r
3438 \r
3439 #endif\r
3440 \r