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