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_WEGL_EXTENSION_HANDLER_H_INCLUDED__
\r
6 #define __E_WEGL_EXTENSION_HANDLER_H_INCLUDED__
\r
9 #if defined(_IRR_COMPILE_WITH_WEBGL1_) // Note: should also work with WebGL2 once we add that to Irrlicht
\r
11 #include "COpenGLCoreFeature.h"
\r
17 // Extension handling for WebGL.
\r
18 class CWebGLExtensionHandler
\r
21 // Enums used internally to check for WebGL extensions quickly.
\r
22 // We buffer all extensions on start once in an array.
\r
25 // If you update this enum also update the corresponding WebGLFeatureStrings string-array
\r
26 // Last updated was up to (including) extension number 35 (EXT_float_blend)
\r
28 // Khronos ratified WebGL Extensions
\r
29 IRR_OES_texture_float, // 1
\r
30 IRR_OES_texture_half_float, // 2
\r
31 IRR_WEBGL_lose_context, // 3
\r
32 IRR_OES_standard_derivatives, // 4
\r
33 IRR_OES_vertex_array_object, // 5
\r
34 IRR_WEBGL_debug_renderer_info, // 6
\r
35 IRR_WEBGL_debug_shaders, // 7
\r
36 IRR_WEBGL_compressed_texture_s3tc, // 8
\r
37 IRR_WEBGL_depth_texture, // 9
\r
38 IRR_OES_element_index_uint, // 10
\r
39 IRR_EXT_texture_filter_anisotropic, // 11
\r
40 IRR_EXT_frag_depth, // 16
\r
41 IRR_WEBGL_draw_buffers, // 18
\r
42 IRR_ANGLE_instanced_arrays, // 19
\r
43 IRR_OES_texture_float_linear, // 20
\r
44 IRR_OES_texture_half_float_linear, // 21
\r
45 IRR_EXT_blend_minmax, // 25
\r
46 IRR_EXT_shader_texture_lod, // 27
\r
48 // Community approved WebGL Extensions
\r
49 IRR_WEBGL_compressed_texture_atc, // 12
\r
50 IRR_WEBGL_compressed_texture_pvrtc, // 13
\r
51 IRR_EXT_color_buffer_half_float, // 14
\r
52 IRR_WEBGL_color_buffer_float, // 15
\r
54 IRR_WEBGL_compressed_texture_etc1, // 24
\r
55 IRR_EXT_disjoint_timer_query, // 26
\r
56 IRR_WEBGL_compressed_texture_etc, // 29
\r
57 IRR_WEBGL_compressed_texture_astc, // 30
\r
58 IRR_EXT_color_buffer_float, // 31
\r
59 IRR_WEBGL_compressed_texture_s3tc_srgb, // 32
\r
60 IRR_EXT_disjoint_timer_query_webgl2, // 33
\r
62 // Draft WebGL Extensions
\r
63 IRR_WEBGL_shared_resources, // 22
\r
64 IRR_WEBGL_security_sensitive_resources, // 23
\r
65 IRR_OES_fbo_render_mipmap, // 28
\r
66 IRR_WEBGL_get_buffer_sub_data_async, // 34
\r
67 IRR_EXT_float_blend, // 35
\r
69 IRR_WEBGL_Feature_Count
\r
72 CWebGLExtensionHandler()
\r
74 for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)
\r
75 FeatureAvailable[i] = false;
\r
78 virtual ~CWebGLExtensionHandler() {}
\r
82 for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)
\r
83 os::Printer::log(getFeatureString(i), FeatureAvailable[i] ? " true" : " false");
\r
86 bool queryWebGLFeature(EWebGLFeatures feature) const
\r
88 return FeatureAvailable[feature];
\r
91 void getGLExtensions()
\r
93 core::stringc extensions = glGetString(GL_EXTENSIONS);
\r
94 os::Printer::log(extensions.c_str());
\r
96 const u32 size = extensions.size() + 1;
\r
97 c8* str = new c8[size];
\r
98 strncpy(str, extensions.c_str(), extensions.size());
\r
99 str[extensions.size()] = ' ';
\r
102 for (u32 i=0; i<size; ++i)
\r
108 for (size_t j=0; j<IRR_WEBGL_Feature_Count; ++j)
\r
110 if (!strcmp(getFeatureString(j), p))
\r
112 FeatureAvailable[j] = true;
\r
117 p = p + strlen(p) + 1;
\r
127 const char* getFeatureString(size_t index) const
\r
129 // Based on https://www.khronos.org/registry/webgl/extensions
\r
130 // One for each EWebGLFeatures
\r
131 static const char* const WebGLFeatureStrings[IRR_WEBGL_Feature_Count] =
\r
133 "OES_texture_float",
\r
134 "OES_texture_half_float",
\r
135 "WEBGL_lose_context",
\r
136 "OES_standard_derivatives",
\r
137 "OES_vertex_array_object",
\r
138 "WEBGL_debug_renderer_info",
\r
139 "WEBGL_debug_shaders",
\r
140 "WEBGL_compressed_texture_s3tc",
\r
141 "WEBGL_depth_texture",
\r
142 "OES_element_index_uint",
\r
143 "EXT_texture_filter_anisotropic",
\r
145 "WEBGL_draw_buffers",
\r
146 "ANGLE_instanced_arrays",
\r
147 "OES_texture_float_linear",
\r
148 "OES_texture_half_float_linear",
\r
149 "EXT_blend_minmax",
\r
150 "EXT_shader_texture_lod",
\r
152 "WEBGL_compressed_texture_atc",
\r
153 "WEBGL_compressed_texture_pvrtc",
\r
154 "EXT_color_buffer_half_float",
\r
155 "WEBGL_color_buffer_float",
\r
157 "WEBGL_compressed_texture_etc1",
\r
158 "EXT_disjoint_timer_query",
\r
159 "WEBGL_compressed_texture_etc",
\r
160 "WEBGL_compressed_texture_astc",
\r
161 "EXT_color_buffer_float",
\r
162 "WEBGL_compressed_texture_s3tc_srgb",
\r
163 "EXT_disjoint_timer_query_webgl2",
\r
165 "WEBGL_shared_resources",
\r
166 "WEBGL_security_sensitive_resources",
\r
167 "OES_fbo_render_mipmap",
\r
168 "WEBGL_get_buffer_sub_data_async",
\r
172 return WebGLFeatureStrings[index];
\r
175 bool FeatureAvailable[IRR_WEBGL_Feature_Count];
\r
180 #endif // defined(_IRR_COMPILE_WITH_WEBGL1_)
\r
181 #endif // __E_WEGL1_EXTENSION_HANDLER_H_INCLUDED__
\r