tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

PackedGLEnums_autogen.cpp (69784B)


      1 // GENERATED FILE - DO NOT EDIT.
      2 // Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json.
      3 //
      4 // Copyright 2017 The ANGLE Project Authors. All rights reserved.
      5 // Use of this source code is governed by a BSD-style license that can be
      6 // found in the LICENSE file.
      7 //
      8 // PackedGLEnums_autogen.cpp:
      9 //   Implements ANGLE-specific enums classes for GLenums and functions operating
     10 //   on them.
     11 
     12 #include "common/PackedGLEnums_autogen.h"
     13 #include "common/debug.h"
     14 
     15 namespace gl
     16 {
     17 
     18 template <>
     19 AlphaTestFunc FromGLenum<AlphaTestFunc>(GLenum from)
     20 {
     21    switch (from)
     22    {
     23        case GL_ALWAYS:
     24            return AlphaTestFunc::AlwaysPass;
     25        case GL_EQUAL:
     26            return AlphaTestFunc::Equal;
     27        case GL_GEQUAL:
     28            return AlphaTestFunc::Gequal;
     29        case GL_GREATER:
     30            return AlphaTestFunc::Greater;
     31        case GL_LEQUAL:
     32            return AlphaTestFunc::Lequal;
     33        case GL_LESS:
     34            return AlphaTestFunc::Less;
     35        case GL_NEVER:
     36            return AlphaTestFunc::Never;
     37        case GL_NOTEQUAL:
     38            return AlphaTestFunc::NotEqual;
     39        default:
     40            return AlphaTestFunc::InvalidEnum;
     41    }
     42 }
     43 
     44 GLenum ToGLenum(AlphaTestFunc from)
     45 {
     46    switch (from)
     47    {
     48        case AlphaTestFunc::AlwaysPass:
     49            return GL_ALWAYS;
     50        case AlphaTestFunc::Equal:
     51            return GL_EQUAL;
     52        case AlphaTestFunc::Gequal:
     53            return GL_GEQUAL;
     54        case AlphaTestFunc::Greater:
     55            return GL_GREATER;
     56        case AlphaTestFunc::Lequal:
     57            return GL_LEQUAL;
     58        case AlphaTestFunc::Less:
     59            return GL_LESS;
     60        case AlphaTestFunc::Never:
     61            return GL_NEVER;
     62        case AlphaTestFunc::NotEqual:
     63            return GL_NOTEQUAL;
     64        default:
     65            UNREACHABLE();
     66            return 0;
     67    }
     68 }
     69 
     70 std::ostream &operator<<(std::ostream &os, AlphaTestFunc value)
     71 {
     72    switch (value)
     73    {
     74        case AlphaTestFunc::AlwaysPass:
     75            os << "GL_ALWAYS";
     76            break;
     77        case AlphaTestFunc::Equal:
     78            os << "GL_EQUAL";
     79            break;
     80        case AlphaTestFunc::Gequal:
     81            os << "GL_GEQUAL";
     82            break;
     83        case AlphaTestFunc::Greater:
     84            os << "GL_GREATER";
     85            break;
     86        case AlphaTestFunc::Lequal:
     87            os << "GL_LEQUAL";
     88            break;
     89        case AlphaTestFunc::Less:
     90            os << "GL_LESS";
     91            break;
     92        case AlphaTestFunc::Never:
     93            os << "GL_NEVER";
     94            break;
     95        case AlphaTestFunc::NotEqual:
     96            os << "GL_NOTEQUAL";
     97            break;
     98        default:
     99            os << "GL_INVALID_ENUM";
    100            break;
    101    }
    102    return os;
    103 }
    104 
    105 template <>
    106 BufferBinding FromGLenum<BufferBinding>(GLenum from)
    107 {
    108    switch (from)
    109    {
    110        case GL_ARRAY_BUFFER:
    111            return BufferBinding::Array;
    112        case GL_ATOMIC_COUNTER_BUFFER:
    113            return BufferBinding::AtomicCounter;
    114        case GL_COPY_READ_BUFFER:
    115            return BufferBinding::CopyRead;
    116        case GL_COPY_WRITE_BUFFER:
    117            return BufferBinding::CopyWrite;
    118        case GL_DISPATCH_INDIRECT_BUFFER:
    119            return BufferBinding::DispatchIndirect;
    120        case GL_DRAW_INDIRECT_BUFFER:
    121            return BufferBinding::DrawIndirect;
    122        case GL_ELEMENT_ARRAY_BUFFER:
    123            return BufferBinding::ElementArray;
    124        case GL_PIXEL_PACK_BUFFER:
    125            return BufferBinding::PixelPack;
    126        case GL_PIXEL_UNPACK_BUFFER:
    127            return BufferBinding::PixelUnpack;
    128        case GL_SHADER_STORAGE_BUFFER:
    129            return BufferBinding::ShaderStorage;
    130        case GL_TEXTURE_BUFFER:
    131            return BufferBinding::Texture;
    132        case GL_TRANSFORM_FEEDBACK_BUFFER:
    133            return BufferBinding::TransformFeedback;
    134        case GL_UNIFORM_BUFFER:
    135            return BufferBinding::Uniform;
    136        default:
    137            return BufferBinding::InvalidEnum;
    138    }
    139 }
    140 
    141 GLenum ToGLenum(BufferBinding from)
    142 {
    143    switch (from)
    144    {
    145        case BufferBinding::Array:
    146            return GL_ARRAY_BUFFER;
    147        case BufferBinding::AtomicCounter:
    148            return GL_ATOMIC_COUNTER_BUFFER;
    149        case BufferBinding::CopyRead:
    150            return GL_COPY_READ_BUFFER;
    151        case BufferBinding::CopyWrite:
    152            return GL_COPY_WRITE_BUFFER;
    153        case BufferBinding::DispatchIndirect:
    154            return GL_DISPATCH_INDIRECT_BUFFER;
    155        case BufferBinding::DrawIndirect:
    156            return GL_DRAW_INDIRECT_BUFFER;
    157        case BufferBinding::ElementArray:
    158            return GL_ELEMENT_ARRAY_BUFFER;
    159        case BufferBinding::PixelPack:
    160            return GL_PIXEL_PACK_BUFFER;
    161        case BufferBinding::PixelUnpack:
    162            return GL_PIXEL_UNPACK_BUFFER;
    163        case BufferBinding::ShaderStorage:
    164            return GL_SHADER_STORAGE_BUFFER;
    165        case BufferBinding::Texture:
    166            return GL_TEXTURE_BUFFER;
    167        case BufferBinding::TransformFeedback:
    168            return GL_TRANSFORM_FEEDBACK_BUFFER;
    169        case BufferBinding::Uniform:
    170            return GL_UNIFORM_BUFFER;
    171        default:
    172            UNREACHABLE();
    173            return 0;
    174    }
    175 }
    176 
    177 std::ostream &operator<<(std::ostream &os, BufferBinding value)
    178 {
    179    switch (value)
    180    {
    181        case BufferBinding::Array:
    182            os << "GL_ARRAY_BUFFER";
    183            break;
    184        case BufferBinding::AtomicCounter:
    185            os << "GL_ATOMIC_COUNTER_BUFFER";
    186            break;
    187        case BufferBinding::CopyRead:
    188            os << "GL_COPY_READ_BUFFER";
    189            break;
    190        case BufferBinding::CopyWrite:
    191            os << "GL_COPY_WRITE_BUFFER";
    192            break;
    193        case BufferBinding::DispatchIndirect:
    194            os << "GL_DISPATCH_INDIRECT_BUFFER";
    195            break;
    196        case BufferBinding::DrawIndirect:
    197            os << "GL_DRAW_INDIRECT_BUFFER";
    198            break;
    199        case BufferBinding::ElementArray:
    200            os << "GL_ELEMENT_ARRAY_BUFFER";
    201            break;
    202        case BufferBinding::PixelPack:
    203            os << "GL_PIXEL_PACK_BUFFER";
    204            break;
    205        case BufferBinding::PixelUnpack:
    206            os << "GL_PIXEL_UNPACK_BUFFER";
    207            break;
    208        case BufferBinding::ShaderStorage:
    209            os << "GL_SHADER_STORAGE_BUFFER";
    210            break;
    211        case BufferBinding::Texture:
    212            os << "GL_TEXTURE_BUFFER";
    213            break;
    214        case BufferBinding::TransformFeedback:
    215            os << "GL_TRANSFORM_FEEDBACK_BUFFER";
    216            break;
    217        case BufferBinding::Uniform:
    218            os << "GL_UNIFORM_BUFFER";
    219            break;
    220        default:
    221            os << "GL_INVALID_ENUM";
    222            break;
    223    }
    224    return os;
    225 }
    226 
    227 template <>
    228 BufferUsage FromGLenum<BufferUsage>(GLenum from)
    229 {
    230    switch (from)
    231    {
    232        case GL_DYNAMIC_COPY:
    233            return BufferUsage::DynamicCopy;
    234        case GL_DYNAMIC_DRAW:
    235            return BufferUsage::DynamicDraw;
    236        case GL_DYNAMIC_READ:
    237            return BufferUsage::DynamicRead;
    238        case GL_STATIC_COPY:
    239            return BufferUsage::StaticCopy;
    240        case GL_STATIC_DRAW:
    241            return BufferUsage::StaticDraw;
    242        case GL_STATIC_READ:
    243            return BufferUsage::StaticRead;
    244        case GL_STREAM_COPY:
    245            return BufferUsage::StreamCopy;
    246        case GL_STREAM_DRAW:
    247            return BufferUsage::StreamDraw;
    248        case GL_STREAM_READ:
    249            return BufferUsage::StreamRead;
    250        default:
    251            return BufferUsage::InvalidEnum;
    252    }
    253 }
    254 
    255 GLenum ToGLenum(BufferUsage from)
    256 {
    257    switch (from)
    258    {
    259        case BufferUsage::DynamicCopy:
    260            return GL_DYNAMIC_COPY;
    261        case BufferUsage::DynamicDraw:
    262            return GL_DYNAMIC_DRAW;
    263        case BufferUsage::DynamicRead:
    264            return GL_DYNAMIC_READ;
    265        case BufferUsage::StaticCopy:
    266            return GL_STATIC_COPY;
    267        case BufferUsage::StaticDraw:
    268            return GL_STATIC_DRAW;
    269        case BufferUsage::StaticRead:
    270            return GL_STATIC_READ;
    271        case BufferUsage::StreamCopy:
    272            return GL_STREAM_COPY;
    273        case BufferUsage::StreamDraw:
    274            return GL_STREAM_DRAW;
    275        case BufferUsage::StreamRead:
    276            return GL_STREAM_READ;
    277        default:
    278            UNREACHABLE();
    279            return 0;
    280    }
    281 }
    282 
    283 std::ostream &operator<<(std::ostream &os, BufferUsage value)
    284 {
    285    switch (value)
    286    {
    287        case BufferUsage::DynamicCopy:
    288            os << "GL_DYNAMIC_COPY";
    289            break;
    290        case BufferUsage::DynamicDraw:
    291            os << "GL_DYNAMIC_DRAW";
    292            break;
    293        case BufferUsage::DynamicRead:
    294            os << "GL_DYNAMIC_READ";
    295            break;
    296        case BufferUsage::StaticCopy:
    297            os << "GL_STATIC_COPY";
    298            break;
    299        case BufferUsage::StaticDraw:
    300            os << "GL_STATIC_DRAW";
    301            break;
    302        case BufferUsage::StaticRead:
    303            os << "GL_STATIC_READ";
    304            break;
    305        case BufferUsage::StreamCopy:
    306            os << "GL_STREAM_COPY";
    307            break;
    308        case BufferUsage::StreamDraw:
    309            os << "GL_STREAM_DRAW";
    310            break;
    311        case BufferUsage::StreamRead:
    312            os << "GL_STREAM_READ";
    313            break;
    314        default:
    315            os << "GL_INVALID_ENUM";
    316            break;
    317    }
    318    return os;
    319 }
    320 
    321 template <>
    322 ClientVertexArrayType FromGLenum<ClientVertexArrayType>(GLenum from)
    323 {
    324    switch (from)
    325    {
    326        case GL_COLOR_ARRAY:
    327            return ClientVertexArrayType::Color;
    328        case GL_NORMAL_ARRAY:
    329            return ClientVertexArrayType::Normal;
    330        case GL_POINT_SIZE_ARRAY_OES:
    331            return ClientVertexArrayType::PointSize;
    332        case GL_TEXTURE_COORD_ARRAY:
    333            return ClientVertexArrayType::TextureCoord;
    334        case GL_VERTEX_ARRAY:
    335            return ClientVertexArrayType::Vertex;
    336        default:
    337            return ClientVertexArrayType::InvalidEnum;
    338    }
    339 }
    340 
    341 GLenum ToGLenum(ClientVertexArrayType from)
    342 {
    343    switch (from)
    344    {
    345        case ClientVertexArrayType::Color:
    346            return GL_COLOR_ARRAY;
    347        case ClientVertexArrayType::Normal:
    348            return GL_NORMAL_ARRAY;
    349        case ClientVertexArrayType::PointSize:
    350            return GL_POINT_SIZE_ARRAY_OES;
    351        case ClientVertexArrayType::TextureCoord:
    352            return GL_TEXTURE_COORD_ARRAY;
    353        case ClientVertexArrayType::Vertex:
    354            return GL_VERTEX_ARRAY;
    355        default:
    356            UNREACHABLE();
    357            return 0;
    358    }
    359 }
    360 
    361 std::ostream &operator<<(std::ostream &os, ClientVertexArrayType value)
    362 {
    363    switch (value)
    364    {
    365        case ClientVertexArrayType::Color:
    366            os << "GL_COLOR_ARRAY";
    367            break;
    368        case ClientVertexArrayType::Normal:
    369            os << "GL_NORMAL_ARRAY";
    370            break;
    371        case ClientVertexArrayType::PointSize:
    372            os << "GL_POINT_SIZE_ARRAY_OES";
    373            break;
    374        case ClientVertexArrayType::TextureCoord:
    375            os << "GL_TEXTURE_COORD_ARRAY";
    376            break;
    377        case ClientVertexArrayType::Vertex:
    378            os << "GL_VERTEX_ARRAY";
    379            break;
    380        default:
    381            os << "GL_INVALID_ENUM";
    382            break;
    383    }
    384    return os;
    385 }
    386 
    387 template <>
    388 CullFaceMode FromGLenum<CullFaceMode>(GLenum from)
    389 {
    390    switch (from)
    391    {
    392        case GL_BACK:
    393            return CullFaceMode::Back;
    394        case GL_FRONT:
    395            return CullFaceMode::Front;
    396        case GL_FRONT_AND_BACK:
    397            return CullFaceMode::FrontAndBack;
    398        default:
    399            return CullFaceMode::InvalidEnum;
    400    }
    401 }
    402 
    403 GLenum ToGLenum(CullFaceMode from)
    404 {
    405    switch (from)
    406    {
    407        case CullFaceMode::Back:
    408            return GL_BACK;
    409        case CullFaceMode::Front:
    410            return GL_FRONT;
    411        case CullFaceMode::FrontAndBack:
    412            return GL_FRONT_AND_BACK;
    413        default:
    414            UNREACHABLE();
    415            return 0;
    416    }
    417 }
    418 
    419 std::ostream &operator<<(std::ostream &os, CullFaceMode value)
    420 {
    421    switch (value)
    422    {
    423        case CullFaceMode::Back:
    424            os << "GL_BACK";
    425            break;
    426        case CullFaceMode::Front:
    427            os << "GL_FRONT";
    428            break;
    429        case CullFaceMode::FrontAndBack:
    430            os << "GL_FRONT_AND_BACK";
    431            break;
    432        default:
    433            os << "GL_INVALID_ENUM";
    434            break;
    435    }
    436    return os;
    437 }
    438 
    439 template <>
    440 FilterMode FromGLenum<FilterMode>(GLenum from)
    441 {
    442    switch (from)
    443    {
    444        case GL_NEAREST:
    445            return FilterMode::Nearest;
    446        case GL_LINEAR:
    447            return FilterMode::Linear;
    448        case GL_NEAREST_MIPMAP_NEAREST:
    449            return FilterMode::NearestMipmapNearest;
    450        case GL_NEAREST_MIPMAP_LINEAR:
    451            return FilterMode::NearestMipmapLinear;
    452        case GL_LINEAR_MIPMAP_LINEAR:
    453            return FilterMode::LinearMipmapLinear;
    454        default:
    455            return FilterMode::InvalidEnum;
    456    }
    457 }
    458 
    459 GLenum ToGLenum(FilterMode from)
    460 {
    461    switch (from)
    462    {
    463        case FilterMode::Nearest:
    464            return GL_NEAREST;
    465        case FilterMode::Linear:
    466            return GL_LINEAR;
    467        case FilterMode::NearestMipmapNearest:
    468            return GL_NEAREST_MIPMAP_NEAREST;
    469        case FilterMode::NearestMipmapLinear:
    470            return GL_NEAREST_MIPMAP_LINEAR;
    471        case FilterMode::LinearMipmapLinear:
    472            return GL_LINEAR_MIPMAP_LINEAR;
    473        default:
    474            UNREACHABLE();
    475            return 0;
    476    }
    477 }
    478 
    479 std::ostream &operator<<(std::ostream &os, FilterMode value)
    480 {
    481    switch (value)
    482    {
    483        case FilterMode::Nearest:
    484            os << "GL_NEAREST";
    485            break;
    486        case FilterMode::Linear:
    487            os << "GL_LINEAR";
    488            break;
    489        case FilterMode::NearestMipmapNearest:
    490            os << "GL_NEAREST_MIPMAP_NEAREST";
    491            break;
    492        case FilterMode::NearestMipmapLinear:
    493            os << "GL_NEAREST_MIPMAP_LINEAR";
    494            break;
    495        case FilterMode::LinearMipmapLinear:
    496            os << "GL_LINEAR_MIPMAP_LINEAR";
    497            break;
    498        default:
    499            os << "GL_INVALID_ENUM";
    500            break;
    501    }
    502    return os;
    503 }
    504 
    505 template <>
    506 FogMode FromGLenum<FogMode>(GLenum from)
    507 {
    508    switch (from)
    509    {
    510        case GL_EXP:
    511            return FogMode::Exp;
    512        case GL_EXP2:
    513            return FogMode::Exp2;
    514        case GL_LINEAR:
    515            return FogMode::Linear;
    516        default:
    517            return FogMode::InvalidEnum;
    518    }
    519 }
    520 
    521 GLenum ToGLenum(FogMode from)
    522 {
    523    switch (from)
    524    {
    525        case FogMode::Exp:
    526            return GL_EXP;
    527        case FogMode::Exp2:
    528            return GL_EXP2;
    529        case FogMode::Linear:
    530            return GL_LINEAR;
    531        default:
    532            UNREACHABLE();
    533            return 0;
    534    }
    535 }
    536 
    537 std::ostream &operator<<(std::ostream &os, FogMode value)
    538 {
    539    switch (value)
    540    {
    541        case FogMode::Exp:
    542            os << "GL_EXP";
    543            break;
    544        case FogMode::Exp2:
    545            os << "GL_EXP2";
    546            break;
    547        case FogMode::Linear:
    548            os << "GL_LINEAR";
    549            break;
    550        default:
    551            os << "GL_INVALID_ENUM";
    552            break;
    553    }
    554    return os;
    555 }
    556 
    557 template <>
    558 GraphicsResetStatus FromGLenum<GraphicsResetStatus>(GLenum from)
    559 {
    560    switch (from)
    561    {
    562        case GL_NO_ERROR:
    563            return GraphicsResetStatus::NoError;
    564        case GL_GUILTY_CONTEXT_RESET:
    565            return GraphicsResetStatus::GuiltyContextReset;
    566        case GL_INNOCENT_CONTEXT_RESET:
    567            return GraphicsResetStatus::InnocentContextReset;
    568        case GL_UNKNOWN_CONTEXT_RESET:
    569            return GraphicsResetStatus::UnknownContextReset;
    570        case GL_PURGED_CONTEXT_RESET_NV:
    571            return GraphicsResetStatus::PurgedContextResetNV;
    572        default:
    573            return GraphicsResetStatus::InvalidEnum;
    574    }
    575 }
    576 
    577 GLenum ToGLenum(GraphicsResetStatus from)
    578 {
    579    switch (from)
    580    {
    581        case GraphicsResetStatus::NoError:
    582            return GL_NO_ERROR;
    583        case GraphicsResetStatus::GuiltyContextReset:
    584            return GL_GUILTY_CONTEXT_RESET;
    585        case GraphicsResetStatus::InnocentContextReset:
    586            return GL_INNOCENT_CONTEXT_RESET;
    587        case GraphicsResetStatus::UnknownContextReset:
    588            return GL_UNKNOWN_CONTEXT_RESET;
    589        case GraphicsResetStatus::PurgedContextResetNV:
    590            return GL_PURGED_CONTEXT_RESET_NV;
    591        default:
    592            UNREACHABLE();
    593            return 0;
    594    }
    595 }
    596 
    597 std::ostream &operator<<(std::ostream &os, GraphicsResetStatus value)
    598 {
    599    switch (value)
    600    {
    601        case GraphicsResetStatus::NoError:
    602            os << "GL_NO_ERROR";
    603            break;
    604        case GraphicsResetStatus::GuiltyContextReset:
    605            os << "GL_GUILTY_CONTEXT_RESET";
    606            break;
    607        case GraphicsResetStatus::InnocentContextReset:
    608            os << "GL_INNOCENT_CONTEXT_RESET";
    609            break;
    610        case GraphicsResetStatus::UnknownContextReset:
    611            os << "GL_UNKNOWN_CONTEXT_RESET";
    612            break;
    613        case GraphicsResetStatus::PurgedContextResetNV:
    614            os << "GL_PURGED_CONTEXT_RESET_NV";
    615            break;
    616        default:
    617            os << "GL_INVALID_ENUM";
    618            break;
    619    }
    620    return os;
    621 }
    622 
    623 template <>
    624 HandleType FromGLenum<HandleType>(GLenum from)
    625 {
    626    switch (from)
    627    {
    628        case GL_HANDLE_TYPE_OPAQUE_FD_EXT:
    629            return HandleType::OpaqueFd;
    630        case GL_HANDLE_TYPE_ZIRCON_VMO_ANGLE:
    631            return HandleType::ZirconVmo;
    632        case GL_HANDLE_TYPE_ZIRCON_EVENT_ANGLE:
    633            return HandleType::ZirconEvent;
    634        default:
    635            return HandleType::InvalidEnum;
    636    }
    637 }
    638 
    639 GLenum ToGLenum(HandleType from)
    640 {
    641    switch (from)
    642    {
    643        case HandleType::OpaqueFd:
    644            return GL_HANDLE_TYPE_OPAQUE_FD_EXT;
    645        case HandleType::ZirconVmo:
    646            return GL_HANDLE_TYPE_ZIRCON_VMO_ANGLE;
    647        case HandleType::ZirconEvent:
    648            return GL_HANDLE_TYPE_ZIRCON_EVENT_ANGLE;
    649        default:
    650            UNREACHABLE();
    651            return 0;
    652    }
    653 }
    654 
    655 std::ostream &operator<<(std::ostream &os, HandleType value)
    656 {
    657    switch (value)
    658    {
    659        case HandleType::OpaqueFd:
    660            os << "GL_HANDLE_TYPE_OPAQUE_FD_EXT";
    661            break;
    662        case HandleType::ZirconVmo:
    663            os << "GL_HANDLE_TYPE_ZIRCON_VMO_ANGLE";
    664            break;
    665        case HandleType::ZirconEvent:
    666            os << "GL_HANDLE_TYPE_ZIRCON_EVENT_ANGLE";
    667            break;
    668        default:
    669            os << "GL_INVALID_ENUM";
    670            break;
    671    }
    672    return os;
    673 }
    674 
    675 template <>
    676 HintSetting FromGLenum<HintSetting>(GLenum from)
    677 {
    678    switch (from)
    679    {
    680        case GL_DONT_CARE:
    681            return HintSetting::DontCare;
    682        case GL_FASTEST:
    683            return HintSetting::Fastest;
    684        case GL_NICEST:
    685            return HintSetting::Nicest;
    686        default:
    687            return HintSetting::InvalidEnum;
    688    }
    689 }
    690 
    691 GLenum ToGLenum(HintSetting from)
    692 {
    693    switch (from)
    694    {
    695        case HintSetting::DontCare:
    696            return GL_DONT_CARE;
    697        case HintSetting::Fastest:
    698            return GL_FASTEST;
    699        case HintSetting::Nicest:
    700            return GL_NICEST;
    701        default:
    702            UNREACHABLE();
    703            return 0;
    704    }
    705 }
    706 
    707 std::ostream &operator<<(std::ostream &os, HintSetting value)
    708 {
    709    switch (value)
    710    {
    711        case HintSetting::DontCare:
    712            os << "GL_DONT_CARE";
    713            break;
    714        case HintSetting::Fastest:
    715            os << "GL_FASTEST";
    716            break;
    717        case HintSetting::Nicest:
    718            os << "GL_NICEST";
    719            break;
    720        default:
    721            os << "GL_INVALID_ENUM";
    722            break;
    723    }
    724    return os;
    725 }
    726 
    727 template <>
    728 ImageLayout FromGLenum<ImageLayout>(GLenum from)
    729 {
    730    switch (from)
    731    {
    732        case GL_NONE:
    733            return ImageLayout::Undefined;
    734        case GL_LAYOUT_GENERAL_EXT:
    735            return ImageLayout::General;
    736        case GL_LAYOUT_COLOR_ATTACHMENT_EXT:
    737            return ImageLayout::ColorAttachment;
    738        case GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT:
    739            return ImageLayout::DepthStencilAttachment;
    740        case GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT:
    741            return ImageLayout::DepthStencilReadOnlyAttachment;
    742        case GL_LAYOUT_SHADER_READ_ONLY_EXT:
    743            return ImageLayout::ShaderReadOnly;
    744        case GL_LAYOUT_TRANSFER_SRC_EXT:
    745            return ImageLayout::TransferSrc;
    746        case GL_LAYOUT_TRANSFER_DST_EXT:
    747            return ImageLayout::TransferDst;
    748        case GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT:
    749            return ImageLayout::DepthReadOnlyStencilAttachment;
    750        case GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT:
    751            return ImageLayout::DepthAttachmentStencilReadOnly;
    752        default:
    753            return ImageLayout::InvalidEnum;
    754    }
    755 }
    756 
    757 GLenum ToGLenum(ImageLayout from)
    758 {
    759    switch (from)
    760    {
    761        case ImageLayout::Undefined:
    762            return GL_NONE;
    763        case ImageLayout::General:
    764            return GL_LAYOUT_GENERAL_EXT;
    765        case ImageLayout::ColorAttachment:
    766            return GL_LAYOUT_COLOR_ATTACHMENT_EXT;
    767        case ImageLayout::DepthStencilAttachment:
    768            return GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT;
    769        case ImageLayout::DepthStencilReadOnlyAttachment:
    770            return GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT;
    771        case ImageLayout::ShaderReadOnly:
    772            return GL_LAYOUT_SHADER_READ_ONLY_EXT;
    773        case ImageLayout::TransferSrc:
    774            return GL_LAYOUT_TRANSFER_SRC_EXT;
    775        case ImageLayout::TransferDst:
    776            return GL_LAYOUT_TRANSFER_DST_EXT;
    777        case ImageLayout::DepthReadOnlyStencilAttachment:
    778            return GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT;
    779        case ImageLayout::DepthAttachmentStencilReadOnly:
    780            return GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT;
    781        default:
    782            UNREACHABLE();
    783            return 0;
    784    }
    785 }
    786 
    787 std::ostream &operator<<(std::ostream &os, ImageLayout value)
    788 {
    789    switch (value)
    790    {
    791        case ImageLayout::Undefined:
    792            os << "GL_NONE";
    793            break;
    794        case ImageLayout::General:
    795            os << "GL_LAYOUT_GENERAL_EXT";
    796            break;
    797        case ImageLayout::ColorAttachment:
    798            os << "GL_LAYOUT_COLOR_ATTACHMENT_EXT";
    799            break;
    800        case ImageLayout::DepthStencilAttachment:
    801            os << "GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT";
    802            break;
    803        case ImageLayout::DepthStencilReadOnlyAttachment:
    804            os << "GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT";
    805            break;
    806        case ImageLayout::ShaderReadOnly:
    807            os << "GL_LAYOUT_SHADER_READ_ONLY_EXT";
    808            break;
    809        case ImageLayout::TransferSrc:
    810            os << "GL_LAYOUT_TRANSFER_SRC_EXT";
    811            break;
    812        case ImageLayout::TransferDst:
    813            os << "GL_LAYOUT_TRANSFER_DST_EXT";
    814            break;
    815        case ImageLayout::DepthReadOnlyStencilAttachment:
    816            os << "GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT";
    817            break;
    818        case ImageLayout::DepthAttachmentStencilReadOnly:
    819            os << "GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT";
    820            break;
    821        default:
    822            os << "GL_INVALID_ENUM";
    823            break;
    824    }
    825    return os;
    826 }
    827 
    828 template <>
    829 LightParameter FromGLenum<LightParameter>(GLenum from)
    830 {
    831    switch (from)
    832    {
    833        case GL_AMBIENT:
    834            return LightParameter::Ambient;
    835        case GL_AMBIENT_AND_DIFFUSE:
    836            return LightParameter::AmbientAndDiffuse;
    837        case GL_CONSTANT_ATTENUATION:
    838            return LightParameter::ConstantAttenuation;
    839        case GL_DIFFUSE:
    840            return LightParameter::Diffuse;
    841        case GL_LINEAR_ATTENUATION:
    842            return LightParameter::LinearAttenuation;
    843        case GL_POSITION:
    844            return LightParameter::Position;
    845        case GL_QUADRATIC_ATTENUATION:
    846            return LightParameter::QuadraticAttenuation;
    847        case GL_SPECULAR:
    848            return LightParameter::Specular;
    849        case GL_SPOT_CUTOFF:
    850            return LightParameter::SpotCutoff;
    851        case GL_SPOT_DIRECTION:
    852            return LightParameter::SpotDirection;
    853        case GL_SPOT_EXPONENT:
    854            return LightParameter::SpotExponent;
    855        default:
    856            return LightParameter::InvalidEnum;
    857    }
    858 }
    859 
    860 GLenum ToGLenum(LightParameter from)
    861 {
    862    switch (from)
    863    {
    864        case LightParameter::Ambient:
    865            return GL_AMBIENT;
    866        case LightParameter::AmbientAndDiffuse:
    867            return GL_AMBIENT_AND_DIFFUSE;
    868        case LightParameter::ConstantAttenuation:
    869            return GL_CONSTANT_ATTENUATION;
    870        case LightParameter::Diffuse:
    871            return GL_DIFFUSE;
    872        case LightParameter::LinearAttenuation:
    873            return GL_LINEAR_ATTENUATION;
    874        case LightParameter::Position:
    875            return GL_POSITION;
    876        case LightParameter::QuadraticAttenuation:
    877            return GL_QUADRATIC_ATTENUATION;
    878        case LightParameter::Specular:
    879            return GL_SPECULAR;
    880        case LightParameter::SpotCutoff:
    881            return GL_SPOT_CUTOFF;
    882        case LightParameter::SpotDirection:
    883            return GL_SPOT_DIRECTION;
    884        case LightParameter::SpotExponent:
    885            return GL_SPOT_EXPONENT;
    886        default:
    887            UNREACHABLE();
    888            return 0;
    889    }
    890 }
    891 
    892 std::ostream &operator<<(std::ostream &os, LightParameter value)
    893 {
    894    switch (value)
    895    {
    896        case LightParameter::Ambient:
    897            os << "GL_AMBIENT";
    898            break;
    899        case LightParameter::AmbientAndDiffuse:
    900            os << "GL_AMBIENT_AND_DIFFUSE";
    901            break;
    902        case LightParameter::ConstantAttenuation:
    903            os << "GL_CONSTANT_ATTENUATION";
    904            break;
    905        case LightParameter::Diffuse:
    906            os << "GL_DIFFUSE";
    907            break;
    908        case LightParameter::LinearAttenuation:
    909            os << "GL_LINEAR_ATTENUATION";
    910            break;
    911        case LightParameter::Position:
    912            os << "GL_POSITION";
    913            break;
    914        case LightParameter::QuadraticAttenuation:
    915            os << "GL_QUADRATIC_ATTENUATION";
    916            break;
    917        case LightParameter::Specular:
    918            os << "GL_SPECULAR";
    919            break;
    920        case LightParameter::SpotCutoff:
    921            os << "GL_SPOT_CUTOFF";
    922            break;
    923        case LightParameter::SpotDirection:
    924            os << "GL_SPOT_DIRECTION";
    925            break;
    926        case LightParameter::SpotExponent:
    927            os << "GL_SPOT_EXPONENT";
    928            break;
    929        default:
    930            os << "GL_INVALID_ENUM";
    931            break;
    932    }
    933    return os;
    934 }
    935 
    936 template <>
    937 LogicalOperation FromGLenum<LogicalOperation>(GLenum from)
    938 {
    939    switch (from)
    940    {
    941        case GL_AND:
    942            return LogicalOperation::And;
    943        case GL_AND_INVERTED:
    944            return LogicalOperation::AndInverted;
    945        case GL_AND_REVERSE:
    946            return LogicalOperation::AndReverse;
    947        case GL_CLEAR:
    948            return LogicalOperation::Clear;
    949        case GL_COPY:
    950            return LogicalOperation::Copy;
    951        case GL_COPY_INVERTED:
    952            return LogicalOperation::CopyInverted;
    953        case GL_EQUIV:
    954            return LogicalOperation::Equiv;
    955        case GL_INVERT:
    956            return LogicalOperation::Invert;
    957        case GL_NAND:
    958            return LogicalOperation::Nand;
    959        case GL_NOOP:
    960            return LogicalOperation::Noop;
    961        case GL_NOR:
    962            return LogicalOperation::Nor;
    963        case GL_OR:
    964            return LogicalOperation::Or;
    965        case GL_OR_INVERTED:
    966            return LogicalOperation::OrInverted;
    967        case GL_OR_REVERSE:
    968            return LogicalOperation::OrReverse;
    969        case GL_SET:
    970            return LogicalOperation::Set;
    971        case GL_XOR:
    972            return LogicalOperation::Xor;
    973        default:
    974            return LogicalOperation::InvalidEnum;
    975    }
    976 }
    977 
    978 GLenum ToGLenum(LogicalOperation from)
    979 {
    980    switch (from)
    981    {
    982        case LogicalOperation::And:
    983            return GL_AND;
    984        case LogicalOperation::AndInverted:
    985            return GL_AND_INVERTED;
    986        case LogicalOperation::AndReverse:
    987            return GL_AND_REVERSE;
    988        case LogicalOperation::Clear:
    989            return GL_CLEAR;
    990        case LogicalOperation::Copy:
    991            return GL_COPY;
    992        case LogicalOperation::CopyInverted:
    993            return GL_COPY_INVERTED;
    994        case LogicalOperation::Equiv:
    995            return GL_EQUIV;
    996        case LogicalOperation::Invert:
    997            return GL_INVERT;
    998        case LogicalOperation::Nand:
    999            return GL_NAND;
   1000        case LogicalOperation::Noop:
   1001            return GL_NOOP;
   1002        case LogicalOperation::Nor:
   1003            return GL_NOR;
   1004        case LogicalOperation::Or:
   1005            return GL_OR;
   1006        case LogicalOperation::OrInverted:
   1007            return GL_OR_INVERTED;
   1008        case LogicalOperation::OrReverse:
   1009            return GL_OR_REVERSE;
   1010        case LogicalOperation::Set:
   1011            return GL_SET;
   1012        case LogicalOperation::Xor:
   1013            return GL_XOR;
   1014        default:
   1015            UNREACHABLE();
   1016            return 0;
   1017    }
   1018 }
   1019 
   1020 std::ostream &operator<<(std::ostream &os, LogicalOperation value)
   1021 {
   1022    switch (value)
   1023    {
   1024        case LogicalOperation::And:
   1025            os << "GL_AND";
   1026            break;
   1027        case LogicalOperation::AndInverted:
   1028            os << "GL_AND_INVERTED";
   1029            break;
   1030        case LogicalOperation::AndReverse:
   1031            os << "GL_AND_REVERSE";
   1032            break;
   1033        case LogicalOperation::Clear:
   1034            os << "GL_CLEAR";
   1035            break;
   1036        case LogicalOperation::Copy:
   1037            os << "GL_COPY";
   1038            break;
   1039        case LogicalOperation::CopyInverted:
   1040            os << "GL_COPY_INVERTED";
   1041            break;
   1042        case LogicalOperation::Equiv:
   1043            os << "GL_EQUIV";
   1044            break;
   1045        case LogicalOperation::Invert:
   1046            os << "GL_INVERT";
   1047            break;
   1048        case LogicalOperation::Nand:
   1049            os << "GL_NAND";
   1050            break;
   1051        case LogicalOperation::Noop:
   1052            os << "GL_NOOP";
   1053            break;
   1054        case LogicalOperation::Nor:
   1055            os << "GL_NOR";
   1056            break;
   1057        case LogicalOperation::Or:
   1058            os << "GL_OR";
   1059            break;
   1060        case LogicalOperation::OrInverted:
   1061            os << "GL_OR_INVERTED";
   1062            break;
   1063        case LogicalOperation::OrReverse:
   1064            os << "GL_OR_REVERSE";
   1065            break;
   1066        case LogicalOperation::Set:
   1067            os << "GL_SET";
   1068            break;
   1069        case LogicalOperation::Xor:
   1070            os << "GL_XOR";
   1071            break;
   1072        default:
   1073            os << "GL_INVALID_ENUM";
   1074            break;
   1075    }
   1076    return os;
   1077 }
   1078 
   1079 template <>
   1080 MaterialParameter FromGLenum<MaterialParameter>(GLenum from)
   1081 {
   1082    switch (from)
   1083    {
   1084        case GL_AMBIENT:
   1085            return MaterialParameter::Ambient;
   1086        case GL_AMBIENT_AND_DIFFUSE:
   1087            return MaterialParameter::AmbientAndDiffuse;
   1088        case GL_DIFFUSE:
   1089            return MaterialParameter::Diffuse;
   1090        case GL_EMISSION:
   1091            return MaterialParameter::Emission;
   1092        case GL_SHININESS:
   1093            return MaterialParameter::Shininess;
   1094        case GL_SPECULAR:
   1095            return MaterialParameter::Specular;
   1096        default:
   1097            return MaterialParameter::InvalidEnum;
   1098    }
   1099 }
   1100 
   1101 GLenum ToGLenum(MaterialParameter from)
   1102 {
   1103    switch (from)
   1104    {
   1105        case MaterialParameter::Ambient:
   1106            return GL_AMBIENT;
   1107        case MaterialParameter::AmbientAndDiffuse:
   1108            return GL_AMBIENT_AND_DIFFUSE;
   1109        case MaterialParameter::Diffuse:
   1110            return GL_DIFFUSE;
   1111        case MaterialParameter::Emission:
   1112            return GL_EMISSION;
   1113        case MaterialParameter::Shininess:
   1114            return GL_SHININESS;
   1115        case MaterialParameter::Specular:
   1116            return GL_SPECULAR;
   1117        default:
   1118            UNREACHABLE();
   1119            return 0;
   1120    }
   1121 }
   1122 
   1123 std::ostream &operator<<(std::ostream &os, MaterialParameter value)
   1124 {
   1125    switch (value)
   1126    {
   1127        case MaterialParameter::Ambient:
   1128            os << "GL_AMBIENT";
   1129            break;
   1130        case MaterialParameter::AmbientAndDiffuse:
   1131            os << "GL_AMBIENT_AND_DIFFUSE";
   1132            break;
   1133        case MaterialParameter::Diffuse:
   1134            os << "GL_DIFFUSE";
   1135            break;
   1136        case MaterialParameter::Emission:
   1137            os << "GL_EMISSION";
   1138            break;
   1139        case MaterialParameter::Shininess:
   1140            os << "GL_SHININESS";
   1141            break;
   1142        case MaterialParameter::Specular:
   1143            os << "GL_SPECULAR";
   1144            break;
   1145        default:
   1146            os << "GL_INVALID_ENUM";
   1147            break;
   1148    }
   1149    return os;
   1150 }
   1151 
   1152 template <>
   1153 MatrixType FromGLenum<MatrixType>(GLenum from)
   1154 {
   1155    switch (from)
   1156    {
   1157        case GL_MODELVIEW:
   1158            return MatrixType::Modelview;
   1159        case GL_PROJECTION:
   1160            return MatrixType::Projection;
   1161        case GL_TEXTURE:
   1162            return MatrixType::Texture;
   1163        default:
   1164            return MatrixType::InvalidEnum;
   1165    }
   1166 }
   1167 
   1168 GLenum ToGLenum(MatrixType from)
   1169 {
   1170    switch (from)
   1171    {
   1172        case MatrixType::Modelview:
   1173            return GL_MODELVIEW;
   1174        case MatrixType::Projection:
   1175            return GL_PROJECTION;
   1176        case MatrixType::Texture:
   1177            return GL_TEXTURE;
   1178        default:
   1179            UNREACHABLE();
   1180            return 0;
   1181    }
   1182 }
   1183 
   1184 std::ostream &operator<<(std::ostream &os, MatrixType value)
   1185 {
   1186    switch (value)
   1187    {
   1188        case MatrixType::Modelview:
   1189            os << "GL_MODELVIEW";
   1190            break;
   1191        case MatrixType::Projection:
   1192            os << "GL_PROJECTION";
   1193            break;
   1194        case MatrixType::Texture:
   1195            os << "GL_TEXTURE";
   1196            break;
   1197        default:
   1198            os << "GL_INVALID_ENUM";
   1199            break;
   1200    }
   1201    return os;
   1202 }
   1203 
   1204 template <>
   1205 PointParameter FromGLenum<PointParameter>(GLenum from)
   1206 {
   1207    switch (from)
   1208    {
   1209        case GL_POINT_SIZE_MIN:
   1210            return PointParameter::PointSizeMin;
   1211        case GL_POINT_SIZE_MAX:
   1212            return PointParameter::PointSizeMax;
   1213        case GL_POINT_FADE_THRESHOLD_SIZE:
   1214            return PointParameter::PointFadeThresholdSize;
   1215        case GL_POINT_DISTANCE_ATTENUATION:
   1216            return PointParameter::PointDistanceAttenuation;
   1217        default:
   1218            return PointParameter::InvalidEnum;
   1219    }
   1220 }
   1221 
   1222 GLenum ToGLenum(PointParameter from)
   1223 {
   1224    switch (from)
   1225    {
   1226        case PointParameter::PointSizeMin:
   1227            return GL_POINT_SIZE_MIN;
   1228        case PointParameter::PointSizeMax:
   1229            return GL_POINT_SIZE_MAX;
   1230        case PointParameter::PointFadeThresholdSize:
   1231            return GL_POINT_FADE_THRESHOLD_SIZE;
   1232        case PointParameter::PointDistanceAttenuation:
   1233            return GL_POINT_DISTANCE_ATTENUATION;
   1234        default:
   1235            UNREACHABLE();
   1236            return 0;
   1237    }
   1238 }
   1239 
   1240 std::ostream &operator<<(std::ostream &os, PointParameter value)
   1241 {
   1242    switch (value)
   1243    {
   1244        case PointParameter::PointSizeMin:
   1245            os << "GL_POINT_SIZE_MIN";
   1246            break;
   1247        case PointParameter::PointSizeMax:
   1248            os << "GL_POINT_SIZE_MAX";
   1249            break;
   1250        case PointParameter::PointFadeThresholdSize:
   1251            os << "GL_POINT_FADE_THRESHOLD_SIZE";
   1252            break;
   1253        case PointParameter::PointDistanceAttenuation:
   1254            os << "GL_POINT_DISTANCE_ATTENUATION";
   1255            break;
   1256        default:
   1257            os << "GL_INVALID_ENUM";
   1258            break;
   1259    }
   1260    return os;
   1261 }
   1262 
   1263 template <>
   1264 ProvokingVertexConvention FromGLenum<ProvokingVertexConvention>(GLenum from)
   1265 {
   1266    switch (from)
   1267    {
   1268        case GL_FIRST_VERTEX_CONVENTION:
   1269            return ProvokingVertexConvention::FirstVertexConvention;
   1270        case GL_LAST_VERTEX_CONVENTION:
   1271            return ProvokingVertexConvention::LastVertexConvention;
   1272        default:
   1273            return ProvokingVertexConvention::InvalidEnum;
   1274    }
   1275 }
   1276 
   1277 GLenum ToGLenum(ProvokingVertexConvention from)
   1278 {
   1279    switch (from)
   1280    {
   1281        case ProvokingVertexConvention::FirstVertexConvention:
   1282            return GL_FIRST_VERTEX_CONVENTION;
   1283        case ProvokingVertexConvention::LastVertexConvention:
   1284            return GL_LAST_VERTEX_CONVENTION;
   1285        default:
   1286            UNREACHABLE();
   1287            return 0;
   1288    }
   1289 }
   1290 
   1291 std::ostream &operator<<(std::ostream &os, ProvokingVertexConvention value)
   1292 {
   1293    switch (value)
   1294    {
   1295        case ProvokingVertexConvention::FirstVertexConvention:
   1296            os << "GL_FIRST_VERTEX_CONVENTION";
   1297            break;
   1298        case ProvokingVertexConvention::LastVertexConvention:
   1299            os << "GL_LAST_VERTEX_CONVENTION";
   1300            break;
   1301        default:
   1302            os << "GL_INVALID_ENUM";
   1303            break;
   1304    }
   1305    return os;
   1306 }
   1307 
   1308 template <>
   1309 QueryType FromGLenum<QueryType>(GLenum from)
   1310 {
   1311    switch (from)
   1312    {
   1313        case GL_ANY_SAMPLES_PASSED:
   1314            return QueryType::AnySamples;
   1315        case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
   1316            return QueryType::AnySamplesConservative;
   1317        case GL_COMMANDS_COMPLETED_CHROMIUM:
   1318            return QueryType::CommandsCompleted;
   1319        case GL_PRIMITIVES_GENERATED_EXT:
   1320            return QueryType::PrimitivesGenerated;
   1321        case GL_TIME_ELAPSED_EXT:
   1322            return QueryType::TimeElapsed;
   1323        case GL_TIMESTAMP_EXT:
   1324            return QueryType::Timestamp;
   1325        case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
   1326            return QueryType::TransformFeedbackPrimitivesWritten;
   1327        default:
   1328            return QueryType::InvalidEnum;
   1329    }
   1330 }
   1331 
   1332 GLenum ToGLenum(QueryType from)
   1333 {
   1334    switch (from)
   1335    {
   1336        case QueryType::AnySamples:
   1337            return GL_ANY_SAMPLES_PASSED;
   1338        case QueryType::AnySamplesConservative:
   1339            return GL_ANY_SAMPLES_PASSED_CONSERVATIVE;
   1340        case QueryType::CommandsCompleted:
   1341            return GL_COMMANDS_COMPLETED_CHROMIUM;
   1342        case QueryType::PrimitivesGenerated:
   1343            return GL_PRIMITIVES_GENERATED_EXT;
   1344        case QueryType::TimeElapsed:
   1345            return GL_TIME_ELAPSED_EXT;
   1346        case QueryType::Timestamp:
   1347            return GL_TIMESTAMP_EXT;
   1348        case QueryType::TransformFeedbackPrimitivesWritten:
   1349            return GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;
   1350        default:
   1351            UNREACHABLE();
   1352            return 0;
   1353    }
   1354 }
   1355 
   1356 std::ostream &operator<<(std::ostream &os, QueryType value)
   1357 {
   1358    switch (value)
   1359    {
   1360        case QueryType::AnySamples:
   1361            os << "GL_ANY_SAMPLES_PASSED";
   1362            break;
   1363        case QueryType::AnySamplesConservative:
   1364            os << "GL_ANY_SAMPLES_PASSED_CONSERVATIVE";
   1365            break;
   1366        case QueryType::CommandsCompleted:
   1367            os << "GL_COMMANDS_COMPLETED_CHROMIUM";
   1368            break;
   1369        case QueryType::PrimitivesGenerated:
   1370            os << "GL_PRIMITIVES_GENERATED_EXT";
   1371            break;
   1372        case QueryType::TimeElapsed:
   1373            os << "GL_TIME_ELAPSED_EXT";
   1374            break;
   1375        case QueryType::Timestamp:
   1376            os << "GL_TIMESTAMP_EXT";
   1377            break;
   1378        case QueryType::TransformFeedbackPrimitivesWritten:
   1379            os << "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN";
   1380            break;
   1381        default:
   1382            os << "GL_INVALID_ENUM";
   1383            break;
   1384    }
   1385    return os;
   1386 }
   1387 
   1388 template <>
   1389 ShaderType FromGLenum<ShaderType>(GLenum from)
   1390 {
   1391    switch (from)
   1392    {
   1393        case GL_VERTEX_SHADER:
   1394            return ShaderType::Vertex;
   1395        case GL_TESS_CONTROL_SHADER_EXT:
   1396            return ShaderType::TessControl;
   1397        case GL_TESS_EVALUATION_SHADER_EXT:
   1398            return ShaderType::TessEvaluation;
   1399        case GL_GEOMETRY_SHADER_EXT:
   1400            return ShaderType::Geometry;
   1401        case GL_FRAGMENT_SHADER:
   1402            return ShaderType::Fragment;
   1403        case GL_COMPUTE_SHADER:
   1404            return ShaderType::Compute;
   1405        default:
   1406            return ShaderType::InvalidEnum;
   1407    }
   1408 }
   1409 
   1410 GLenum ToGLenum(ShaderType from)
   1411 {
   1412    switch (from)
   1413    {
   1414        case ShaderType::Vertex:
   1415            return GL_VERTEX_SHADER;
   1416        case ShaderType::TessControl:
   1417            return GL_TESS_CONTROL_SHADER_EXT;
   1418        case ShaderType::TessEvaluation:
   1419            return GL_TESS_EVALUATION_SHADER_EXT;
   1420        case ShaderType::Geometry:
   1421            return GL_GEOMETRY_SHADER_EXT;
   1422        case ShaderType::Fragment:
   1423            return GL_FRAGMENT_SHADER;
   1424        case ShaderType::Compute:
   1425            return GL_COMPUTE_SHADER;
   1426        default:
   1427            UNREACHABLE();
   1428            return 0;
   1429    }
   1430 }
   1431 
   1432 std::ostream &operator<<(std::ostream &os, ShaderType value)
   1433 {
   1434    switch (value)
   1435    {
   1436        case ShaderType::Vertex:
   1437            os << "GL_VERTEX_SHADER";
   1438            break;
   1439        case ShaderType::TessControl:
   1440            os << "GL_TESS_CONTROL_SHADER_EXT";
   1441            break;
   1442        case ShaderType::TessEvaluation:
   1443            os << "GL_TESS_EVALUATION_SHADER_EXT";
   1444            break;
   1445        case ShaderType::Geometry:
   1446            os << "GL_GEOMETRY_SHADER_EXT";
   1447            break;
   1448        case ShaderType::Fragment:
   1449            os << "GL_FRAGMENT_SHADER";
   1450            break;
   1451        case ShaderType::Compute:
   1452            os << "GL_COMPUTE_SHADER";
   1453            break;
   1454        default:
   1455            os << "GL_INVALID_ENUM";
   1456            break;
   1457    }
   1458    return os;
   1459 }
   1460 
   1461 template <>
   1462 ShadingModel FromGLenum<ShadingModel>(GLenum from)
   1463 {
   1464    switch (from)
   1465    {
   1466        case GL_FLAT:
   1467            return ShadingModel::Flat;
   1468        case GL_SMOOTH:
   1469            return ShadingModel::Smooth;
   1470        default:
   1471            return ShadingModel::InvalidEnum;
   1472    }
   1473 }
   1474 
   1475 GLenum ToGLenum(ShadingModel from)
   1476 {
   1477    switch (from)
   1478    {
   1479        case ShadingModel::Flat:
   1480            return GL_FLAT;
   1481        case ShadingModel::Smooth:
   1482            return GL_SMOOTH;
   1483        default:
   1484            UNREACHABLE();
   1485            return 0;
   1486    }
   1487 }
   1488 
   1489 std::ostream &operator<<(std::ostream &os, ShadingModel value)
   1490 {
   1491    switch (value)
   1492    {
   1493        case ShadingModel::Flat:
   1494            os << "GL_FLAT";
   1495            break;
   1496        case ShadingModel::Smooth:
   1497            os << "GL_SMOOTH";
   1498            break;
   1499        default:
   1500            os << "GL_INVALID_ENUM";
   1501            break;
   1502    }
   1503    return os;
   1504 }
   1505 
   1506 template <>
   1507 ShadingRate FromGLenum<ShadingRate>(GLenum from)
   1508 {
   1509    switch (from)
   1510    {
   1511        case GL_NONE:
   1512            return ShadingRate::Undefined;
   1513        case GL_SHADING_RATE_1X1_PIXELS_QCOM:
   1514            return ShadingRate::_1x1;
   1515        case GL_SHADING_RATE_1X2_PIXELS_QCOM:
   1516            return ShadingRate::_1x2;
   1517        case GL_SHADING_RATE_2X1_PIXELS_QCOM:
   1518            return ShadingRate::_2x1;
   1519        case GL_SHADING_RATE_2X2_PIXELS_QCOM:
   1520            return ShadingRate::_2x2;
   1521        case GL_SHADING_RATE_4X2_PIXELS_QCOM:
   1522            return ShadingRate::_4x2;
   1523        case GL_SHADING_RATE_4X4_PIXELS_QCOM:
   1524            return ShadingRate::_4x4;
   1525        default:
   1526            return ShadingRate::InvalidEnum;
   1527    }
   1528 }
   1529 
   1530 GLenum ToGLenum(ShadingRate from)
   1531 {
   1532    switch (from)
   1533    {
   1534        case ShadingRate::Undefined:
   1535            return GL_NONE;
   1536        case ShadingRate::_1x1:
   1537            return GL_SHADING_RATE_1X1_PIXELS_QCOM;
   1538        case ShadingRate::_1x2:
   1539            return GL_SHADING_RATE_1X2_PIXELS_QCOM;
   1540        case ShadingRate::_2x1:
   1541            return GL_SHADING_RATE_2X1_PIXELS_QCOM;
   1542        case ShadingRate::_2x2:
   1543            return GL_SHADING_RATE_2X2_PIXELS_QCOM;
   1544        case ShadingRate::_4x2:
   1545            return GL_SHADING_RATE_4X2_PIXELS_QCOM;
   1546        case ShadingRate::_4x4:
   1547            return GL_SHADING_RATE_4X4_PIXELS_QCOM;
   1548        default:
   1549            UNREACHABLE();
   1550            return 0;
   1551    }
   1552 }
   1553 
   1554 std::ostream &operator<<(std::ostream &os, ShadingRate value)
   1555 {
   1556    switch (value)
   1557    {
   1558        case ShadingRate::Undefined:
   1559            os << "GL_NONE";
   1560            break;
   1561        case ShadingRate::_1x1:
   1562            os << "GL_SHADING_RATE_1X1_PIXELS_QCOM";
   1563            break;
   1564        case ShadingRate::_1x2:
   1565            os << "GL_SHADING_RATE_1X2_PIXELS_QCOM";
   1566            break;
   1567        case ShadingRate::_2x1:
   1568            os << "GL_SHADING_RATE_2X1_PIXELS_QCOM";
   1569            break;
   1570        case ShadingRate::_2x2:
   1571            os << "GL_SHADING_RATE_2X2_PIXELS_QCOM";
   1572            break;
   1573        case ShadingRate::_4x2:
   1574            os << "GL_SHADING_RATE_4X2_PIXELS_QCOM";
   1575            break;
   1576        case ShadingRate::_4x4:
   1577            os << "GL_SHADING_RATE_4X4_PIXELS_QCOM";
   1578            break;
   1579        default:
   1580            os << "GL_INVALID_ENUM";
   1581            break;
   1582    }
   1583    return os;
   1584 }
   1585 
   1586 template <>
   1587 TextureCombine FromGLenum<TextureCombine>(GLenum from)
   1588 {
   1589    switch (from)
   1590    {
   1591        case GL_ADD:
   1592            return TextureCombine::Add;
   1593        case GL_ADD_SIGNED:
   1594            return TextureCombine::AddSigned;
   1595        case GL_DOT3_RGB:
   1596            return TextureCombine::Dot3Rgb;
   1597        case GL_DOT3_RGBA:
   1598            return TextureCombine::Dot3Rgba;
   1599        case GL_INTERPOLATE:
   1600            return TextureCombine::Interpolate;
   1601        case GL_MODULATE:
   1602            return TextureCombine::Modulate;
   1603        case GL_REPLACE:
   1604            return TextureCombine::Replace;
   1605        case GL_SUBTRACT:
   1606            return TextureCombine::Subtract;
   1607        default:
   1608            return TextureCombine::InvalidEnum;
   1609    }
   1610 }
   1611 
   1612 GLenum ToGLenum(TextureCombine from)
   1613 {
   1614    switch (from)
   1615    {
   1616        case TextureCombine::Add:
   1617            return GL_ADD;
   1618        case TextureCombine::AddSigned:
   1619            return GL_ADD_SIGNED;
   1620        case TextureCombine::Dot3Rgb:
   1621            return GL_DOT3_RGB;
   1622        case TextureCombine::Dot3Rgba:
   1623            return GL_DOT3_RGBA;
   1624        case TextureCombine::Interpolate:
   1625            return GL_INTERPOLATE;
   1626        case TextureCombine::Modulate:
   1627            return GL_MODULATE;
   1628        case TextureCombine::Replace:
   1629            return GL_REPLACE;
   1630        case TextureCombine::Subtract:
   1631            return GL_SUBTRACT;
   1632        default:
   1633            UNREACHABLE();
   1634            return 0;
   1635    }
   1636 }
   1637 
   1638 std::ostream &operator<<(std::ostream &os, TextureCombine value)
   1639 {
   1640    switch (value)
   1641    {
   1642        case TextureCombine::Add:
   1643            os << "GL_ADD";
   1644            break;
   1645        case TextureCombine::AddSigned:
   1646            os << "GL_ADD_SIGNED";
   1647            break;
   1648        case TextureCombine::Dot3Rgb:
   1649            os << "GL_DOT3_RGB";
   1650            break;
   1651        case TextureCombine::Dot3Rgba:
   1652            os << "GL_DOT3_RGBA";
   1653            break;
   1654        case TextureCombine::Interpolate:
   1655            os << "GL_INTERPOLATE";
   1656            break;
   1657        case TextureCombine::Modulate:
   1658            os << "GL_MODULATE";
   1659            break;
   1660        case TextureCombine::Replace:
   1661            os << "GL_REPLACE";
   1662            break;
   1663        case TextureCombine::Subtract:
   1664            os << "GL_SUBTRACT";
   1665            break;
   1666        default:
   1667            os << "GL_INVALID_ENUM";
   1668            break;
   1669    }
   1670    return os;
   1671 }
   1672 
   1673 template <>
   1674 TextureEnvMode FromGLenum<TextureEnvMode>(GLenum from)
   1675 {
   1676    switch (from)
   1677    {
   1678        case GL_ADD:
   1679            return TextureEnvMode::Add;
   1680        case GL_BLEND:
   1681            return TextureEnvMode::Blend;
   1682        case GL_COMBINE:
   1683            return TextureEnvMode::Combine;
   1684        case GL_DECAL:
   1685            return TextureEnvMode::Decal;
   1686        case GL_MODULATE:
   1687            return TextureEnvMode::Modulate;
   1688        case GL_REPLACE:
   1689            return TextureEnvMode::Replace;
   1690        default:
   1691            return TextureEnvMode::InvalidEnum;
   1692    }
   1693 }
   1694 
   1695 GLenum ToGLenum(TextureEnvMode from)
   1696 {
   1697    switch (from)
   1698    {
   1699        case TextureEnvMode::Add:
   1700            return GL_ADD;
   1701        case TextureEnvMode::Blend:
   1702            return GL_BLEND;
   1703        case TextureEnvMode::Combine:
   1704            return GL_COMBINE;
   1705        case TextureEnvMode::Decal:
   1706            return GL_DECAL;
   1707        case TextureEnvMode::Modulate:
   1708            return GL_MODULATE;
   1709        case TextureEnvMode::Replace:
   1710            return GL_REPLACE;
   1711        default:
   1712            UNREACHABLE();
   1713            return 0;
   1714    }
   1715 }
   1716 
   1717 std::ostream &operator<<(std::ostream &os, TextureEnvMode value)
   1718 {
   1719    switch (value)
   1720    {
   1721        case TextureEnvMode::Add:
   1722            os << "GL_ADD";
   1723            break;
   1724        case TextureEnvMode::Blend:
   1725            os << "GL_BLEND";
   1726            break;
   1727        case TextureEnvMode::Combine:
   1728            os << "GL_COMBINE";
   1729            break;
   1730        case TextureEnvMode::Decal:
   1731            os << "GL_DECAL";
   1732            break;
   1733        case TextureEnvMode::Modulate:
   1734            os << "GL_MODULATE";
   1735            break;
   1736        case TextureEnvMode::Replace:
   1737            os << "GL_REPLACE";
   1738            break;
   1739        default:
   1740            os << "GL_INVALID_ENUM";
   1741            break;
   1742    }
   1743    return os;
   1744 }
   1745 
   1746 template <>
   1747 TextureEnvParameter FromGLenum<TextureEnvParameter>(GLenum from)
   1748 {
   1749    switch (from)
   1750    {
   1751        case GL_TEXTURE_ENV_MODE:
   1752            return TextureEnvParameter::Mode;
   1753        case GL_TEXTURE_ENV_COLOR:
   1754            return TextureEnvParameter::Color;
   1755        case GL_COMBINE_RGB:
   1756            return TextureEnvParameter::CombineRgb;
   1757        case GL_COMBINE_ALPHA:
   1758            return TextureEnvParameter::CombineAlpha;
   1759        case GL_RGB_SCALE:
   1760            return TextureEnvParameter::RgbScale;
   1761        case GL_ALPHA_SCALE:
   1762            return TextureEnvParameter::AlphaScale;
   1763        case GL_SRC0_RGB:
   1764            return TextureEnvParameter::Src0Rgb;
   1765        case GL_SRC1_RGB:
   1766            return TextureEnvParameter::Src1Rgb;
   1767        case GL_SRC2_RGB:
   1768            return TextureEnvParameter::Src2Rgb;
   1769        case GL_SRC0_ALPHA:
   1770            return TextureEnvParameter::Src0Alpha;
   1771        case GL_SRC1_ALPHA:
   1772            return TextureEnvParameter::Src1Alpha;
   1773        case GL_SRC2_ALPHA:
   1774            return TextureEnvParameter::Src2Alpha;
   1775        case GL_OPERAND0_RGB:
   1776            return TextureEnvParameter::Op0Rgb;
   1777        case GL_OPERAND1_RGB:
   1778            return TextureEnvParameter::Op1Rgb;
   1779        case GL_OPERAND2_RGB:
   1780            return TextureEnvParameter::Op2Rgb;
   1781        case GL_OPERAND0_ALPHA:
   1782            return TextureEnvParameter::Op0Alpha;
   1783        case GL_OPERAND1_ALPHA:
   1784            return TextureEnvParameter::Op1Alpha;
   1785        case GL_OPERAND2_ALPHA:
   1786            return TextureEnvParameter::Op2Alpha;
   1787        case GL_COORD_REPLACE_OES:
   1788            return TextureEnvParameter::PointCoordReplace;
   1789        default:
   1790            return TextureEnvParameter::InvalidEnum;
   1791    }
   1792 }
   1793 
   1794 GLenum ToGLenum(TextureEnvParameter from)
   1795 {
   1796    switch (from)
   1797    {
   1798        case TextureEnvParameter::Mode:
   1799            return GL_TEXTURE_ENV_MODE;
   1800        case TextureEnvParameter::Color:
   1801            return GL_TEXTURE_ENV_COLOR;
   1802        case TextureEnvParameter::CombineRgb:
   1803            return GL_COMBINE_RGB;
   1804        case TextureEnvParameter::CombineAlpha:
   1805            return GL_COMBINE_ALPHA;
   1806        case TextureEnvParameter::RgbScale:
   1807            return GL_RGB_SCALE;
   1808        case TextureEnvParameter::AlphaScale:
   1809            return GL_ALPHA_SCALE;
   1810        case TextureEnvParameter::Src0Rgb:
   1811            return GL_SRC0_RGB;
   1812        case TextureEnvParameter::Src1Rgb:
   1813            return GL_SRC1_RGB;
   1814        case TextureEnvParameter::Src2Rgb:
   1815            return GL_SRC2_RGB;
   1816        case TextureEnvParameter::Src0Alpha:
   1817            return GL_SRC0_ALPHA;
   1818        case TextureEnvParameter::Src1Alpha:
   1819            return GL_SRC1_ALPHA;
   1820        case TextureEnvParameter::Src2Alpha:
   1821            return GL_SRC2_ALPHA;
   1822        case TextureEnvParameter::Op0Rgb:
   1823            return GL_OPERAND0_RGB;
   1824        case TextureEnvParameter::Op1Rgb:
   1825            return GL_OPERAND1_RGB;
   1826        case TextureEnvParameter::Op2Rgb:
   1827            return GL_OPERAND2_RGB;
   1828        case TextureEnvParameter::Op0Alpha:
   1829            return GL_OPERAND0_ALPHA;
   1830        case TextureEnvParameter::Op1Alpha:
   1831            return GL_OPERAND1_ALPHA;
   1832        case TextureEnvParameter::Op2Alpha:
   1833            return GL_OPERAND2_ALPHA;
   1834        case TextureEnvParameter::PointCoordReplace:
   1835            return GL_COORD_REPLACE_OES;
   1836        default:
   1837            UNREACHABLE();
   1838            return 0;
   1839    }
   1840 }
   1841 
   1842 std::ostream &operator<<(std::ostream &os, TextureEnvParameter value)
   1843 {
   1844    switch (value)
   1845    {
   1846        case TextureEnvParameter::Mode:
   1847            os << "GL_TEXTURE_ENV_MODE";
   1848            break;
   1849        case TextureEnvParameter::Color:
   1850            os << "GL_TEXTURE_ENV_COLOR";
   1851            break;
   1852        case TextureEnvParameter::CombineRgb:
   1853            os << "GL_COMBINE_RGB";
   1854            break;
   1855        case TextureEnvParameter::CombineAlpha:
   1856            os << "GL_COMBINE_ALPHA";
   1857            break;
   1858        case TextureEnvParameter::RgbScale:
   1859            os << "GL_RGB_SCALE";
   1860            break;
   1861        case TextureEnvParameter::AlphaScale:
   1862            os << "GL_ALPHA_SCALE";
   1863            break;
   1864        case TextureEnvParameter::Src0Rgb:
   1865            os << "GL_SRC0_RGB";
   1866            break;
   1867        case TextureEnvParameter::Src1Rgb:
   1868            os << "GL_SRC1_RGB";
   1869            break;
   1870        case TextureEnvParameter::Src2Rgb:
   1871            os << "GL_SRC2_RGB";
   1872            break;
   1873        case TextureEnvParameter::Src0Alpha:
   1874            os << "GL_SRC0_ALPHA";
   1875            break;
   1876        case TextureEnvParameter::Src1Alpha:
   1877            os << "GL_SRC1_ALPHA";
   1878            break;
   1879        case TextureEnvParameter::Src2Alpha:
   1880            os << "GL_SRC2_ALPHA";
   1881            break;
   1882        case TextureEnvParameter::Op0Rgb:
   1883            os << "GL_OPERAND0_RGB";
   1884            break;
   1885        case TextureEnvParameter::Op1Rgb:
   1886            os << "GL_OPERAND1_RGB";
   1887            break;
   1888        case TextureEnvParameter::Op2Rgb:
   1889            os << "GL_OPERAND2_RGB";
   1890            break;
   1891        case TextureEnvParameter::Op0Alpha:
   1892            os << "GL_OPERAND0_ALPHA";
   1893            break;
   1894        case TextureEnvParameter::Op1Alpha:
   1895            os << "GL_OPERAND1_ALPHA";
   1896            break;
   1897        case TextureEnvParameter::Op2Alpha:
   1898            os << "GL_OPERAND2_ALPHA";
   1899            break;
   1900        case TextureEnvParameter::PointCoordReplace:
   1901            os << "GL_COORD_REPLACE_OES";
   1902            break;
   1903        default:
   1904            os << "GL_INVALID_ENUM";
   1905            break;
   1906    }
   1907    return os;
   1908 }
   1909 
   1910 template <>
   1911 TextureEnvTarget FromGLenum<TextureEnvTarget>(GLenum from)
   1912 {
   1913    switch (from)
   1914    {
   1915        case GL_TEXTURE_ENV:
   1916            return TextureEnvTarget::Env;
   1917        case GL_POINT_SPRITE_OES:
   1918            return TextureEnvTarget::PointSprite;
   1919        default:
   1920            return TextureEnvTarget::InvalidEnum;
   1921    }
   1922 }
   1923 
   1924 GLenum ToGLenum(TextureEnvTarget from)
   1925 {
   1926    switch (from)
   1927    {
   1928        case TextureEnvTarget::Env:
   1929            return GL_TEXTURE_ENV;
   1930        case TextureEnvTarget::PointSprite:
   1931            return GL_POINT_SPRITE_OES;
   1932        default:
   1933            UNREACHABLE();
   1934            return 0;
   1935    }
   1936 }
   1937 
   1938 std::ostream &operator<<(std::ostream &os, TextureEnvTarget value)
   1939 {
   1940    switch (value)
   1941    {
   1942        case TextureEnvTarget::Env:
   1943            os << "GL_TEXTURE_ENV";
   1944            break;
   1945        case TextureEnvTarget::PointSprite:
   1946            os << "GL_POINT_SPRITE_OES";
   1947            break;
   1948        default:
   1949            os << "GL_INVALID_ENUM";
   1950            break;
   1951    }
   1952    return os;
   1953 }
   1954 
   1955 template <>
   1956 TextureOp FromGLenum<TextureOp>(GLenum from)
   1957 {
   1958    switch (from)
   1959    {
   1960        case GL_ONE_MINUS_SRC_ALPHA:
   1961            return TextureOp::OneMinusSrcAlpha;
   1962        case GL_ONE_MINUS_SRC_COLOR:
   1963            return TextureOp::OneMinusSrcColor;
   1964        case GL_SRC_ALPHA:
   1965            return TextureOp::SrcAlpha;
   1966        case GL_SRC_COLOR:
   1967            return TextureOp::SrcColor;
   1968        default:
   1969            return TextureOp::InvalidEnum;
   1970    }
   1971 }
   1972 
   1973 GLenum ToGLenum(TextureOp from)
   1974 {
   1975    switch (from)
   1976    {
   1977        case TextureOp::OneMinusSrcAlpha:
   1978            return GL_ONE_MINUS_SRC_ALPHA;
   1979        case TextureOp::OneMinusSrcColor:
   1980            return GL_ONE_MINUS_SRC_COLOR;
   1981        case TextureOp::SrcAlpha:
   1982            return GL_SRC_ALPHA;
   1983        case TextureOp::SrcColor:
   1984            return GL_SRC_COLOR;
   1985        default:
   1986            UNREACHABLE();
   1987            return 0;
   1988    }
   1989 }
   1990 
   1991 std::ostream &operator<<(std::ostream &os, TextureOp value)
   1992 {
   1993    switch (value)
   1994    {
   1995        case TextureOp::OneMinusSrcAlpha:
   1996            os << "GL_ONE_MINUS_SRC_ALPHA";
   1997            break;
   1998        case TextureOp::OneMinusSrcColor:
   1999            os << "GL_ONE_MINUS_SRC_COLOR";
   2000            break;
   2001        case TextureOp::SrcAlpha:
   2002            os << "GL_SRC_ALPHA";
   2003            break;
   2004        case TextureOp::SrcColor:
   2005            os << "GL_SRC_COLOR";
   2006            break;
   2007        default:
   2008            os << "GL_INVALID_ENUM";
   2009            break;
   2010    }
   2011    return os;
   2012 }
   2013 
   2014 template <>
   2015 TextureSrc FromGLenum<TextureSrc>(GLenum from)
   2016 {
   2017    switch (from)
   2018    {
   2019        case GL_CONSTANT:
   2020            return TextureSrc::Constant;
   2021        case GL_PREVIOUS:
   2022            return TextureSrc::Previous;
   2023        case GL_PRIMARY_COLOR:
   2024            return TextureSrc::PrimaryColor;
   2025        case GL_TEXTURE:
   2026            return TextureSrc::Texture;
   2027        default:
   2028            return TextureSrc::InvalidEnum;
   2029    }
   2030 }
   2031 
   2032 GLenum ToGLenum(TextureSrc from)
   2033 {
   2034    switch (from)
   2035    {
   2036        case TextureSrc::Constant:
   2037            return GL_CONSTANT;
   2038        case TextureSrc::Previous:
   2039            return GL_PREVIOUS;
   2040        case TextureSrc::PrimaryColor:
   2041            return GL_PRIMARY_COLOR;
   2042        case TextureSrc::Texture:
   2043            return GL_TEXTURE;
   2044        default:
   2045            UNREACHABLE();
   2046            return 0;
   2047    }
   2048 }
   2049 
   2050 std::ostream &operator<<(std::ostream &os, TextureSrc value)
   2051 {
   2052    switch (value)
   2053    {
   2054        case TextureSrc::Constant:
   2055            os << "GL_CONSTANT";
   2056            break;
   2057        case TextureSrc::Previous:
   2058            os << "GL_PREVIOUS";
   2059            break;
   2060        case TextureSrc::PrimaryColor:
   2061            os << "GL_PRIMARY_COLOR";
   2062            break;
   2063        case TextureSrc::Texture:
   2064            os << "GL_TEXTURE";
   2065            break;
   2066        default:
   2067            os << "GL_INVALID_ENUM";
   2068            break;
   2069    }
   2070    return os;
   2071 }
   2072 
   2073 template <>
   2074 TextureTarget FromGLenum<TextureTarget>(GLenum from)
   2075 {
   2076    switch (from)
   2077    {
   2078        case GL_TEXTURE_2D:
   2079            return TextureTarget::_2D;
   2080        case GL_TEXTURE_2D_ARRAY:
   2081            return TextureTarget::_2DArray;
   2082        case GL_TEXTURE_2D_MULTISAMPLE:
   2083            return TextureTarget::_2DMultisample;
   2084        case GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES:
   2085            return TextureTarget::_2DMultisampleArray;
   2086        case GL_TEXTURE_3D:
   2087            return TextureTarget::_3D;
   2088        case GL_TEXTURE_EXTERNAL_OES:
   2089            return TextureTarget::External;
   2090        case GL_TEXTURE_RECTANGLE_ANGLE:
   2091            return TextureTarget::Rectangle;
   2092        case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
   2093            return TextureTarget::CubeMapPositiveX;
   2094        case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
   2095            return TextureTarget::CubeMapNegativeX;
   2096        case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
   2097            return TextureTarget::CubeMapPositiveY;
   2098        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
   2099            return TextureTarget::CubeMapNegativeY;
   2100        case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
   2101            return TextureTarget::CubeMapPositiveZ;
   2102        case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
   2103            return TextureTarget::CubeMapNegativeZ;
   2104        case GL_TEXTURE_CUBE_MAP_ARRAY:
   2105            return TextureTarget::CubeMapArray;
   2106        case GL_TEXTURE_VIDEO_IMAGE_WEBGL:
   2107            return TextureTarget::VideoImage;
   2108        case GL_TEXTURE_BUFFER:
   2109            return TextureTarget::Buffer;
   2110        default:
   2111            return TextureTarget::InvalidEnum;
   2112    }
   2113 }
   2114 
   2115 GLenum ToGLenum(TextureTarget from)
   2116 {
   2117    switch (from)
   2118    {
   2119        case TextureTarget::_2D:
   2120            return GL_TEXTURE_2D;
   2121        case TextureTarget::_2DArray:
   2122            return GL_TEXTURE_2D_ARRAY;
   2123        case TextureTarget::_2DMultisample:
   2124            return GL_TEXTURE_2D_MULTISAMPLE;
   2125        case TextureTarget::_2DMultisampleArray:
   2126            return GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES;
   2127        case TextureTarget::_3D:
   2128            return GL_TEXTURE_3D;
   2129        case TextureTarget::External:
   2130            return GL_TEXTURE_EXTERNAL_OES;
   2131        case TextureTarget::Rectangle:
   2132            return GL_TEXTURE_RECTANGLE_ANGLE;
   2133        case TextureTarget::CubeMapPositiveX:
   2134            return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
   2135        case TextureTarget::CubeMapNegativeX:
   2136            return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
   2137        case TextureTarget::CubeMapPositiveY:
   2138            return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
   2139        case TextureTarget::CubeMapNegativeY:
   2140            return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
   2141        case TextureTarget::CubeMapPositiveZ:
   2142            return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
   2143        case TextureTarget::CubeMapNegativeZ:
   2144            return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
   2145        case TextureTarget::CubeMapArray:
   2146            return GL_TEXTURE_CUBE_MAP_ARRAY;
   2147        case TextureTarget::VideoImage:
   2148            return GL_TEXTURE_VIDEO_IMAGE_WEBGL;
   2149        case TextureTarget::Buffer:
   2150            return GL_TEXTURE_BUFFER;
   2151        default:
   2152            UNREACHABLE();
   2153            return 0;
   2154    }
   2155 }
   2156 
   2157 std::ostream &operator<<(std::ostream &os, TextureTarget value)
   2158 {
   2159    switch (value)
   2160    {
   2161        case TextureTarget::_2D:
   2162            os << "GL_TEXTURE_2D";
   2163            break;
   2164        case TextureTarget::_2DArray:
   2165            os << "GL_TEXTURE_2D_ARRAY";
   2166            break;
   2167        case TextureTarget::_2DMultisample:
   2168            os << "GL_TEXTURE_2D_MULTISAMPLE";
   2169            break;
   2170        case TextureTarget::_2DMultisampleArray:
   2171            os << "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES";
   2172            break;
   2173        case TextureTarget::_3D:
   2174            os << "GL_TEXTURE_3D";
   2175            break;
   2176        case TextureTarget::External:
   2177            os << "GL_TEXTURE_EXTERNAL_OES";
   2178            break;
   2179        case TextureTarget::Rectangle:
   2180            os << "GL_TEXTURE_RECTANGLE_ANGLE";
   2181            break;
   2182        case TextureTarget::CubeMapPositiveX:
   2183            os << "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
   2184            break;
   2185        case TextureTarget::CubeMapNegativeX:
   2186            os << "GL_TEXTURE_CUBE_MAP_NEGATIVE_X";
   2187            break;
   2188        case TextureTarget::CubeMapPositiveY:
   2189            os << "GL_TEXTURE_CUBE_MAP_POSITIVE_Y";
   2190            break;
   2191        case TextureTarget::CubeMapNegativeY:
   2192            os << "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y";
   2193            break;
   2194        case TextureTarget::CubeMapPositiveZ:
   2195            os << "GL_TEXTURE_CUBE_MAP_POSITIVE_Z";
   2196            break;
   2197        case TextureTarget::CubeMapNegativeZ:
   2198            os << "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z";
   2199            break;
   2200        case TextureTarget::CubeMapArray:
   2201            os << "GL_TEXTURE_CUBE_MAP_ARRAY";
   2202            break;
   2203        case TextureTarget::VideoImage:
   2204            os << "GL_TEXTURE_VIDEO_IMAGE_WEBGL";
   2205            break;
   2206        case TextureTarget::Buffer:
   2207            os << "GL_TEXTURE_BUFFER";
   2208            break;
   2209        default:
   2210            os << "GL_INVALID_ENUM";
   2211            break;
   2212    }
   2213    return os;
   2214 }
   2215 
   2216 template <>
   2217 TextureType FromGLenum<TextureType>(GLenum from)
   2218 {
   2219    switch (from)
   2220    {
   2221        case GL_TEXTURE_2D:
   2222            return TextureType::_2D;
   2223        case GL_TEXTURE_2D_ARRAY:
   2224            return TextureType::_2DArray;
   2225        case GL_TEXTURE_2D_MULTISAMPLE:
   2226            return TextureType::_2DMultisample;
   2227        case GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES:
   2228            return TextureType::_2DMultisampleArray;
   2229        case GL_TEXTURE_3D:
   2230            return TextureType::_3D;
   2231        case GL_TEXTURE_EXTERNAL_OES:
   2232            return TextureType::External;
   2233        case GL_TEXTURE_RECTANGLE_ANGLE:
   2234            return TextureType::Rectangle;
   2235        case GL_TEXTURE_CUBE_MAP:
   2236            return TextureType::CubeMap;
   2237        case GL_TEXTURE_CUBE_MAP_ARRAY:
   2238            return TextureType::CubeMapArray;
   2239        case GL_TEXTURE_VIDEO_IMAGE_WEBGL:
   2240            return TextureType::VideoImage;
   2241        case GL_TEXTURE_BUFFER:
   2242            return TextureType::Buffer;
   2243        default:
   2244            return TextureType::InvalidEnum;
   2245    }
   2246 }
   2247 
   2248 GLenum ToGLenum(TextureType from)
   2249 {
   2250    switch (from)
   2251    {
   2252        case TextureType::_2D:
   2253            return GL_TEXTURE_2D;
   2254        case TextureType::_2DArray:
   2255            return GL_TEXTURE_2D_ARRAY;
   2256        case TextureType::_2DMultisample:
   2257            return GL_TEXTURE_2D_MULTISAMPLE;
   2258        case TextureType::_2DMultisampleArray:
   2259            return GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES;
   2260        case TextureType::_3D:
   2261            return GL_TEXTURE_3D;
   2262        case TextureType::External:
   2263            return GL_TEXTURE_EXTERNAL_OES;
   2264        case TextureType::Rectangle:
   2265            return GL_TEXTURE_RECTANGLE_ANGLE;
   2266        case TextureType::CubeMap:
   2267            return GL_TEXTURE_CUBE_MAP;
   2268        case TextureType::CubeMapArray:
   2269            return GL_TEXTURE_CUBE_MAP_ARRAY;
   2270        case TextureType::VideoImage:
   2271            return GL_TEXTURE_VIDEO_IMAGE_WEBGL;
   2272        case TextureType::Buffer:
   2273            return GL_TEXTURE_BUFFER;
   2274        default:
   2275            UNREACHABLE();
   2276            return 0;
   2277    }
   2278 }
   2279 
   2280 std::ostream &operator<<(std::ostream &os, TextureType value)
   2281 {
   2282    switch (value)
   2283    {
   2284        case TextureType::_2D:
   2285            os << "GL_TEXTURE_2D";
   2286            break;
   2287        case TextureType::_2DArray:
   2288            os << "GL_TEXTURE_2D_ARRAY";
   2289            break;
   2290        case TextureType::_2DMultisample:
   2291            os << "GL_TEXTURE_2D_MULTISAMPLE";
   2292            break;
   2293        case TextureType::_2DMultisampleArray:
   2294            os << "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES";
   2295            break;
   2296        case TextureType::_3D:
   2297            os << "GL_TEXTURE_3D";
   2298            break;
   2299        case TextureType::External:
   2300            os << "GL_TEXTURE_EXTERNAL_OES";
   2301            break;
   2302        case TextureType::Rectangle:
   2303            os << "GL_TEXTURE_RECTANGLE_ANGLE";
   2304            break;
   2305        case TextureType::CubeMap:
   2306            os << "GL_TEXTURE_CUBE_MAP";
   2307            break;
   2308        case TextureType::CubeMapArray:
   2309            os << "GL_TEXTURE_CUBE_MAP_ARRAY";
   2310            break;
   2311        case TextureType::VideoImage:
   2312            os << "GL_TEXTURE_VIDEO_IMAGE_WEBGL";
   2313            break;
   2314        case TextureType::Buffer:
   2315            os << "GL_TEXTURE_BUFFER";
   2316            break;
   2317        default:
   2318            os << "GL_INVALID_ENUM";
   2319            break;
   2320    }
   2321    return os;
   2322 }
   2323 
   2324 template <>
   2325 VertexArrayType FromGLenum<VertexArrayType>(GLenum from)
   2326 {
   2327    switch (from)
   2328    {
   2329        case GL_COLOR_ARRAY:
   2330            return VertexArrayType::Color;
   2331        case GL_NORMAL_ARRAY:
   2332            return VertexArrayType::Normal;
   2333        case GL_POINT_SIZE_ARRAY_OES:
   2334            return VertexArrayType::PointSize;
   2335        case GL_TEXTURE_COORD_ARRAY:
   2336            return VertexArrayType::TextureCoord;
   2337        case GL_VERTEX_ARRAY:
   2338            return VertexArrayType::Vertex;
   2339        default:
   2340            return VertexArrayType::InvalidEnum;
   2341    }
   2342 }
   2343 
   2344 GLenum ToGLenum(VertexArrayType from)
   2345 {
   2346    switch (from)
   2347    {
   2348        case VertexArrayType::Color:
   2349            return GL_COLOR_ARRAY;
   2350        case VertexArrayType::Normal:
   2351            return GL_NORMAL_ARRAY;
   2352        case VertexArrayType::PointSize:
   2353            return GL_POINT_SIZE_ARRAY_OES;
   2354        case VertexArrayType::TextureCoord:
   2355            return GL_TEXTURE_COORD_ARRAY;
   2356        case VertexArrayType::Vertex:
   2357            return GL_VERTEX_ARRAY;
   2358        default:
   2359            UNREACHABLE();
   2360            return 0;
   2361    }
   2362 }
   2363 
   2364 std::ostream &operator<<(std::ostream &os, VertexArrayType value)
   2365 {
   2366    switch (value)
   2367    {
   2368        case VertexArrayType::Color:
   2369            os << "GL_COLOR_ARRAY";
   2370            break;
   2371        case VertexArrayType::Normal:
   2372            os << "GL_NORMAL_ARRAY";
   2373            break;
   2374        case VertexArrayType::PointSize:
   2375            os << "GL_POINT_SIZE_ARRAY_OES";
   2376            break;
   2377        case VertexArrayType::TextureCoord:
   2378            os << "GL_TEXTURE_COORD_ARRAY";
   2379            break;
   2380        case VertexArrayType::Vertex:
   2381            os << "GL_VERTEX_ARRAY";
   2382            break;
   2383        default:
   2384            os << "GL_INVALID_ENUM";
   2385            break;
   2386    }
   2387    return os;
   2388 }
   2389 
   2390 template <>
   2391 WrapMode FromGLenum<WrapMode>(GLenum from)
   2392 {
   2393    switch (from)
   2394    {
   2395        case GL_CLAMP_TO_EDGE:
   2396            return WrapMode::ClampToEdge;
   2397        case GL_CLAMP_TO_BORDER:
   2398            return WrapMode::ClampToBorder;
   2399        case GL_MIRRORED_REPEAT:
   2400            return WrapMode::MirroredRepeat;
   2401        case GL_REPEAT:
   2402            return WrapMode::Repeat;
   2403        default:
   2404            return WrapMode::InvalidEnum;
   2405    }
   2406 }
   2407 
   2408 GLenum ToGLenum(WrapMode from)
   2409 {
   2410    switch (from)
   2411    {
   2412        case WrapMode::ClampToEdge:
   2413            return GL_CLAMP_TO_EDGE;
   2414        case WrapMode::ClampToBorder:
   2415            return GL_CLAMP_TO_BORDER;
   2416        case WrapMode::MirroredRepeat:
   2417            return GL_MIRRORED_REPEAT;
   2418        case WrapMode::Repeat:
   2419            return GL_REPEAT;
   2420        default:
   2421            UNREACHABLE();
   2422            return 0;
   2423    }
   2424 }
   2425 
   2426 std::ostream &operator<<(std::ostream &os, WrapMode value)
   2427 {
   2428    switch (value)
   2429    {
   2430        case WrapMode::ClampToEdge:
   2431            os << "GL_CLAMP_TO_EDGE";
   2432            break;
   2433        case WrapMode::ClampToBorder:
   2434            os << "GL_CLAMP_TO_BORDER";
   2435            break;
   2436        case WrapMode::MirroredRepeat:
   2437            os << "GL_MIRRORED_REPEAT";
   2438            break;
   2439        case WrapMode::Repeat:
   2440            os << "GL_REPEAT";
   2441            break;
   2442        default:
   2443            os << "GL_INVALID_ENUM";
   2444            break;
   2445    }
   2446    return os;
   2447 }
   2448 
   2449 }  // namespace gl