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