LCOV - code coverage report
Current view: top level - dom/canvas - WebGLStrongTypes.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 41 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 78 0.0 %
Legend: Lines: hit not hit

          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_

Generated by: LCOV version 1.13