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