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