1 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 // PackedGLEnums.cpp:
6 //   Declares ANGLE-specific enums classes for GLEnum and functions operating
7 //   on them.
8 
9 #include "common/PackedEnums.h"
10 
11 #include "common/utilities.h"
12 
13 namespace gl
14 {
15 
TextureTargetToType(TextureTarget target)16 TextureType TextureTargetToType(TextureTarget target)
17 {
18     switch (target)
19     {
20         case TextureTarget::CubeMapNegativeX:
21         case TextureTarget::CubeMapNegativeY:
22         case TextureTarget::CubeMapNegativeZ:
23         case TextureTarget::CubeMapPositiveX:
24         case TextureTarget::CubeMapPositiveY:
25         case TextureTarget::CubeMapPositiveZ:
26             return TextureType::CubeMap;
27         case TextureTarget::CubeMapArray:
28             return TextureType::CubeMapArray;
29         case TextureTarget::External:
30             return TextureType::External;
31         case TextureTarget::Rectangle:
32             return TextureType::Rectangle;
33         case TextureTarget::_2D:
34             return TextureType::_2D;
35         case TextureTarget::_2DArray:
36             return TextureType::_2DArray;
37         case TextureTarget::_2DMultisample:
38             return TextureType::_2DMultisample;
39         case TextureTarget::_2DMultisampleArray:
40             return TextureType::_2DMultisampleArray;
41         case TextureTarget::_3D:
42             return TextureType::_3D;
43         case TextureTarget::VideoImage:
44             return TextureType::VideoImage;
45         case TextureTarget::Buffer:
46             return TextureType::Buffer;
47         case TextureTarget::InvalidEnum:
48             return TextureType::InvalidEnum;
49         default:
50             UNREACHABLE();
51             return TextureType::InvalidEnum;
52     }
53 }
54 
IsCubeMapFaceTarget(TextureTarget target)55 bool IsCubeMapFaceTarget(TextureTarget target)
56 {
57     return TextureTargetToType(target) == TextureType::CubeMap;
58 }
59 
NonCubeTextureTypeToTarget(TextureType type)60 TextureTarget NonCubeTextureTypeToTarget(TextureType type)
61 {
62     switch (type)
63     {
64         case TextureType::External:
65             return TextureTarget::External;
66         case TextureType::Rectangle:
67             return TextureTarget::Rectangle;
68         case TextureType::_2D:
69             return TextureTarget::_2D;
70         case TextureType::_2DArray:
71             return TextureTarget::_2DArray;
72         case TextureType::_2DMultisample:
73             return TextureTarget::_2DMultisample;
74         case TextureType::_2DMultisampleArray:
75             return TextureTarget::_2DMultisampleArray;
76         case TextureType::_3D:
77             return TextureTarget::_3D;
78         case TextureType::CubeMapArray:
79             return TextureTarget::CubeMapArray;
80         case TextureType::VideoImage:
81             return TextureTarget::VideoImage;
82         case TextureType::Buffer:
83             return TextureTarget::Buffer;
84         default:
85             UNREACHABLE();
86             return TextureTarget::InvalidEnum;
87     }
88 }
89 
90 // Check that we can do arithmetic on TextureTarget to convert from / to cube map faces
91 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) -
92                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
93                   1u,
94               "");
95 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) -
96                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
97                   2u,
98               "");
99 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) -
100                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
101                   3u,
102               "");
103 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) -
104                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
105                   4u,
106               "");
107 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) -
108                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
109                   5u,
110               "");
111 
CubeFaceIndexToTextureTarget(size_t face)112 TextureTarget CubeFaceIndexToTextureTarget(size_t face)
113 {
114     ASSERT(face < 6u);
115     return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face);
116 }
117 
CubeMapTextureTargetToFaceIndex(TextureTarget target)118 size_t CubeMapTextureTargetToFaceIndex(TextureTarget target)
119 {
120     ASSERT(IsCubeMapFaceTarget(target));
121     return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX);
122 }
123 
SamplerTypeToTextureType(GLenum samplerType)124 TextureType SamplerTypeToTextureType(GLenum samplerType)
125 {
126     switch (samplerType)
127     {
128         case GL_SAMPLER_2D:
129         case GL_INT_SAMPLER_2D:
130         case GL_UNSIGNED_INT_SAMPLER_2D:
131         case GL_SAMPLER_2D_SHADOW:
132             return TextureType::_2D;
133 
134         case GL_SAMPLER_EXTERNAL_OES:
135             return TextureType::External;
136 
137         case GL_SAMPLER_CUBE:
138         case GL_INT_SAMPLER_CUBE:
139         case GL_UNSIGNED_INT_SAMPLER_CUBE:
140         case GL_SAMPLER_CUBE_SHADOW:
141             return TextureType::CubeMap;
142 
143         case GL_SAMPLER_CUBE_MAP_ARRAY:
144         case GL_INT_SAMPLER_CUBE_MAP_ARRAY:
145         case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:
146         case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:
147             return TextureType::CubeMapArray;
148 
149         case GL_SAMPLER_2D_ARRAY:
150         case GL_INT_SAMPLER_2D_ARRAY:
151         case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
152         case GL_SAMPLER_2D_ARRAY_SHADOW:
153             return TextureType::_2DArray;
154 
155         case GL_SAMPLER_3D:
156         case GL_INT_SAMPLER_3D:
157         case GL_UNSIGNED_INT_SAMPLER_3D:
158             return TextureType::_3D;
159 
160         case GL_SAMPLER_2D_MULTISAMPLE:
161         case GL_INT_SAMPLER_2D_MULTISAMPLE:
162         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
163             return TextureType::_2DMultisample;
164 
165         case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
166         case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
167         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
168             return TextureType::_2DMultisampleArray;
169 
170         case GL_SAMPLER_BUFFER:
171         case GL_INT_SAMPLER_BUFFER:
172         case GL_UNSIGNED_INT_SAMPLER_BUFFER:
173             return TextureType::Buffer;
174 
175         case GL_SAMPLER_2D_RECT_ANGLE:
176             return TextureType::Rectangle;
177 
178         case GL_SAMPLER_VIDEO_IMAGE_WEBGL:
179             return TextureType::VideoImage;
180 
181         default:
182             UNREACHABLE();
183             return TextureType::InvalidEnum;
184     }
185 }
186 
IsMultisampled(TextureType type)187 bool IsMultisampled(TextureType type)
188 {
189     switch (type)
190     {
191         case TextureType::_2DMultisample:
192         case TextureType::_2DMultisampleArray:
193             return true;
194         default:
195             return false;
196     }
197 }
198 
IsArrayTextureType(TextureType type)199 bool IsArrayTextureType(TextureType type)
200 {
201     switch (type)
202     {
203         case TextureType::_2DArray:
204         case TextureType::_2DMultisampleArray:
205         case TextureType::CubeMapArray:
206             return true;
207         default:
208             return false;
209     }
210 }
211 
IsStaticBufferUsage(BufferUsage useage)212 bool IsStaticBufferUsage(BufferUsage useage)
213 {
214     switch (useage)
215     {
216         case BufferUsage::StaticCopy:
217         case BufferUsage::StaticDraw:
218         case BufferUsage::StaticRead:
219             return true;
220         default:
221             return false;
222     }
223 }
224 
operator <<(std::ostream & os,PrimitiveMode value)225 std::ostream &operator<<(std::ostream &os, PrimitiveMode value)
226 {
227     switch (value)
228     {
229         case PrimitiveMode::LineLoop:
230             os << "GL_LINE_LOOP";
231             break;
232         case PrimitiveMode::Lines:
233             os << "GL_LINES";
234             break;
235         case PrimitiveMode::LinesAdjacency:
236             os << "GL_LINES_ADJACENCY";
237             break;
238         case PrimitiveMode::LineStrip:
239             os << "GL_LINE_STRIP";
240             break;
241         case PrimitiveMode::LineStripAdjacency:
242             os << "GL_LINE_STRIP_ADJANCENCY";
243             break;
244         case PrimitiveMode::Points:
245             os << "GL_POINTS";
246             break;
247         case PrimitiveMode::TriangleFan:
248             os << "GL_TRIANGLE_FAN";
249             break;
250         case PrimitiveMode::Triangles:
251             os << "GL_TRIANGLES";
252             break;
253         case PrimitiveMode::TrianglesAdjacency:
254             os << "GL_TRIANGLES_ADJANCENCY";
255             break;
256         case PrimitiveMode::TriangleStrip:
257             os << "GL_TRIANGLE_STRIP";
258             break;
259         case PrimitiveMode::TriangleStripAdjacency:
260             os << "GL_TRIANGLE_STRIP_ADJACENCY";
261             break;
262         default:
263             os << "GL_INVALID_ENUM";
264             break;
265     }
266     return os;
267 }
268 
operator <<(std::ostream & os,DrawElementsType value)269 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
270 {
271     switch (value)
272     {
273         case DrawElementsType::UnsignedByte:
274             os << "GL_UNSIGNED_BYTE";
275             break;
276         case DrawElementsType::UnsignedShort:
277             os << "GL_UNSIGNED_SHORT";
278             break;
279         case DrawElementsType::UnsignedInt:
280             os << "GL_UNSIGNED_INT";
281             break;
282         default:
283             os << "GL_INVALID_ENUM";
284             break;
285     }
286 
287     return os;
288 }
289 
operator <<(std::ostream & os,BlendEquationType value)290 std::ostream &operator<<(std::ostream &os, BlendEquationType value)
291 {
292     switch (value)
293     {
294         case BlendEquationType::Add:
295             os << "GL_FUNC_ADD";
296             break;
297         case BlendEquationType::Min:
298             os << "GL_MIN";
299             break;
300         case BlendEquationType::Max:
301             os << "GL_MAX";
302             break;
303         case BlendEquationType::Subtract:
304             os << "GL_FUNC_SUBTRACT";
305             break;
306         case BlendEquationType::ReverseSubtract:
307             os << "GL_FUNC_REVERSE_SUBTRACT";
308             break;
309         default:
310             os << "GL_INVALID_ENUM";
311             break;
312     }
313 
314     return os;
315 }
316 
operator <<(std::ostream & os,BlendFactorType value)317 std::ostream &operator<<(std::ostream &os, BlendFactorType value)
318 {
319     switch (value)
320     {
321         case BlendFactorType::Zero:
322             os << "GL_ZERO";
323             break;
324         case BlendFactorType::One:
325             os << "GL_ONE";
326             break;
327         case BlendFactorType::SrcColor:
328             os << "GL_SRC_COLOR";
329             break;
330         case BlendFactorType::OneMinusSrcColor:
331             os << "GL_ONE_MINUS_SRC_COLOR";
332             break;
333         case BlendFactorType::SrcAlpha:
334             os << "GL_SRC_ALPHA";
335             break;
336         case BlendFactorType::OneMinusSrcAlpha:
337             os << "GL_ONE_MINUS_SRC_ALPHA";
338             break;
339         case BlendFactorType::DstAlpha:
340             os << "GL_DST_ALPHA";
341             break;
342         case BlendFactorType::OneMinusDstAlpha:
343             os << "GL_ONE_MINUS_DST_ALPHA";
344             break;
345         case BlendFactorType::DstColor:
346             os << "GL_DST_COLOR";
347             break;
348         case BlendFactorType::OneMinusDstColor:
349             os << "GL_ONE_MINUS_DST_COLOR";
350             break;
351         case BlendFactorType::SrcAlphaSaturate:
352             os << "GL_SRC_ALPHA_SATURATE";
353             break;
354         case BlendFactorType::ConstantColor:
355             os << "GL_CONSTANT_COLOR";
356             break;
357         case BlendFactorType::OneMinusConstantColor:
358             os << "GL_ONE_MINUS_CONSTANT_COLOR";
359             break;
360         case BlendFactorType::ConstantAlpha:
361             os << "GL_CONSTANT_ALPHA";
362             break;
363         case BlendFactorType::OneMinusConstantAlpha:
364             os << "GL_ONE_MINUS_CONSTANT_ALPHA";
365             break;
366         case BlendFactorType::Src1Alpha:
367             os << "GL_SRC1_ALPHA_EXT";
368             break;
369         case BlendFactorType::Src1Color:
370             os << "GL_SRC1_COLOR_EXT";
371             break;
372         case BlendFactorType::OneMinusSrc1Color:
373             os << "GL_ONE_MINUS_SRC1_COLOR_EXT";
374             break;
375         case BlendFactorType::OneMinusSrc1Alpha:
376             os << "GL_ONE_MINUS_SRC1_ALPHA_EXT";
377             break;
378         default:
379             os << "GL_INVALID_ENUM";
380             break;
381     }
382 
383     return os;
384 }
385 
operator <<(std::ostream & os,VertexAttribType value)386 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
387 {
388     switch (value)
389     {
390         case VertexAttribType::Byte:
391             os << "GL_BYTE";
392             break;
393         case VertexAttribType::Fixed:
394             os << "GL_FIXED";
395             break;
396         case VertexAttribType::Float:
397             os << "GL_FLOAT";
398             break;
399         case VertexAttribType::HalfFloat:
400             os << "GL_HALF_FLOAT";
401             break;
402         case VertexAttribType::HalfFloatOES:
403             os << "GL_HALF_FLOAT_OES";
404             break;
405         case VertexAttribType::Int:
406             os << "GL_INT";
407             break;
408         case VertexAttribType::Int2101010:
409             os << "GL_INT_2_10_10_10_REV";
410             break;
411         case VertexAttribType::Int1010102:
412             os << "GL_INT_10_10_10_2_OES";
413             break;
414         case VertexAttribType::Short:
415             os << "GL_SHORT";
416             break;
417         case VertexAttribType::UnsignedByte:
418             os << "GL_UNSIGNED_BYTE";
419             break;
420         case VertexAttribType::UnsignedInt:
421             os << "GL_UNSIGNED_INT";
422             break;
423         case VertexAttribType::UnsignedInt2101010:
424             os << "GL_UNSIGNED_INT_2_10_10_10_REV";
425             break;
426         case VertexAttribType::UnsignedInt1010102:
427             os << "GL_UNSIGNED_INT_10_10_10_2_OES";
428             break;
429         case VertexAttribType::UnsignedShort:
430             os << "GL_UNSIGNED_SHORT";
431             break;
432         default:
433             os << "GL_INVALID_ENUM";
434             break;
435     }
436     return os;
437 }
438 }  // namespace gl
439 
440 namespace egl
441 {
ErrorCodeToMessageType(EGLint errorCode)442 MessageType ErrorCodeToMessageType(EGLint errorCode)
443 {
444     switch (errorCode)
445     {
446         case EGL_BAD_ALLOC:
447         case EGL_CONTEXT_LOST:
448         case EGL_NOT_INITIALIZED:
449             return MessageType::Critical;
450 
451         case EGL_BAD_ACCESS:
452         case EGL_BAD_ATTRIBUTE:
453         case EGL_BAD_CONFIG:
454         case EGL_BAD_CONTEXT:
455         case EGL_BAD_CURRENT_SURFACE:
456         case EGL_BAD_DISPLAY:
457         case EGL_BAD_MATCH:
458         case EGL_BAD_NATIVE_PIXMAP:
459         case EGL_BAD_NATIVE_WINDOW:
460         case EGL_BAD_PARAMETER:
461         case EGL_BAD_SURFACE:
462         case EGL_BAD_STREAM_KHR:
463         case EGL_BAD_STATE_KHR:
464         case EGL_BAD_DEVICE_EXT:
465             return MessageType::Error;
466 
467         case EGL_SUCCESS:
468         default:
469             UNREACHABLE();
470             return MessageType::InvalidEnum;
471     }
472 }
473 }  // namespace egl
474 
475 namespace egl_gl
476 {
477 
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)478 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
479 {
480     ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
481     return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
482 }
483 
EGLImageTargetToTextureTarget(EGLenum eglTarget)484 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
485 {
486     switch (eglTarget)
487     {
488         case EGL_GL_TEXTURE_2D_KHR:
489             return gl::TextureTarget::_2D;
490 
491         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
492         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
493         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
494         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
495         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
496         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
497             return EGLCubeMapTargetToCubeMapTarget(eglTarget);
498 
499         case EGL_GL_TEXTURE_3D_KHR:
500             return gl::TextureTarget::_3D;
501 
502         default:
503             UNREACHABLE();
504             return gl::TextureTarget::InvalidEnum;
505     }
506 }
507 
EGLTextureTargetToTextureType(EGLenum eglTarget)508 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
509 {
510     switch (eglTarget)
511     {
512         case EGL_TEXTURE_2D:
513             return gl::TextureType::_2D;
514 
515         case EGL_TEXTURE_RECTANGLE_ANGLE:
516             return gl::TextureType::Rectangle;
517 
518         default:
519             UNREACHABLE();
520             return gl::TextureType::InvalidEnum;
521     }
522 }
523 
524 }  // namespace egl_gl
525