Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #ifndef WEBGL_STRONG_TYPES_H_
7 : #define WEBGL_STRONG_TYPES_H_
8 :
9 : #include <algorithm>
10 :
11 : #include "GLDefs.h"
12 : #include "mozilla/ArrayUtils.h"
13 : #include "mozilla/Assertions.h"
14 : #include "mozilla/Attributes.h"
15 :
16 : /* Usage:
17 : * ===========
18 : *
19 : * To create a new type from a set of GLenums do the following:
20 : *
21 : * STRONG_GLENUM_BEGIN(TypeName)
22 : * STRONG_GLENUM_VALUE(ENUM1),
23 : * STRONG_GLENUM_VALUE(ENUM2),
24 : * ...
25 : * STRONG_GLENUM_END()
26 : *
27 : * where TypeName is the name you want to give the type. Now simply use TypeName
28 : * instead of GLenum. The enum values must be given without GL_ prefix.
29 : *
30 : * ~~~~~~~~~~~~~~~~
31 : * Important Notes:
32 : * ~~~~~~~~~~~~~~~~
33 : *
34 : * Boolean operators (==, !=) are provided in an effort to prevent some mistakes
35 : * when using constants. For example we want to make sure that GL_ENUM_X is
36 : * a valid value for the type in code like:
37 : *
38 : * if (myNewType == STRONG_GLENUM_VALUE(SOME_ENUM))
39 : * ...
40 : *
41 : * The operators will assert that STRONG_GLENUM_VALUE(SOME_ENUM) is a value that
42 : * myNewType can have.
43 : *
44 : * ----
45 : *
46 : * A get() method is provided to allow access to the underlying GLenum. This
47 : * method should ideally only be called when passing parameters to the gl->fXXXX
48 : * functions, and be used very minimally everywhere else.
49 : *
50 : * Definitely XXX - DO NOT DO - XXX:
51 : *
52 : * if (myNewType.get() == STRONG_GLENUM_VALUE(SOME_ENUM))
53 : * ...
54 : *
55 : * As that undermines the debug checks that were implemented in the ==, and !=
56 : * operators. If you see code like this it should be treated with suspicion.
57 : *
58 : * Background:
59 : * ===========
60 : *
61 : * This macro is the first step in an effort to make the WebGL code safer.
62 : * Many of the different functions take GLenum as their parameter which leads
63 : * to bugs because of subtle differences in the enums purpose. For example there
64 : * are two types of 'texture targets'. One is the texture binding locations:
65 : *
66 : * GL_TEXTURE_2D
67 : * GL_TEXTURE_CUBE_MAP
68 : *
69 : * Yet, this is not the same as texture image targets:
70 : *
71 : * GL_TEXTURE_2D
72 : * GL_TEXTURE_CUBE_MAP_POSITIVE_X
73 : * GL_TEXTURE_CUBE_MAP_NEGATIVE_X
74 : * GL_TEXTURE_CUBE_MAP_POSITIVE_Y
75 : * ...
76 : *
77 : * This subtle distinction has already led to many bugs in the texture code
78 : * because of invalid assumptions about what type goes where. The macro below
79 : * is an attempt at fixing this by providing a small wrapper around GLenum that
80 : * validates its values.
81 : *
82 : * Comparison between STRONG_GLENUM's vs. enum classes
83 : * ===================================================
84 : *
85 : * The present STRONG_GLENUM's differ from ordinary enum classes
86 : * in that they assert at runtime that their values are legal, and in that they
87 : * allow implicit conversion from integers to STRONG_GLENUM's but disallow
88 : * implicit conversion from STRONG_GLENUM's to integers (enum classes are the
89 : * opposite).
90 : *
91 : * When to use GLenum's vs. STRONG_GLENUM's vs. enum classes
92 : * =========================================================
93 : *
94 : * Rule of thumb:
95 : * * For unchecked GLenum constants, such as WebGL method parameters that
96 : * haven't been validated yet, use GLenum.
97 : * * For already-validated GLenum constants, use STRONG_GLENUM's.
98 : * * For custom constants that aren't GL enum values, use enum classes.
99 : */
100 :
101 : template<typename Details>
102 : class StrongGLenum final
103 : {
104 : private:
105 : static const GLenum NonexistantGLenum = 0xdeaddead;
106 :
107 : GLenum mValue;
108 :
109 0 : static void AssertOnceThatEnumValuesAreSorted() {
110 : #ifdef DEBUG
111 : static bool alreadyChecked = false;
112 0 : if (alreadyChecked) {
113 0 : return;
114 : }
115 0 : for (size_t i = 1; i < Details::valuesCount(); i++) {
116 0 : MOZ_ASSERT(Details::values()[i] > Details::values()[i - 1],
117 : "GLenum values should be sorted in ascending order");
118 : }
119 0 : alreadyChecked = true;
120 : #endif
121 : }
122 :
123 : public:
124 0 : StrongGLenum()
125 : #ifdef DEBUG
126 0 : : mValue(NonexistantGLenum)
127 : #endif
128 : {
129 0 : AssertOnceThatEnumValuesAreSorted();
130 0 : }
131 :
132 0 : MOZ_IMPLICIT StrongGLenum(GLenum value)
133 0 : : mValue(value)
134 : {
135 0 : AssertOnceThatEnumValuesAreSorted();
136 0 : MOZ_ASSERT(IsValueLegal(mValue));
137 0 : }
138 :
139 0 : GLenum get() const {
140 0 : MOZ_ASSERT(mValue != NonexistantGLenum);
141 0 : return mValue;
142 : }
143 :
144 : bool operator==(const StrongGLenum& other) const {
145 : return get() == other.get();
146 : }
147 :
148 0 : bool operator!=(const StrongGLenum& other) const {
149 0 : return get() != other.get();
150 : }
151 :
152 : bool operator<=(const StrongGLenum& other) const {
153 : return get() <= other.get();
154 : }
155 :
156 : bool operator>=(const StrongGLenum& other) const {
157 : return get() >= other.get();
158 : }
159 :
160 0 : static bool IsValueLegal(GLenum value) {
161 0 : if (value > UINT16_MAX) {
162 0 : return false;
163 : }
164 0 : return std::binary_search(Details::values(),
165 0 : Details::values() + Details::valuesCount(),
166 0 : uint16_t(value));
167 : }
168 : };
169 :
170 : template<typename Details>
171 : bool operator==(GLenum a, StrongGLenum<Details> b)
172 : {
173 : return a == b.get();
174 : }
175 :
176 : template<typename Details>
177 : bool operator!=(GLenum a, StrongGLenum<Details> b)
178 : {
179 : return a != b.get();
180 : }
181 :
182 : template<typename Details>
183 0 : bool operator==(StrongGLenum<Details> a, GLenum b)
184 : {
185 0 : return a.get() == b;
186 : }
187 :
188 : template<typename Details>
189 0 : bool operator!=(StrongGLenum<Details> a, GLenum b)
190 : {
191 0 : return a.get() != b;
192 : }
193 :
194 : #define STRONG_GLENUM_BEGIN(NAME) \
195 : const uint16_t NAME##Values[] = {
196 :
197 : #define STRONG_GLENUM_VALUE(VALUE) LOCAL_GL_##VALUE
198 :
199 : #define STRONG_GLENUM_END(NAME) \
200 : }; \
201 : struct NAME##Details { \
202 : static size_t valuesCount() { return MOZ_ARRAY_LENGTH(NAME##Values); } \
203 : static const uint16_t* values() { return NAME##Values; } \
204 : }; \
205 : typedef StrongGLenum<NAME##Details> NAME;
206 :
207 : ////////////////////////////////////////////////////////////////////////////////
208 : // Add types below.
209 :
210 : STRONG_GLENUM_BEGIN(TexImageTarget)
211 : STRONG_GLENUM_VALUE(NONE),
212 : STRONG_GLENUM_VALUE(TEXTURE_2D),
213 : STRONG_GLENUM_VALUE(TEXTURE_3D),
214 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_POSITIVE_X),
215 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_NEGATIVE_X),
216 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_POSITIVE_Y),
217 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_NEGATIVE_Y),
218 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_POSITIVE_Z),
219 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP_NEGATIVE_Z),
220 : STRONG_GLENUM_VALUE(TEXTURE_2D_ARRAY),
221 0 : STRONG_GLENUM_END(TexImageTarget)
222 :
223 : STRONG_GLENUM_BEGIN(TexTarget)
224 : STRONG_GLENUM_VALUE(NONE),
225 : STRONG_GLENUM_VALUE(TEXTURE_2D),
226 : STRONG_GLENUM_VALUE(TEXTURE_3D),
227 : STRONG_GLENUM_VALUE(TEXTURE_CUBE_MAP),
228 : STRONG_GLENUM_VALUE(TEXTURE_2D_ARRAY),
229 0 : STRONG_GLENUM_END(TexTarget)
230 :
231 : STRONG_GLENUM_BEGIN(TexType)
232 : STRONG_GLENUM_VALUE(NONE),
233 : STRONG_GLENUM_VALUE(BYTE),
234 : STRONG_GLENUM_VALUE(UNSIGNED_BYTE),
235 : STRONG_GLENUM_VALUE(SHORT),
236 : STRONG_GLENUM_VALUE(UNSIGNED_SHORT),
237 : STRONG_GLENUM_VALUE(INT),
238 : STRONG_GLENUM_VALUE(UNSIGNED_INT),
239 : STRONG_GLENUM_VALUE(FLOAT),
240 : STRONG_GLENUM_VALUE(HALF_FLOAT),
241 : STRONG_GLENUM_VALUE(UNSIGNED_SHORT_4_4_4_4),
242 : STRONG_GLENUM_VALUE(UNSIGNED_SHORT_5_5_5_1),
243 : STRONG_GLENUM_VALUE(UNSIGNED_SHORT_5_6_5),
244 : STRONG_GLENUM_VALUE(UNSIGNED_INT_2_10_10_10_REV),
245 : STRONG_GLENUM_VALUE(UNSIGNED_INT_24_8),
246 : STRONG_GLENUM_VALUE(UNSIGNED_INT_10F_11F_11F_REV),
247 : STRONG_GLENUM_VALUE(UNSIGNED_INT_5_9_9_9_REV),
248 : STRONG_GLENUM_VALUE(HALF_FLOAT_OES),
249 : STRONG_GLENUM_VALUE(FLOAT_32_UNSIGNED_INT_24_8_REV),
250 : STRONG_GLENUM_END(TexType)
251 :
252 : STRONG_GLENUM_BEGIN(TexMinFilter)
253 : STRONG_GLENUM_VALUE(NEAREST),
254 : STRONG_GLENUM_VALUE(LINEAR),
255 : STRONG_GLENUM_VALUE(NEAREST_MIPMAP_NEAREST),
256 : STRONG_GLENUM_VALUE(LINEAR_MIPMAP_NEAREST),
257 : STRONG_GLENUM_VALUE(NEAREST_MIPMAP_LINEAR),
258 : STRONG_GLENUM_VALUE(LINEAR_MIPMAP_LINEAR),
259 0 : STRONG_GLENUM_END(TexMinFilter)
260 :
261 : STRONG_GLENUM_BEGIN(TexMagFilter)
262 : STRONG_GLENUM_VALUE(NEAREST),
263 : STRONG_GLENUM_VALUE(LINEAR),
264 0 : STRONG_GLENUM_END(TexMagFilter)
265 :
266 : STRONG_GLENUM_BEGIN(TexWrap)
267 : STRONG_GLENUM_VALUE(REPEAT),
268 : STRONG_GLENUM_VALUE(CLAMP_TO_EDGE),
269 : STRONG_GLENUM_VALUE(MIRRORED_REPEAT),
270 0 : STRONG_GLENUM_END(TexWrap)
271 :
272 : STRONG_GLENUM_BEGIN(TexCompareMode)
273 : STRONG_GLENUM_VALUE(NONE),
274 : STRONG_GLENUM_VALUE(COMPARE_REF_TO_TEXTURE),
275 0 : STRONG_GLENUM_END(TexCompareMode)
276 :
277 : STRONG_GLENUM_BEGIN(TexCompareFunc)
278 : STRONG_GLENUM_VALUE(NEVER),
279 : STRONG_GLENUM_VALUE(LESS),
280 : STRONG_GLENUM_VALUE(EQUAL),
281 : STRONG_GLENUM_VALUE(LEQUAL),
282 : STRONG_GLENUM_VALUE(GREATER),
283 : STRONG_GLENUM_VALUE(NOTEQUAL),
284 : STRONG_GLENUM_VALUE(GEQUAL),
285 : STRONG_GLENUM_VALUE(ALWAYS),
286 0 : STRONG_GLENUM_END(TexCompareFunc)
287 :
288 : STRONG_GLENUM_BEGIN(TexFormat)
289 : STRONG_GLENUM_VALUE(NONE), // 0x0000
290 : STRONG_GLENUM_VALUE(DEPTH_COMPONENT), // 0x1902
291 : STRONG_GLENUM_VALUE(RED), // 0x1903
292 : STRONG_GLENUM_VALUE(ALPHA), // 0x1906
293 : STRONG_GLENUM_VALUE(RGB), // 0x1907
294 : STRONG_GLENUM_VALUE(RGBA), // 0x1908
295 : STRONG_GLENUM_VALUE(LUMINANCE), // 0x1909
296 : STRONG_GLENUM_VALUE(LUMINANCE_ALPHA), // 0x190A
297 : STRONG_GLENUM_VALUE(RG), // 0x8227
298 : STRONG_GLENUM_VALUE(RG_INTEGER), // 0x8228
299 : STRONG_GLENUM_VALUE(DEPTH_STENCIL), // 0x84F9
300 : STRONG_GLENUM_VALUE(SRGB), // 0x8C40
301 : STRONG_GLENUM_VALUE(SRGB_ALPHA), // 0x8C42
302 : STRONG_GLENUM_VALUE(RED_INTEGER), // 0x8D94
303 : STRONG_GLENUM_VALUE(RGB_INTEGER), // 0x8D98
304 : STRONG_GLENUM_VALUE(RGBA_INTEGER), // 0x8D99
305 : STRONG_GLENUM_END(TexFormat)
306 :
307 : STRONG_GLENUM_BEGIN(TexInternalFormat)
308 : STRONG_GLENUM_VALUE(NONE),
309 : STRONG_GLENUM_VALUE(DEPTH_COMPONENT),
310 : STRONG_GLENUM_VALUE(RED),
311 : STRONG_GLENUM_VALUE(ALPHA),
312 : STRONG_GLENUM_VALUE(RGB),
313 : STRONG_GLENUM_VALUE(RGBA),
314 : STRONG_GLENUM_VALUE(LUMINANCE),
315 : STRONG_GLENUM_VALUE(LUMINANCE_ALPHA),
316 : STRONG_GLENUM_VALUE(ALPHA8),
317 : STRONG_GLENUM_VALUE(LUMINANCE8),
318 : STRONG_GLENUM_VALUE(LUMINANCE8_ALPHA8),
319 : STRONG_GLENUM_VALUE(RGB8),
320 : STRONG_GLENUM_VALUE(RGBA4),
321 : STRONG_GLENUM_VALUE(RGB5_A1),
322 : STRONG_GLENUM_VALUE(RGBA8),
323 : STRONG_GLENUM_VALUE(RGB10_A2),
324 : STRONG_GLENUM_VALUE(DEPTH_COMPONENT16),
325 : STRONG_GLENUM_VALUE(DEPTH_COMPONENT24),
326 : STRONG_GLENUM_VALUE(RG),
327 : STRONG_GLENUM_VALUE(RG_INTEGER),
328 : STRONG_GLENUM_VALUE(R8),
329 : STRONG_GLENUM_VALUE(RG8),
330 : STRONG_GLENUM_VALUE(R16F),
331 : STRONG_GLENUM_VALUE(R32F),
332 : STRONG_GLENUM_VALUE(RG16F),
333 : STRONG_GLENUM_VALUE(RG32F),
334 : STRONG_GLENUM_VALUE(R8I),
335 : STRONG_GLENUM_VALUE(R8UI),
336 : STRONG_GLENUM_VALUE(R16I),
337 : STRONG_GLENUM_VALUE(R16UI),
338 : STRONG_GLENUM_VALUE(R32I),
339 : STRONG_GLENUM_VALUE(R32UI),
340 : STRONG_GLENUM_VALUE(RG8I),
341 : STRONG_GLENUM_VALUE(RG8UI),
342 : STRONG_GLENUM_VALUE(RG16I),
343 : STRONG_GLENUM_VALUE(RG16UI),
344 : STRONG_GLENUM_VALUE(RG32I),
345 : STRONG_GLENUM_VALUE(RG32UI),
346 : STRONG_GLENUM_VALUE(COMPRESSED_RGB_S3TC_DXT1_EXT),
347 : STRONG_GLENUM_VALUE(COMPRESSED_RGBA_S3TC_DXT1_EXT),
348 : STRONG_GLENUM_VALUE(COMPRESSED_RGBA_S3TC_DXT3_EXT),
349 : STRONG_GLENUM_VALUE(COMPRESSED_RGBA_S3TC_DXT5_EXT),
350 : STRONG_GLENUM_VALUE(COMPRESSED_SRGB_S3TC_DXT1_EXT),
351 : STRONG_GLENUM_VALUE(COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT),
352 : STRONG_GLENUM_VALUE(COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT),
353 : STRONG_GLENUM_VALUE(COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT),
354 : STRONG_GLENUM_VALUE(DEPTH_STENCIL),
355 : STRONG_GLENUM_VALUE(ATC_RGBA_INTERPOLATED_ALPHA),
356 : STRONG_GLENUM_VALUE(RGBA32F),
357 : STRONG_GLENUM_VALUE(RGB32F),
358 : STRONG_GLENUM_VALUE(ALPHA32F_EXT),
359 : STRONG_GLENUM_VALUE(LUMINANCE32F_EXT),
360 : STRONG_GLENUM_VALUE(LUMINANCE_ALPHA32F_EXT),
361 : STRONG_GLENUM_VALUE(RGBA16F),
362 : STRONG_GLENUM_VALUE(RGB16F),
363 : STRONG_GLENUM_VALUE(ALPHA16F_EXT),
364 : STRONG_GLENUM_VALUE(LUMINANCE16F_EXT),
365 : STRONG_GLENUM_VALUE(LUMINANCE_ALPHA16F_EXT),
366 : STRONG_GLENUM_VALUE(DEPTH24_STENCIL8),
367 : STRONG_GLENUM_VALUE(COMPRESSED_RGB_PVRTC_4BPPV1),
368 : STRONG_GLENUM_VALUE(COMPRESSED_RGB_PVRTC_2BPPV1),
369 : STRONG_GLENUM_VALUE(COMPRESSED_RGBA_PVRTC_4BPPV1),
370 : STRONG_GLENUM_VALUE(COMPRESSED_RGBA_PVRTC_2BPPV1),
371 : STRONG_GLENUM_VALUE(R11F_G11F_B10F),
372 : STRONG_GLENUM_VALUE(RGB9_E5),
373 : STRONG_GLENUM_VALUE(SRGB),
374 : STRONG_GLENUM_VALUE(SRGB8),
375 : STRONG_GLENUM_VALUE(SRGB_ALPHA),
376 : STRONG_GLENUM_VALUE(SRGB8_ALPHA8),
377 : STRONG_GLENUM_VALUE(ATC_RGB),
378 : STRONG_GLENUM_VALUE(ATC_RGBA_EXPLICIT_ALPHA),
379 : STRONG_GLENUM_VALUE(DEPTH_COMPONENT32F),
380 : STRONG_GLENUM_VALUE(DEPTH32F_STENCIL8),
381 : STRONG_GLENUM_VALUE(RGB565),
382 : STRONG_GLENUM_VALUE(ETC1_RGB8_OES),
383 : STRONG_GLENUM_VALUE(RGBA32UI),
384 : STRONG_GLENUM_VALUE(RGB32UI),
385 : STRONG_GLENUM_VALUE(RGBA16UI),
386 : STRONG_GLENUM_VALUE(RGB16UI),
387 : STRONG_GLENUM_VALUE(RGBA8UI),
388 : STRONG_GLENUM_VALUE(RGB8UI),
389 : STRONG_GLENUM_VALUE(RGBA32I),
390 : STRONG_GLENUM_VALUE(RGB32I),
391 : STRONG_GLENUM_VALUE(RGBA16I),
392 : STRONG_GLENUM_VALUE(RGB16I),
393 : STRONG_GLENUM_VALUE(RGBA8I),
394 : STRONG_GLENUM_VALUE(RGB8I),
395 : STRONG_GLENUM_VALUE(RED_INTEGER),
396 : STRONG_GLENUM_VALUE(RGB_INTEGER),
397 : STRONG_GLENUM_VALUE(RGBA_INTEGER),
398 : STRONG_GLENUM_VALUE(R8_SNORM),
399 : STRONG_GLENUM_VALUE(RG8_SNORM),
400 : STRONG_GLENUM_VALUE(RGB8_SNORM),
401 : STRONG_GLENUM_VALUE(RGBA8_SNORM),
402 : STRONG_GLENUM_VALUE(RGB10_A2UI),
403 : STRONG_GLENUM_END(TexInternalFormat)
404 :
405 : STRONG_GLENUM_BEGIN(FBTarget)
406 : STRONG_GLENUM_VALUE(NONE),
407 : STRONG_GLENUM_VALUE(READ_FRAMEBUFFER),
408 : STRONG_GLENUM_VALUE(DRAW_FRAMEBUFFER),
409 : STRONG_GLENUM_VALUE(FRAMEBUFFER),
410 0 : STRONG_GLENUM_END(FBTarget)
411 :
412 : STRONG_GLENUM_BEGIN(RBTarget)
413 : STRONG_GLENUM_VALUE(NONE),
414 : STRONG_GLENUM_VALUE(RENDERBUFFER),
415 0 : STRONG_GLENUM_END(RBTarget)
416 :
417 : STRONG_GLENUM_BEGIN(FBStatus)
418 : STRONG_GLENUM_VALUE(FRAMEBUFFER_COMPLETE),
419 : STRONG_GLENUM_VALUE(FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
420 : STRONG_GLENUM_VALUE(FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
421 : STRONG_GLENUM_VALUE(FRAMEBUFFER_INCOMPLETE_DIMENSIONS),
422 : STRONG_GLENUM_VALUE(FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER),
423 : STRONG_GLENUM_VALUE(FRAMEBUFFER_INCOMPLETE_READ_BUFFER),
424 : STRONG_GLENUM_VALUE(FRAMEBUFFER_UNSUPPORTED),
425 0 : STRONG_GLENUM_END(FBStatus)
426 :
427 : STRONG_GLENUM_BEGIN(RBParam)
428 : STRONG_GLENUM_VALUE(RENDERBUFFER_SAMPLES),
429 : STRONG_GLENUM_VALUE(RENDERBUFFER_WIDTH),
430 : STRONG_GLENUM_VALUE(RENDERBUFFER_HEIGHT),
431 : STRONG_GLENUM_VALUE(RENDERBUFFER_INTERNAL_FORMAT),
432 : STRONG_GLENUM_VALUE(RENDERBUFFER_RED_SIZE),
433 : STRONG_GLENUM_VALUE(RENDERBUFFER_GREEN_SIZE),
434 : STRONG_GLENUM_VALUE(RENDERBUFFER_BLUE_SIZE),
435 : STRONG_GLENUM_VALUE(RENDERBUFFER_ALPHA_SIZE),
436 : STRONG_GLENUM_VALUE(RENDERBUFFER_DEPTH_SIZE),
437 : STRONG_GLENUM_VALUE(RENDERBUFFER_STENCIL_SIZE),
438 0 : STRONG_GLENUM_END(RBParam)
439 :
440 : STRONG_GLENUM_BEGIN(VAOBinding)
441 : STRONG_GLENUM_VALUE(NONE),
442 : STRONG_GLENUM_VALUE(VERTEX_ARRAY_BINDING),
443 : STRONG_GLENUM_END(VAOBinding)
444 :
445 : STRONG_GLENUM_BEGIN(BufferBinding)
446 : STRONG_GLENUM_VALUE(NONE), // 0x0000
447 : STRONG_GLENUM_VALUE(ARRAY_BUFFER), // 0x8892
448 : STRONG_GLENUM_VALUE(ELEMENT_ARRAY_BUFFER), // 0x8893
449 : STRONG_GLENUM_VALUE(PIXEL_PACK_BUFFER), // 0x88EB
450 : STRONG_GLENUM_VALUE(PIXEL_UNPACK_BUFFER), // 0x88EC
451 : STRONG_GLENUM_VALUE(UNIFORM_BUFFER), // 0x8A11
452 : STRONG_GLENUM_VALUE(TRANSFORM_FEEDBACK_BUFFER), // 0x8C8E
453 : STRONG_GLENUM_END(BufferBinding)
454 :
455 : STRONG_GLENUM_BEGIN(QueryBinding)
456 : STRONG_GLENUM_VALUE(NONE),
457 : STRONG_GLENUM_VALUE(TIME_ELAPSED_EXT),
458 : STRONG_GLENUM_VALUE(TIMESTAMP_EXT),
459 : STRONG_GLENUM_END(QueryBinding)
460 :
461 : #endif // WEBGL_STRONG_TYPES_H_
|