]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CWebGLExtensionHandler.h
Reduce IrrCompileConfig usage to files that actually need it
[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 \r
9 #if defined(_IRR_COMPILE_WITH_WEBGL1_)  // Note: should also work with WebGL2 once we add that to Irrlicht\r
10 \r
11 #include "COpenGLCoreFeature.h"\r
12 \r
13 namespace irr\r
14 {\r
15 namespace video\r
16 {\r
17         // Extension handling for WebGL.\r
18         class CWebGLExtensionHandler\r
19         {\r
20         public:\r
21                 // Enums used internally to check for WebGL extensions quickly.\r
22                 // We buffer all extensions on start once in an array.\r
23                 enum EWebGLFeatures\r
24                 {\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
27 \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
47 \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
53                         IRR_EXT_sRGB, // 17\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
61 \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
68 \r
69                         IRR_WEBGL_Feature_Count\r
70                 };\r
71 \r
72                 CWebGLExtensionHandler()\r
73                 {\r
74                         for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)\r
75                                 FeatureAvailable[i] = false;\r
76                 }\r
77 \r
78                 virtual ~CWebGLExtensionHandler() {}\r
79 \r
80                 void dump() const\r
81                 {\r
82                         for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)\r
83                                 os::Printer::log(getFeatureString(i), FeatureAvailable[i] ? " true" : " false");\r
84                 }\r
85 \r
86                 bool queryWebGLFeature(EWebGLFeatures feature) const\r
87                 {\r
88                         return FeatureAvailable[feature];\r
89                 }\r
90 \r
91                 void getGLExtensions()\r
92                 {\r
93                         core::stringc extensions = glGetString(GL_EXTENSIONS);\r
94                         os::Printer::log(extensions.c_str());\r
95 \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
100                         c8* p = str;\r
101 \r
102                         for (u32 i=0; i<size; ++i)\r
103                         {\r
104                                 if (str[i] == ' ')\r
105                                 {\r
106                                         str[i] = 0;\r
107                                         if (*p)\r
108                                                 for (size_t j=0; j<IRR_WEBGL_Feature_Count; ++j)\r
109                                                 {\r
110                                                         if (!strcmp(getFeatureString(j), p))\r
111                                                         {\r
112                                                                 FeatureAvailable[j] = true;\r
113                                                                 break;\r
114                                                         }\r
115                                                 }\r
116 \r
117                                         p = p + strlen(p) + 1;\r
118                                 }\r
119                         }\r
120 \r
121                         delete[] str;\r
122                 }\r
123 \r
124 \r
125         protected:\r
126 \r
127                 const char* getFeatureString(size_t index) const\r
128                 {\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
132                         {\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
144                                 "EXT_frag_depth",\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
151 \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
156                                 "EXT_sRGB",\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
164 \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
169                                 "EXT_float_blend"\r
170                         };\r
171 \r
172                         return WebGLFeatureStrings[index];\r
173                 }\r
174 \r
175                 bool FeatureAvailable[IRR_WEBGL_Feature_Count];\r
176         };\r
177 }\r
178 }\r
179 \r
180 #endif // defined(_IRR_COMPILE_WITH_WEBGL1_)\r
181 #endif // __E_WEGL1_EXTENSION_HANDLER_H_INCLUDED__\r