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