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
5 #ifndef __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__
\r
6 #define __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__
\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
13 #include "irrMath.h"
\r
14 #include "COpenGLCoreFeature.h"
\r
21 class COGLESCoreExtensionHandler
\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
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
341 IRR_OGLES_Feature_Count
\r
344 COGLESCoreExtensionHandler()
\r
345 : Version(0), MaxAnisotropy(1), MaxIndices(0xffff),
\r
346 MaxTextureSize(1), MaxTextureLODBias(0.f), StencilBuffer(false)
\r
348 for (u32 i = 0; i < IRR_OGLES_Feature_Count; ++i)
\r
349 FeatureAvailable[i] = false;
\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
357 virtual ~COGLESCoreExtensionHandler() {}
\r
359 const COpenGLCoreFeature& getFeature() const
\r
366 for (u32 i = 0; i < IRR_OGLES_Feature_Count; ++i)
\r
367 os::Printer::log(getFeatureString(i), FeatureAvailable[i] ? " true" : " false");
\r
370 bool queryGLESFeature(EOGLESFeatures feature) const
\r
372 return FeatureAvailable[feature];
\r
377 const char* getFeatureString(size_t index) const
\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
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
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
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
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
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
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
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
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
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
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
694 return OGLESFeatureStrings[index];
\r
698 void getGLVersion()
\r
701 s32 multiplier = 100;
\r
703 core::stringc version(glGetString(GL_VERSION));
\r
705 for (u32 i = 0; i < version.size(); ++i)
\r
707 if (version[i] >= '0' && version[i] <= '9')
\r
709 if (multiplier > 1)
\r
711 Version += static_cast<u16>(core::floor32(atof(&(version[i]))) * multiplier);
\r
722 void getGLExtensions()
\r
724 core::stringc extensions = glGetString(GL_EXTENSIONS);
\r
725 os::Printer::log(extensions.c_str());
\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
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
737 for (u32 i=0; i<size; ++i)
\r
743 for (size_t j=0; j<IRR_OGLES_Feature_Count; ++j)
\r
745 if (!strcmp(getFeatureString(j), p))
\r
747 FeatureAvailable[j] = true;
\r
752 p = p + strlen(p) + 1;
\r
760 COpenGLCoreFeature Feature;
\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
777 #endif // defined(_IRR_COMPILE_WITH_OGLES2_) || defined(_IRR_COMPILE_WITH_OGLES1_)
\r
778 #endif // __E_OGLES_CORE_EXTENSION_HANDLER_H_INCLUDED__
\r