]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COGLESCoreExtensionHandler.h
Reduce IrrCompileConfig usage to files that actually need it
[irrlicht.git] / source / Irrlicht / COGLESCoreExtensionHandler.h
1 // Copyright (C) 2017 Michael Zeilfelder\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h\r
4 \r
5 #ifndef __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__\r
6 #define __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__\r
7 \r
8 \r
9 // Can be included from different ES versions\r
10 // (this is also the reason why this file is header-only as correct OGL ES headers have to be included first)\r
11 #if defined(_IRR_COMPILE_WITH_OGLES2_) || defined(_IRR_COMPILE_WITH_OGLES1_)\r
12 \r
13 #include "irrMath.h"\r
14 #include "COpenGLCoreFeature.h"\r
15 \r
16 namespace irr\r
17 {\r
18 namespace video\r
19 {\r
20 \r
21         class COGLESCoreExtensionHandler\r
22         {\r
23         public:\r
24                 // Enums used internally to check for ES extensions quickly.\r
25                 // We buffer all extensions on start once in an array.\r
26                 // All OpenGL ES versions share the same extensions (WebGL adds it's own extensions on top of ES2)\r
27                 enum EOGLESFeatures\r
28                 {\r
29                         // If you update this enum also update the corresponding OGLESFeatureStrings string-array\r
30                         // Last updated was up to (including) extension number 290 (GL_EXT_clip_control)\r
31                         IRR_GLX_ARB_context_flush_control, // 191\r
32                         IRR_GL_AMD_compressed_3DC_texture, // 39\r
33                         IRR_GL_AMD_compressed_ATC_texture, // 40\r
34                         IRR_GL_AMD_performance_monitor, // 50\r
35                         IRR_GL_AMD_program_binary_Z400, // 48\r
36                         IRR_GL_ANDROID_extension_pack_es31a, // 187\r
37                         IRR_GL_ANGLE_depth_texture, // 138\r
38                         IRR_GL_ANGLE_framebuffer_blit, // 83\r
39                         IRR_GL_ANGLE_framebuffer_multisample, // 84\r
40                         IRR_GL_ANGLE_instanced_arrays, // 109\r
41                         IRR_GL_ANGLE_pack_reverse_row_order, // 110\r
42                         IRR_GL_ANGLE_program_binary, //139\r
43                         IRR_GL_ANGLE_texture_compression_dxt1, // 111\r
44                         IRR_GL_ANGLE_texture_compression_dxt3, // 111\r
45                         IRR_GL_ANGLE_texture_compression_dxt5, // 111\r
46                         IRR_GL_ANGLE_texture_usage, // 112\r
47                         IRR_GL_ANGLE_translated_shader_source, // 113\r
48                         IRR_GL_APPLE_clip_distance, // 193\r
49                         IRR_GL_APPLE_color_buffer_packed_float, // 194\r
50                         IRR_GL_APPLE_copy_texture_levels, // 123\r
51                         IRR_GL_APPLE_framebuffer_multisample, // 78\r
52                         IRR_GL_APPLE_rgb_422, // 76\r
53                         IRR_GL_APPLE_sync, // 124\r
54                         IRR_GL_APPLE_texture_2D_limited_npot, // 59\r
55                         IRR_GL_APPLE_texture_format_BGRA8888, // 79\r
56                         IRR_GL_APPLE_texture_max_level, // 80\r
57                         IRR_GL_APPLE_texture_packed_float, // 195\r
58                         IRR_ARB_texture_env_combine, //ogl, IMG simulator\r
59                         IRR_ARB_texture_env_dot3, //ogl, IMG simulator\r
60                         IRR_GL_ARM_mali_program_binary, // 120\r
61                         IRR_GL_ARM_mali_shader_binary, // 81\r
62                         IRR_GL_ARM_rgba8, // 82\r
63                         IRR_GL_ARM_shader_framebuffer_fetch, // 165\r
64                         IRR_GL_ARM_shader_framebuffer_fetch_depth_stencil, // 166\r
65                         IRR_GL_DMP_program_binary, // 192\r
66                         IRR_GL_DMP_shader_binary, // 88\r
67                         IRR_GL_EXT_EGL_image_array, // 278\r
68                         IRR_GL_EXT_YUV_target, // 222\r
69                         IRR_GL_EXT_base_instance, // 203\r
70                         IRR_GL_EXT_blend_func_extended, // 247\r
71                         IRR_GL_EXT_blend_minmax, // 65\r
72                         IRR_GL_EXT_buffer_storage, // 239\r
73                         IRR_GL_EXT_clear_texture, // 269\r
74                         IRR_GL_EXT_clip_control, // 290\r
75                         IRR_GL_EXT_clip_cull_distance, // 257\r
76                         IRR_GL_EXT_color_buffer_float, // 137\r
77                         IRR_GL_EXT_color_buffer_half_float, // 97\r
78                         IRR_GL_EXT_compressed_ETC1_RGB8_sub_texture, // 188\r
79                         IRR_GL_EXT_conservative_depth, // 268\r
80                         IRR_GL_EXT_copy_image, // 175\r
81                         IRR_GL_EXT_debug_label, // 98\r
82                         IRR_GL_EXT_debug_marker, // 99\r
83                         IRR_GL_EXT_discard_framebuffer, // 64\r
84                         IRR_GL_EXT_disjoint_timer_query, // 150\r
85                         IRR_GL_EXT_draw_buffers, // 151\r
86                         IRR_GL_EXT_draw_buffers_indexed, // 176\r
87                         IRR_GL_EXT_draw_elements_base_vertex, // 204\r
88                         IRR_GL_EXT_draw_instanced, // 157\r
89                         IRR_GL_EXT_draw_transform_feedback, // 272\r
90                         IRR_GL_EXT_external_buffer, // 284\r
91                         IRR_GL_EXT_float_blend, // 225\r
92                         IRR_GL_EXT_frag_depth, // 86\r
93                         IRR_GL_EXT_geometry_point_size, // 177\r
94                         IRR_GL_EXT_geometry_shader, // 177\r
95                         IRR_GL_EXT_gpu_shader5, // 178\r
96                         IRR_GL_EXT_instanced_arrays, // 156\r
97                         IRR_GL_EXT_map_buffer_range, // 121\r
98                         IRR_GL_EXT_memory_object, // 280\r
99                         IRR_GL_EXT_memory_object_fd, // 281\r
100                         IRR_GL_EXT_memory_object_win32, // 282\r
101                         IRR_GL_EXT_multi_draw_arrays, // 69\r
102                         IRR_GL_EXT_multi_draw_indirect, // 205\r
103                         IRR_GL_EXT_multisample_compatibility, // 248\r
104                         IRR_GL_EXT_multisampled_render_to_texture, // 106\r
105                         IRR_GL_EXT_multisampled_render_to_texture2, // 275\r
106                         IRR_GL_EXT_multiview_draw_buffers, // 125\r
107                         IRR_GL_EXT_occlusion_query_boolean, // 100\r
108                         IRR_GL_EXT_polygon_offset_clamp, // 252\r
109                         IRR_GL_EXT_post_depth_coverage, // 225\r
110                         IRR_GL_EXT_primitive_bounding_box, // 186\r
111                         IRR_GL_EXT_protected_textures, // 256\r
112                         IRR_GL_EXT_pvrtc_sRGB, // 155\r
113                         IRR_GL_EXT_raster_multisample, // 226\r
114                         IRR_GL_EXT_read_format_bgra, // 66\r
115                         IRR_GL_EXT_render_snorm, // 206\r
116                         IRR_GL_EXT_robustness, // 107\r
117                         IRR_GL_EXT_sRGB, // 105\r
118                         IRR_GL_EXT_sRGB_write_control, // 153\r
119                         IRR_GL_EXT_semaphore, // 280\r
120                         IRR_GL_EXT_semaphore_fd, // 281\r
121                         IRR_GL_EXT_semaphore_win32, // 282\r
122                         IRR_GL_EXT_separate_shader_objects, // 101\r
123                         IRR_GL_EXT_shader_framebuffer_fetch, // 122\r
124                         IRR_GL_EXT_shader_group_vote, // 254\r
125                         IRR_GL_EXT_shader_implicit_conversions, // 179\r
126                         IRR_GL_EXT_shader_integer_mix, // 161\r
127                         IRR_GL_EXT_shader_io_blocks, // 180\r
128                         IRR_GL_EXT_shader_non_constant_global_initializers, // 264\r
129                         IRR_GL_EXT_shader_pixel_local_storage, // 167\r
130                         IRR_GL_EXT_shader_pixel_local_storage2, // 253\r
131                         IRR_GL_EXT_shader_texture_lod, // 77\r
132                         IRR_GL_EXT_shadow_samplers, // 102\r
133                         IRR_GL_EXT_sparse_texture, // 240\r
134                         IRR_GL_EXT_sparse_texture2, // 259\r
135                         IRR_GL_EXT_tessellation_point_size, // 181\r
136                         IRR_GL_EXT_tessellation_shader, // 181\r
137                         IRR_GL_EXT_texture_border_clamp, // 182\r
138                         IRR_GL_EXT_texture_buffer, // 183\r
139                         IRR_GL_EXT_texture_compression_astc_decode_mode, // 276\r
140                         IRR_GL_EXT_texture_compression_astc_decode_mode_rgb9e5, // 276\r
141                         IRR_GL_EXT_texture_compression_bptc, // 287\r
142                         IRR_GL_EXT_texture_compression_dxt1, // 49\r
143                         IRR_GL_EXT_texture_compression_rgtc, // 286\r
144                         IRR_GL_EXT_texture_compression_s3tc, // 154\r
145                         IRR_GL_EXT_texture_compression_s3tc_srgb, // 289\r
146                         IRR_GL_EXT_texture_cube_map_array, // 184\r
147                         IRR_GL_EXT_texture_filter_anisotropic, // 41\r
148                         IRR_GL_EXT_texture_filter_minmax, // 227\r
149                         IRR_GL_EXT_texture_format_BGRA8888, // 51\r
150                         IRR_GL_EXT_texture_lod_bias, // 60\r
151                         IRR_GL_EXT_texture_norm16, // 207\r
152                         IRR_GL_EXT_texture_rg, // 103\r
153                         IRR_GL_EXT_texture_sRGB_R8, // 221\r
154                         IRR_GL_EXT_texture_sRGB_RG8, // 223\r
155                         IRR_GL_EXT_texture_sRGB_decode, // 152\r
156                         IRR_GL_EXT_texture_storage, // 108\r
157                         IRR_GL_EXT_texture_type_2_10_10_10_REV, // 42\r
158                         IRR_GL_EXT_texture_view, // 185\r
159                         IRR_GL_EXT_unpack_subimage, // 90\r
160                         IRR_GL_EXT_win32_keyed_mutex, // 283\r
161                         IRR_GL_EXT_window_rectangles, // 263\r
162                         IRR_GL_FJ_shader_binary_GCCSO, // 114\r
163                         IRR_GL_IMG_bindless_texture, // 270\r
164                         IRR_GL_IMG_framebuffer_downsample, // 255\r
165                         IRR_GL_IMG_multisampled_render_to_texture, // 74\r
166                         IRR_GL_IMG_program_binary, // 67\r
167                         IRR_GL_IMG_read_format, // 53\r
168                         IRR_GL_IMG_shader_binary, // 68\r
169                         IRR_GL_IMG_texture_compression_pvrtc, // 54\r
170                         IRR_GL_IMG_texture_compression_pvrtc2, // 140\r
171                         IRR_GL_IMG_texture_env_enhanced_fixed_function, // 58\r
172                         IRR_GL_IMG_texture_format_BGRA8888, // replaced by EXT version\r
173                         IRR_GL_IMG_texture_filter_cubic, // 251\r
174                         IRR_GL_IMG_user_clip_plane, // 57, was clip_planes\r
175                         IRR_GL_IMG_vertex_program, // non-standard\r
176                         IRR_GL_INTEL_conservative_rasterization, // 265\r
177                         IRR_GL_INTEL_framebuffer_CMAA, // 246\r
178                         IRR_GL_INTEL_performance_query, // 164\r
179                         IRR_GL_KHR_blend_equation_advanced, // 168\r
180                         IRR_GL_KHR_blend_equation_advanced_coherent, // 168\r
181                         IRR_GL_KHR_context_flush_control, // 191\r
182                         IRR_GL_KHR_debug, // 118\r
183                         IRR_GL_KHR_no_error, // 243\r
184                         IRR_GL_KHR_parallel_shader_compile, // 288\r
185                         IRR_GL_KHR_robust_buffer_access_behavior, // 189\r
186                         IRR_GL_KHR_robustness, // 190\r
187                         IRR_GL_KHR_texture_compression_astc_hdr, // 117\r
188                         IRR_GL_KHR_texture_compression_astc_ldr, // 117\r
189                         IRR_GL_KHR_texture_compression_astc_sliced_3d, // 249\r
190                         IRR_GL_NVX_blend_equation_advanced_multi_draw_buffers, // 266\r
191                         IRR_GL_NV_3dvision_settings, // 129\r
192                         IRR_GL_NV_EGL_stream_consumer_external, // 104\r
193                         IRR_GL_NV_bgr, // 135\r
194                         IRR_GL_NV_bindless_texture, // 197\r
195                         IRR_GL_NV_blend_equation_advanced, // 163\r
196                         IRR_GL_NV_blend_equation_advanced_coherent, // 163\r
197                         IRR_GL_NV_blend_minmax_factor, // 285\r
198                         IRR_GL_NV_conditional_render, // 198\r
199                         IRR_GL_NV_conservative_raster, // 228\r
200                         IRR_GL_NV_conservative_raster_pre_snap_triangles, // 262\r
201                         IRR_GL_NV_copy_buffer, // 158\r
202                         IRR_GL_NV_coverage_sample, // 72\r
203                         IRR_GL_NV_depth_nonlinear, // 73\r
204                         IRR_GL_NV_draw_buffers, // 91\r
205                         IRR_GL_NV_draw_instanced, // 141\r
206                         IRR_GL_NV_draw_texture, // 126\r
207                         IRR_GL_NV_draw_vulkan_image, // 274\r
208                         IRR_GL_NV_explicit_attrib_location, // 159\r
209                         IRR_GL_NV_fbo_color_attachments, // 92\r
210                         IRR_GL_NV_fence, // 52\r
211                         IRR_GL_NV_fill_rectangle, // 232\r
212                         IRR_GL_NV_fragment_coverage_to_color, // 229\r
213                         IRR_GL_NV_fragment_shader_interlock, // 230\r
214                         IRR_GL_NV_framebuffer_blit, // 142\r
215                         IRR_GL_NV_framebuffer_mixed_samples, // 231\r
216                         IRR_GL_NV_framebuffer_multisample, // 143\r
217                         IRR_GL_NV_generate_mipmap_sRGB, // 144\r
218                         IRR_GL_NV_geometry_shader_passthrough, // 233\r
219                         IRR_GL_NV_gpu_shader5, // 260\r
220                         IRR_GL_NV_image_formats, // 200\r
221                         IRR_GL_NV_instanced_arrays, // 145\r
222                         IRR_GL_NV_internalformat_sample_query, // 196\r
223                         IRR_GL_NV_non_square_matrices, // 160\r
224                         IRR_GL_NV_pack_subimage, // 132\r
225                         IRR_GL_NV_packed_float, // 127\r
226                         IRR_GL_NV_path_rendering, // 199\r
227                         IRR_GL_NV_path_rendering_shared_edge, // 234\r
228                         IRR_GL_NV_pixel_buffer_object, // 134\r
229                         IRR_GL_NV_platform_binary, // 131\r
230                         IRR_GL_NV_polygon_mode, // 238\r
231                         IRR_GL_NV_read_buffer, // 93\r
232                         IRR_GL_NV_read_buffer_front, // part of 93 (non standard)\r
233                         IRR_GL_NV_read_depth, // part of 94 (non standard)\r
234                         IRR_GL_NV_read_depth_stencil, // 94\r
235                         IRR_GL_NV_read_stencil, // part of 94 (non standard)\r
236                         IRR_GL_NV_sRGB_formats, // 148\r
237                         IRR_GL_NV_sample_locations, // 235\r
238                         IRR_GL_NV_sample_mask_override_coverage, // 236\r
239                         IRR_GL_NV_shader_atomic_fp16_vector, // 261\r
240                         IRR_GL_NV_shader_noperspective_interpolation, // 201\r
241                         IRR_GL_NV_shadow_samplers_array, // 146\r
242                         IRR_GL_NV_shadow_samplers_cube, // 147\r
243                         IRR_GL_NV_texture_array, // 133\r
244                         IRR_GL_NV_texture_barrier, // 271\r
245                         IRR_GL_NV_texture_border_clamp, // 149\r
246                         IRR_GL_NV_texture_compression_latc, // 130\r
247                         IRR_GL_NV_texture_compression_s3tc, // 128\r
248                         IRR_GL_NV_texture_compression_s3tc_update, // 95\r
249                         IRR_GL_NV_texture_npot_2D_mipmap, // 96\r
250                         IRR_GL_NV_viewport_array, // 202\r
251                         IRR_GL_NV_viewport_array2, // 237\r
252                         IRR_GL_NV_viewport_swizzle, // 258\r
253                         IRR_GL_OES_EGL_image, // 23\r
254                         IRR_GL_OES_EGL_image_external, // 87\r
255                         IRR_GL_OES_EGL_image_external_essl3, // 220\r
256                         IRR_GL_OES_EGL_sync, // 75\r
257                         IRR_GL_OES_blend_equation_separate, // 1\r
258                         IRR_GL_OES_blend_func_separate, // 2\r
259                         IRR_GL_OES_blend_subtract, // 3\r
260                         IRR_GL_OES_byte_coordinates, // 4\r
261                         IRR_GL_OES_compressed_ETC1_RGB8_texture, // 5\r
262                         IRR_GL_OES_compressed_paletted_texture, // 6\r
263                         IRR_GL_OES_copy_image, // 208\r
264                         IRR_GL_OES_depth24, // 24\r
265                         IRR_GL_OES_depth32, // 25\r
266                         IRR_GL_OES_depth_texture, // 43\r
267                         IRR_GL_OES_depth_texture_cube_map, // 136\r
268                         IRR_GL_OES_draw_buffers_indexed, // 209\r
269                         IRR_GL_OES_draw_elements_base_vertex, // 219\r
270                         IRR_GL_OES_draw_texture, // 7\r
271                         IRR_GL_OES_element_index_uint, // 26\r
272                         IRR_GL_OES_extended_matrix_palette, // 8\r
273                         IRR_GL_OES_fbo_render_mipmap, // 27\r
274                         IRR_GL_OES_fixed_point, // 9\r
275                         IRR_GL_OES_fragment_precision_high, // 28\r
276                         IRR_GL_OES_framebuffer_object, // 10\r
277                         IRR_GL_OES_geometry_shader, // 210\r
278                         IRR_GL_OES_get_program_binary, // 47\r
279                         IRR_GL_OES_gpu_shader5, // 211\r
280                         IRR_GL_OES_mapbuffer, // 29\r
281                         IRR_GL_OES_matrix_get, // 11\r
282                         IRR_GL_OES_matrix_palette, // 12\r
283                         IRR_GL_OES_packed_depth_stencil, // 44\r
284                         IRR_GL_OES_point_size_array, // 14\r
285                         IRR_GL_OES_point_sprite, // 15\r
286                         IRR_GL_OES_primitive_bounding_box, // 212\r
287                         IRR_GL_OES_query_matrix, // 16\r
288                         IRR_GL_OES_read_format, // 17\r
289                         IRR_GL_OES_required_internalformat, // 115\r
290                         IRR_GL_OES_rgb8_rgba8, // 30\r
291                         IRR_GL_OES_sample_shading, // 169\r
292                         IRR_GL_OES_sample_variables, // 170\r
293                         IRR_GL_OES_shader_image_atomic, // 171\r
294                         IRR_GL_OES_shader_io_blocks, // 213\r
295                         IRR_GL_OES_shader_multisample_interpolation, // 172\r
296                         IRR_GL_OES_single_precision, // 18\r
297                         IRR_GL_OES_standard_derivatives, // 45\r
298                         IRR_GL_OES_stencil1, // 31\r
299                         IRR_GL_OES_stencil4, // 32\r
300                         IRR_GL_OES_stencil8, // 33\r
301                         IRR_GL_OES_stencil_wrap, // 19\r
302                         IRR_GL_OES_surfaceless_context, // 116\r
303                         IRR_GL_OES_tessellation_shader, // 214\r
304                         IRR_GL_OES_texture_3D, // 34\r
305                         IRR_GL_OES_texture_border_clamp, // 215\r
306                         IRR_GL_OES_texture_buffer, // 216\r
307                         IRR_GL_OES_texture_compression_astc, // 162\r
308                         IRR_GL_OES_texture_cube_map, // 20\r
309                         IRR_GL_OES_texture_cube_map_array, // 217\r
310                         IRR_GL_OES_texture_env_crossbar, // 21\r
311                         IRR_GL_OES_texture_float, // 36\r
312                         IRR_GL_OES_texture_float_linear, // 35\r
313                         IRR_GL_OES_texture_half_float, // 36\r
314                         IRR_GL_OES_texture_half_float_linear, // 35\r
315                         IRR_GL_OES_texture_mirrored_repeat, // 22\r
316                         IRR_GL_OES_texture_npot, // 37\r
317                         IRR_GL_OES_texture_stencil8, // 173\r
318                         IRR_GL_OES_texture_storage_multisample_2d_array, // 174\r
319                         IRR_GL_OES_texture_view, // 218\r
320                         IRR_GL_OES_vertex_array_object, // 71\r
321                         IRR_GL_OES_vertex_half_float, // 38\r
322                         IRR_GL_OES_vertex_type_10_10_10_2, // 46\r
323                         IRR_GL_OES_viewport_array, // 267\r
324                         IRR_GL_OVR_multiview, // 241\r
325                         IRR_GL_OVR_multiview2, // 242\r
326                         IRR_GL_OVR_multiview_multisampled_render_to_texture, // 250\r
327                         IRR_GL_QCOM_alpha_test, // 89\r
328                         IRR_GL_QCOM_binning_control, // 119\r
329                         IRR_GL_QCOM_driver_control, // 55\r
330                         IRR_GL_QCOM_extended_get, // 62\r
331                         IRR_GL_QCOM_extended_get2, // 63\r
332                         IRR_GL_QCOM_framebuffer_foveated, // 273\r
333                         IRR_GL_QCOM_performance_monitor_global_mode, // 56\r
334                         IRR_GL_QCOM_shader_framebuffer_fetch_noncoherent, // 277\r
335                         IRR_GL_QCOM_tiled_rendering, // 70\r
336                         IRR_GL_QCOM_writeonly_rendering, // 61\r
337                         IRR_GL_SUN_multi_draw_arrays, // 69\r
338                         IRR_GL_VIV_shader_binary, // 85\r
339                         WGL_ARB_context_flush_control, // 191\r
340 \r
341                         IRR_OGLES_Feature_Count\r
342                 };\r
343 \r
344                 COGLESCoreExtensionHandler()\r
345                 :       Version(0), MaxAnisotropy(1), MaxIndices(0xffff),\r
346                         MaxTextureSize(1), MaxTextureLODBias(0.f), StencilBuffer(false)\r
347                 {\r
348                         for (u32 i = 0; i < IRR_OGLES_Feature_Count; ++i)\r
349                                 FeatureAvailable[i] = false;\r
350 \r
351                         DimAliasedLine[0] = 1.f;\r
352                         DimAliasedLine[1] = 1.f;\r
353                         DimAliasedPoint[0] = 1.f;\r
354                         DimAliasedPoint[1] = 1.f;\r
355                 }\r
356 \r
357                 virtual ~COGLESCoreExtensionHandler() {}\r
358 \r
359                 const COpenGLCoreFeature& getFeature() const\r
360                 {\r
361                         return Feature;\r
362                 }\r
363 \r
364                 void dump() const\r
365                 {\r
366                         for (u32 i = 0; i < IRR_OGLES_Feature_Count; ++i)\r
367                                 os::Printer::log(getFeatureString(i), FeatureAvailable[i] ? " true" : " false");\r
368                 }\r
369 \r
370                 bool queryGLESFeature(EOGLESFeatures feature) const\r
371                 {\r
372                         return FeatureAvailable[feature];\r
373                 }\r
374 \r
375         protected:\r
376 \r
377                 const char* getFeatureString(size_t index) const\r
378                 {\r
379                         // Extension names from https://www.khronos.org/registry/OpenGL/index_es.php\r
380                         // One for each EOGLESFeatures\r
381                         static const char* const OGLESFeatureStrings[IRR_OGLES_Feature_Count] =\r
382                         {\r
383                                 "GLX_ARB_context_flush_control",\r
384                                 "GL_AMD_compressed_3DC_texture",\r
385                                 "GL_AMD_compressed_ATC_texture",\r
386                                 "GL_AMD_performance_monitor",\r
387                                 "GL_AMD_program_binary_Z400",\r
388                                 "GL_ANDROID_extension_pack_es31a",\r
389                                 "GL_ANGLE_depth_texture",\r
390                                 "GL_ANGLE_framebuffer_blit",\r
391                                 "GL_ANGLE_framebuffer_multisample",\r
392                                 "GL_ANGLE_instanced_arrays",\r
393                                 "GL_ANGLE_pack_reverse_row_order",\r
394                                 "GL_ANGLE_program_binary",\r
395                                 "GL_ANGLE_texture_compression_dxt1",\r
396                                 "GL_ANGLE_texture_compression_dxt3",\r
397                                 "GL_ANGLE_texture_compression_dxt5",\r
398                                 "GL_ANGLE_texture_usage",\r
399                                 "GL_ANGLE_translated_shader_source",\r
400                                 "GL_APPLE_clip_distance",\r
401                                 "GL_APPLE_color_buffer_packed_float",\r
402                                 "GL_APPLE_copy_texture_levels",\r
403                                 "GL_APPLE_framebuffer_multisample",\r
404                                 "GL_APPLE_rgb_422",\r
405                                 "GL_APPLE_sync",\r
406                                 "GL_APPLE_texture_2D_limited_npot",\r
407                                 "GL_APPLE_texture_format_BGRA8888",\r
408                                 "GL_APPLE_texture_max_level",\r
409                                 "GL_APPLE_texture_packed_float",\r
410                                 "GL_ARB_texture_env_combine",\r
411                                 "GL_ARB_texture_env_dot3",\r
412                                 "GL_ARM_mali_program_binary",\r
413                                 "GL_ARM_mali_shader_binary",\r
414                                 "GL_ARM_rgba8",\r
415                                 "GL_ARM_shader_framebuffer_fetch",\r
416                                 "GL_ARM_shader_framebuffer_fetch_depth_stencil",\r
417                                 "GL_DMP_program_binary",\r
418                                 "GL_DMP_shader_binary",\r
419                                 "GL_EXT_EGL_image_array",\r
420                                 "GL_EXT_YUV_target",\r
421                                 "GL_EXT_base_instance",\r
422                                 "GL_EXT_blend_func_extended",\r
423                                 "GL_EXT_blend_minmax",\r
424                                 "GL_EXT_buffer_storage",\r
425                                 "GL_EXT_clear_texture",\r
426                                 "GL_EXT_clip_control",\r
427                                 "GL_EXT_clip_cull_distance",\r
428                                 "GL_EXT_color_buffer_float",\r
429                                 "GL_EXT_color_buffer_half_float",\r
430                                 "GL_EXT_compressed_ETC1_RGB8_sub_texture",\r
431                                 "GL_EXT_conservative_depth",\r
432                                 "GL_EXT_copy_image",\r
433                                 "GL_EXT_debug_label",\r
434                                 "GL_EXT_debug_marker",\r
435                                 "GL_EXT_discard_framebuffer",\r
436                                 "GL_EXT_disjoint_timer_query",\r
437                                 "GL_EXT_draw_buffers",\r
438                                 "GL_EXT_draw_buffers_indexed",\r
439                                 "GL_EXT_draw_elements_base_vertex",\r
440                                 "GL_EXT_draw_instanced",\r
441                                 "GL_EXT_draw_transform_feedback",\r
442                                 "GL_EXT_external_buffer",\r
443                                 "GL_EXT_float_blend",\r
444                                 "GL_EXT_frag_depth",\r
445                                 "GL_EXT_geometry_point_size",\r
446                                 "GL_EXT_geometry_shader",\r
447                                 "GL_EXT_gpu_shader5",\r
448                                 "GL_EXT_instanced_arrays",\r
449                                 "GL_EXT_map_buffer_range",\r
450                                 "GL_EXT_memory_object",\r
451                                 "GL_EXT_memory_object_fd",\r
452                                 "GL_EXT_memory_object_win32",\r
453                                 "GL_EXT_multi_draw_arrays",\r
454                                 "GL_EXT_multi_draw_indirect",\r
455                                 "GL_EXT_multisample_compatibility",\r
456                                 "GL_EXT_multisampled_render_to_texture",\r
457                                 "GL_EXT_multisampled_render_to_texture2",\r
458                                 "GL_EXT_multiview_draw_buffers",\r
459                                 "GL_EXT_occlusion_query_boolean",\r
460                                 "GL_EXT_polygon_offset_clamp",\r
461                                 "GL_EXT_post_depth_coverage",\r
462                                 "GL_EXT_primitive_bounding_box",\r
463                                 "GL_EXT_protected_textures",\r
464                                 "GL_EXT_pvrtc_sRGB",\r
465                                 "GL_EXT_raster_multisample",\r
466                                 "GL_EXT_read_format_bgra",\r
467                                 "GL_EXT_render_snorm",\r
468                                 "GL_EXT_robustness",\r
469                                 "GL_EXT_sRGB",\r
470                                 "GL_EXT_sRGB_write_control",\r
471                                 "GL_EXT_semaphore",\r
472                                 "GL_EXT_semaphore_fd",\r
473                                 "GL_EXT_semaphore_win32",\r
474                                 "GL_EXT_separate_shader_objects",\r
475                                 "GL_EXT_shader_framebuffer_fetch",\r
476                                 "GL_EXT_shader_group_vote",\r
477                                 "GL_EXT_shader_implicit_conversions",\r
478                                 "GL_EXT_shader_integer_mix",\r
479                                 "GL_EXT_shader_io_blocks",\r
480                                 "GL_EXT_shader_non_constant_global_initializers",\r
481                                 "GL_EXT_shader_pixel_local_storage",\r
482                                 "GL_EXT_shader_pixel_local_storage2",\r
483                                 "GL_EXT_shader_texture_lod",\r
484                                 "GL_EXT_shadow_samplers",\r
485                                 "GL_EXT_sparse_texture",\r
486                                 "GL_EXT_sparse_texture2",\r
487                                 "GL_EXT_tessellation_point_size",\r
488                                 "GL_EXT_tessellation_shader",\r
489                                 "GL_EXT_texture_border_clamp",\r
490                                 "GL_EXT_texture_buffer",\r
491                                 "GL_EXT_texture_compression_astc_decode_mode",\r
492                                 "GL_EXT_texture_compression_astc_decode_mode_rgb9e5",\r
493                                 "GL_EXT_texture_compression_bptc",\r
494                                 "GL_EXT_texture_compression_dxt1",\r
495                                 "GL_EXT_texture_compression_rgtc",\r
496                                 "GL_EXT_texture_compression_s3tc",\r
497                                 "GL_EXT_texture_compression_s3tc_srgb",\r
498                                 "GL_EXT_texture_cube_map_array",\r
499                                 "GL_EXT_texture_filter_anisotropic",\r
500                                 "GL_EXT_texture_filter_minmax",\r
501                                 "GL_EXT_texture_format_BGRA8888",\r
502                                 "GL_EXT_texture_lod_bias",\r
503                                 "GL_EXT_texture_norm16",\r
504                                 "GL_EXT_texture_rg",\r
505                                 "GL_EXT_texture_sRGB_R8",\r
506                                 "GL_EXT_texture_sRGB_RG8",\r
507                                 "GL_EXT_texture_sRGB_decode",\r
508                                 "GL_EXT_texture_storage",\r
509                                 "GL_EXT_texture_type_2_10_10_10_REV",\r
510                                 "GL_EXT_texture_view",\r
511                                 "GL_EXT_unpack_subimage",\r
512                                 "GL_EXT_win32_keyed_mutex",\r
513                                 "GL_EXT_window_rectangles",\r
514                                 "GL_FJ_shader_binary_GCCSO",\r
515                                 "GL_IMG_bindless_texture",\r
516                                 "GL_IMG_framebuffer_downsample",\r
517                                 "GL_IMG_multisampled_render_to_texture",\r
518                                 "GL_IMG_program_binary",\r
519                                 "GL_IMG_read_format",\r
520                                 "GL_IMG_shader_binary",\r
521                                 "GL_IMG_texture_compression_pvrtc",\r
522                                 "GL_IMG_texture_compression_pvrtc2",\r
523                                 "GL_IMG_texture_env_enhanced_fixed_function",\r
524                                 "GL_IMG_texture_format_BGRA8888",\r
525                                 "GL_IMG_texture_filter_cubic",\r
526                                 "GL_IMG_user_clip_plane",\r
527                                 "GL_IMG_vertex_program",\r
528                                 "GL_INTEL_conservative_rasterization",\r
529                                 "GL_INTEL_framebuffer_CMAA",\r
530                                 "GL_INTEL_performance_query",\r
531                                 "GL_KHR_blend_equation_advanced",\r
532                                 "GL_KHR_blend_equation_advanced_coherent",\r
533                                 "GL_KHR_context_flush_control",\r
534                                 "GL_KHR_debug",\r
535                                 "GL_KHR_no_error",\r
536                                 "GL_KHR_parallel_shader_compile",\r
537                                 "GL_KHR_robust_buffer_access_behavior",\r
538                                 "GL_KHR_robustness",\r
539                                 "GL_KHR_texture_compression_astc_hdr",\r
540                                 "GL_KHR_texture_compression_astc_ldr",\r
541                                 "GL_KHR_texture_compression_astc_sliced_3d",\r
542                                 "GL_NVX_blend_equation_advanced_multi_draw_buffers",\r
543                                 "GL_NV_3dvision_settings",\r
544                                 "GL_NV_EGL_stream_consumer_external",\r
545                                 "GL_NV_bgr",\r
546                                 "GL_NV_bindless_texture",\r
547                                 "GL_NV_blend_equation_advanced",\r
548                                 "GL_NV_blend_equation_advanced_coherent",\r
549                                 "GL_NV_blend_minmax_factor",\r
550                                 "GL_NV_conditional_render",\r
551                                 "GL_NV_conservative_raster",\r
552                                 "GL_NV_conservative_raster_pre_snap_triangles",\r
553                                 "GL_NV_copy_buffer",\r
554                                 "GL_NV_coverage_sample",\r
555                                 "GL_NV_depth_nonlinear",\r
556                                 "GL_NV_draw_buffers",\r
557                                 "GL_NV_draw_instanced",\r
558                                 "GL_NV_draw_texture",\r
559                                 "GL_NV_draw_vulkan_image",\r
560                                 "GL_NV_explicit_attrib_location",\r
561                                 "GL_NV_fbo_color_attachments",\r
562                                 "GL_NV_fence",\r
563                                 "GL_NV_fill_rectangle",\r
564                                 "GL_NV_fragment_coverage_to_color",\r
565                                 "GL_NV_fragment_shader_interlock",\r
566                                 "GL_NV_framebuffer_blit",\r
567                                 "GL_NV_framebuffer_mixed_samples",\r
568                                 "GL_NV_framebuffer_multisample",\r
569                                 "GL_NV_generate_mipmap_sRGB",\r
570                                 "GL_NV_geometry_shader_passthrough",\r
571                                 "GL_NV_gpu_shader5",\r
572                                 "GL_NV_image_formats",\r
573                                 "GL_NV_instanced_arrays",\r
574                                 "GL_NV_internalformat_sample_query",\r
575                                 "GL_NV_non_square_matrices",\r
576                                 "GL_NV_pack_subimage",\r
577                                 "GL_NV_packed_float",\r
578                                 "GL_NV_path_rendering",\r
579                                 "GL_NV_path_rendering_shared_edge",\r
580                                 "GL_NV_pixel_buffer_object",\r
581                                 "GL_NV_platform_binary",\r
582                                 "GL_NV_polygon_mode",\r
583                                 "GL_NV_read_buffer",\r
584                                 "GL_NV_read_buffer_front",\r
585                                 "GL_NV_read_depth",\r
586                                 "GL_NV_read_depth_stencil",\r
587                                 "GL_NV_read_stencil",\r
588                                 "GL_NV_sRGB_formats",\r
589                                 "GL_NV_sample_locations",\r
590                                 "GL_NV_sample_mask_override_coverage",\r
591                                 "GL_NV_shader_atomic_fp16_vector",\r
592                                 "GL_NV_shader_noperspective_interpolation",\r
593                                 "GL_NV_shadow_samplers_array",\r
594                                 "GL_NV_shadow_samplers_cube",\r
595                                 "GL_NV_texture_array",\r
596                                 "GL_NV_texture_barrier",\r
597                                 "GL_NV_texture_border_clamp",\r
598                                 "GL_NV_texture_compression_latc",\r
599                                 "GL_NV_texture_compression_s3tc",\r
600                                 "GL_NV_texture_compression_s3tc_update",\r
601                                 "GL_NV_texture_npot_2D_mipmap",\r
602                                 "GL_NV_viewport_array",\r
603                                 "GL_NV_viewport_array2",\r
604                                 "GL_NV_viewport_swizzle",\r
605                                 "GL_OES_EGL_image",\r
606                                 "GL_OES_EGL_image_external",\r
607                                 "GL_OES_EGL_image_external_essl3",\r
608                                 "GL_OES_EGL_sync",\r
609                                 "GL_OES_blend_equation_separate",\r
610                                 "GL_OES_blend_func_separate",\r
611                                 "GL_OES_blend_subtract",\r
612                                 "GL_OES_byte_coordinates",\r
613                                 "GL_OES_compressed_ETC1_RGB8_texture",\r
614                                 "GL_OES_compressed_paletted_texture",\r
615                                 "GL_OES_copy_image",\r
616                                 "GL_OES_depth24",\r
617                                 "GL_OES_depth32",\r
618                                 "GL_OES_depth_texture",\r
619                                 "GL_OES_depth_texture_cube_map",\r
620                                 "GL_OES_draw_buffers_indexed",\r
621                                 "GL_OES_draw_elements_base_vertex",\r
622                                 "GL_OES_draw_texture",\r
623                                 "GL_OES_element_index_uint",\r
624                                 "GL_OES_extended_matrix_palette",\r
625                                 "GL_OES_fbo_render_mipmap",\r
626                                 "GL_OES_fixed_point",\r
627                                 "GL_OES_fragment_precision_high",\r
628                                 "GL_OES_framebuffer_object",\r
629                                 "GL_OES_geometry_shader",\r
630                                 "GL_OES_get_program_binary",\r
631                                 "GL_OES_gpu_shader5",\r
632                                 "GL_OES_mapbuffer",\r
633                                 "GL_OES_matrix_get",\r
634                                 "GL_OES_matrix_palette",\r
635                                 "GL_OES_packed_depth_stencil",\r
636                                 "GL_OES_point_size_array",\r
637                                 "GL_OES_point_sprite",\r
638                                 "GL_OES_primitive_bounding_box",\r
639                                 "GL_OES_query_matrix",\r
640                                 "GL_OES_read_format",\r
641                                 "GL_OES_required_internalformat",\r
642                                 "GL_OES_rgb8_rgba8",\r
643                                 "GL_OES_sample_shading",\r
644                                 "GL_OES_sample_variables",\r
645                                 "GL_OES_shader_image_atomic",\r
646                                 "GL_OES_shader_io_blocks",\r
647                                 "GL_OES_shader_multisample_interpolation",\r
648                                 "GL_OES_single_precision",\r
649                                 "GL_OES_standard_derivatives",\r
650                                 "GL_OES_stencil1",\r
651                                 "GL_OES_stencil4",\r
652                                 "GL_OES_stencil8",\r
653                                 "GL_OES_stencil_wrap",\r
654                                 "GL_OES_surfaceless_context",\r
655                                 "GL_OES_tessellation_shader",\r
656                                 "GL_OES_texture_3D",\r
657                                 "GL_OES_texture_border_clamp",\r
658                                 "GL_OES_texture_buffer",\r
659                                 "GL_OES_texture_compression_astc",\r
660                                 "GL_OES_texture_cube_map",\r
661                                 "GL_OES_texture_cube_map_array",\r
662                                 "GL_OES_texture_env_crossbar",\r
663                                 "GL_OES_texture_float",\r
664                                 "GL_OES_texture_float_linear",\r
665                                 "GL_OES_texture_half_float",\r
666                                 "GL_OES_texture_half_float_linear",\r
667                                 "GL_OES_texture_mirrored_repeat",\r
668                                 "GL_OES_texture_npot",\r
669                                 "GL_OES_texture_stencil8",\r
670                                 "GL_OES_texture_storage_multisample_2d_array",\r
671                                 "GL_OES_texture_view",\r
672                                 "GL_OES_vertex_array_object",\r
673                                 "GL_OES_vertex_half_float",\r
674                                 "GL_OES_vertex_type_10_10_10_2",\r
675                                 "GL_OES_viewport_array",\r
676                                 "GL_OVR_multiview",\r
677                                 "GL_OVR_multiview2",\r
678                                 "GL_OVR_multiview_multisampled_render_to_texture",\r
679                                 "GL_QCOM_alpha_test",\r
680                                 "GL_QCOM_binning_control",\r
681                                 "GL_QCOM_driver_control",\r
682                                 "GL_QCOM_extended_get",\r
683                                 "GL_QCOM_extended_get2",\r
684                                 "GL_QCOM_framebuffer_foveated",\r
685                                 "GL_QCOM_performance_monitor_global_mode",\r
686                                 "GL_QCOM_shader_framebuffer_fetch_noncoherent",\r
687                                 "GL_QCOM_tiled_rendering",\r
688                                 "GL_QCOM_writeonly_rendering",\r
689                                 "GL_SUN_multi_draw_arrays",\r
690                                 "GL_VIV_shader_binary",\r
691                                 "WGL_ARB_context_flush_control"\r
692                         };\r
693 \r
694                         return OGLESFeatureStrings[index];\r
695                 }\r
696 \r
697 \r
698                 void getGLVersion()\r
699                 {\r
700                         Version = 0;\r
701                         s32 multiplier = 100;\r
702 \r
703                         core::stringc version(glGetString(GL_VERSION));\r
704 \r
705                         for (u32 i = 0; i < version.size(); ++i)\r
706                         {\r
707                                 if (version[i] >= '0' && version[i] <= '9')\r
708                                 {\r
709                                         if (multiplier > 1)\r
710                                         {\r
711                                                 Version += static_cast<u16>(core::floor32(atof(&(version[i]))) * multiplier);\r
712                                                 multiplier /= 10;\r
713                                         }\r
714                                         else\r
715                                         {\r
716                                                 break;\r
717                                         }\r
718                                 }\r
719                         }\r
720                 }\r
721 \r
722                 void getGLExtensions()\r
723                 {\r
724                         core::stringc extensions = glGetString(GL_EXTENSIONS);\r
725                         os::Printer::log(extensions.c_str());\r
726 \r
727                         // typo in the simulator (note the postfixed s)\r
728                         if (extensions.find("GL_IMG_user_clip_planes"))\r
729                                 FeatureAvailable[IRR_GL_IMG_user_clip_plane] = true;\r
730 \r
731                         const u32 size = extensions.size() + 1;\r
732                         c8* str = new c8[size];\r
733                         strncpy(str, extensions.c_str(), extensions.size());\r
734                         str[extensions.size()] = ' ';\r
735                         c8* p = str;\r
736 \r
737                         for (u32 i=0; i<size; ++i)\r
738                         {\r
739                                 if (str[i] == ' ')\r
740                                 {\r
741                                         str[i] = 0;\r
742                                         if (*p)\r
743                                                 for (size_t j=0; j<IRR_OGLES_Feature_Count; ++j)\r
744                                                 {\r
745                                                         if (!strcmp(getFeatureString(j), p))\r
746                                                         {\r
747                                                                 FeatureAvailable[j] = true;\r
748                                                                 break;\r
749                                                         }\r
750                                                 }\r
751 \r
752                                         p = p + strlen(p) + 1;\r
753                                 }\r
754                         }\r
755 \r
756                         delete[] str;\r
757                 }\r
758 \r
759 \r
760                 COpenGLCoreFeature Feature;\r
761 \r
762                 u16 Version;\r
763                 u8 MaxAnisotropy;\r
764                 u32 MaxIndices;\r
765                 u32 MaxTextureSize;\r
766                 f32 MaxTextureLODBias;\r
767                 //! Minimal and maximal supported thickness for lines without smoothing\r
768                 float DimAliasedLine[2];\r
769                 //! Minimal and maximal supported thickness for points without smoothing\r
770                 float DimAliasedPoint[2];\r
771                 bool StencilBuffer;\r
772                 bool FeatureAvailable[IRR_OGLES_Feature_Count];\r
773         };\r
774 }\r
775 }\r
776 \r
777 #endif // defined(_IRR_COMPILE_WITH_OGLES2_) || defined(_IRR_COMPILE_WITH_OGLES1_)\r
778 #endif // __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__\r