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::External:
28             return TextureType::External;
29         case TextureTarget::Rectangle:
30             return TextureType::Rectangle;
31         case TextureTarget::_2D:
32             return TextureType::_2D;
33         case TextureTarget::_2DArray:
34             return TextureType::_2DArray;
35         case TextureTarget::_2DMultisample:
36             return TextureType::_2DMultisample;
37         case TextureTarget::_2DMultisampleArray:
38             return TextureType::_2DMultisampleArray;
39         case TextureTarget::_3D:
40             return TextureType::_3D;
41         case TextureTarget::VideoImage:
42             return TextureType::VideoImage;
43         case TextureTarget::InvalidEnum:
44             return TextureType::InvalidEnum;
45         default:
46             UNREACHABLE();
47             return TextureType::InvalidEnum;
48     }
49 }
50 
IsCubeMapFaceTarget(TextureTarget target)51 bool IsCubeMapFaceTarget(TextureTarget target)
52 {
53     return TextureTargetToType(target) == TextureType::CubeMap;
54 }
55 
NonCubeTextureTypeToTarget(TextureType type)56 TextureTarget NonCubeTextureTypeToTarget(TextureType type)
57 {
58     switch (type)
59     {
60         case TextureType::External:
61             return TextureTarget::External;
62         case TextureType::Rectangle:
63             return TextureTarget::Rectangle;
64         case TextureType::_2D:
65             return TextureTarget::_2D;
66         case TextureType::_2DArray:
67             return TextureTarget::_2DArray;
68         case TextureType::_2DMultisample:
69             return TextureTarget::_2DMultisample;
70         case TextureType::_2DMultisampleArray:
71             return TextureTarget::_2DMultisampleArray;
72         case TextureType::_3D:
73             return TextureTarget::_3D;
74         case TextureType::VideoImage:
75             return TextureTarget::VideoImage;
76         default:
77             UNREACHABLE();
78             return TextureTarget::InvalidEnum;
79     }
80 }
81 
82 // Check that we can do arithmetic on TextureTarget to convert from / to cube map faces
83 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) -
84                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
85                   1u,
86               "");
87 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) -
88                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
89                   2u,
90               "");
91 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) -
92                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
93                   3u,
94               "");
95 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) -
96                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
97                   4u,
98               "");
99 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) -
100                       static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
101                   5u,
102               "");
103 
CubeFaceIndexToTextureTarget(size_t face)104 TextureTarget CubeFaceIndexToTextureTarget(size_t face)
105 {
106     ASSERT(face < 6u);
107     return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face);
108 }
109 
CubeMapTextureTargetToFaceIndex(TextureTarget target)110 size_t CubeMapTextureTargetToFaceIndex(TextureTarget target)
111 {
112     ASSERT(IsCubeMapFaceTarget(target));
113     return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX);
114 }
115 
SamplerTypeToTextureType(GLenum samplerType)116 TextureType SamplerTypeToTextureType(GLenum samplerType)
117 {
118     switch (samplerType)
119     {
120         case GL_SAMPLER_2D:
121         case GL_INT_SAMPLER_2D:
122         case GL_UNSIGNED_INT_SAMPLER_2D:
123         case GL_SAMPLER_2D_SHADOW:
124             return TextureType::_2D;
125 
126         case GL_SAMPLER_EXTERNAL_OES:
127             return TextureType::External;
128 
129         case GL_SAMPLER_CUBE:
130         case GL_INT_SAMPLER_CUBE:
131         case GL_UNSIGNED_INT_SAMPLER_CUBE:
132         case GL_SAMPLER_CUBE_SHADOW:
133             return TextureType::CubeMap;
134 
135         case GL_SAMPLER_2D_ARRAY:
136         case GL_INT_SAMPLER_2D_ARRAY:
137         case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
138         case GL_SAMPLER_2D_ARRAY_SHADOW:
139             return TextureType::_2DArray;
140 
141         case GL_SAMPLER_3D:
142         case GL_INT_SAMPLER_3D:
143         case GL_UNSIGNED_INT_SAMPLER_3D:
144             return TextureType::_3D;
145 
146         case GL_SAMPLER_2D_MULTISAMPLE:
147         case GL_INT_SAMPLER_2D_MULTISAMPLE:
148         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
149             return TextureType::_2DMultisample;
150 
151         case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
152         case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
153         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
154             return TextureType::_2DMultisampleArray;
155 
156         case GL_SAMPLER_2D_RECT_ANGLE:
157             return TextureType::Rectangle;
158 
159         case GL_SAMPLER_VIDEO_IMAGE_WEBGL:
160             return TextureType::VideoImage;
161 
162         default:
163             UNREACHABLE();
164             return TextureType::InvalidEnum;
165     }
166 }
167 
IsMultisampled(TextureType type)168 bool IsMultisampled(TextureType type)
169 {
170     switch (type)
171     {
172         case TextureType::_2DMultisample:
173         case TextureType::_2DMultisampleArray:
174             return true;
175         default:
176             return false;
177     }
178 }
179 
IsArrayTextureType(TextureType type)180 bool IsArrayTextureType(TextureType type)
181 {
182     switch (type)
183     {
184         case TextureType::_2DArray:
185         case TextureType::_2DMultisampleArray:
186             return true;
187         default:
188             return false;
189     }
190 }
191 
operator <<(std::ostream & os,PrimitiveMode value)192 std::ostream &operator<<(std::ostream &os, PrimitiveMode value)
193 {
194     switch (value)
195     {
196         case PrimitiveMode::LineLoop:
197             os << "GL_LINE_LOOP";
198             break;
199         case PrimitiveMode::Lines:
200             os << "GL_LINES";
201             break;
202         case PrimitiveMode::LinesAdjacency:
203             os << "GL_LINES_ADJACENCY";
204             break;
205         case PrimitiveMode::LineStrip:
206             os << "GL_LINE_STRIP";
207             break;
208         case PrimitiveMode::LineStripAdjacency:
209             os << "GL_LINE_STRIP_ADJANCENCY";
210             break;
211         case PrimitiveMode::Points:
212             os << "GL_POINTS";
213             break;
214         case PrimitiveMode::TriangleFan:
215             os << "GL_TRIANGLE_FAN";
216             break;
217         case PrimitiveMode::Triangles:
218             os << "GL_TRIANGLES";
219             break;
220         case PrimitiveMode::TrianglesAdjacency:
221             os << "GL_TRIANGLES_ADJANCENCY";
222             break;
223         case PrimitiveMode::TriangleStrip:
224             os << "GL_TRIANGLE_STRIP";
225             break;
226         case PrimitiveMode::TriangleStripAdjacency:
227             os << "GL_TRIANGLE_STRIP_ADJACENCY";
228             break;
229         default:
230             os << "GL_INVALID_ENUM";
231             break;
232     }
233     return os;
234 }
235 
operator <<(std::ostream & os,DrawElementsType value)236 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
237 {
238     switch (value)
239     {
240         case DrawElementsType::UnsignedByte:
241             os << "GL_UNSIGNED_BYTE";
242             break;
243         case DrawElementsType::UnsignedShort:
244             os << "GL_UNSIGNED_SHORT";
245             break;
246         case DrawElementsType::UnsignedInt:
247             os << "GL_UNSIGNED_INT";
248             break;
249         default:
250             os << "GL_INVALID_ENUM";
251             break;
252     }
253 
254     return os;
255 }
256 
operator <<(std::ostream & os,VertexAttribType value)257 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
258 {
259     switch (value)
260     {
261         case VertexAttribType::Byte:
262             os << "GL_BYTE";
263             break;
264         case VertexAttribType::Fixed:
265             os << "GL_FIXED";
266             break;
267         case VertexAttribType::Float:
268             os << "GL_FLOAT";
269             break;
270         case VertexAttribType::HalfFloat:
271             os << "GL_HALF_FLOAT";
272             break;
273         case VertexAttribType::Int:
274             os << "GL_INT";
275             break;
276         case VertexAttribType::Int2101010:
277             os << "GL_INT_10_10_10_2";
278             break;
279         case VertexAttribType::Int1010102:
280             os << "GL_INT_10_10_10_2_OES";
281             break;
282         case VertexAttribType::Short:
283             os << "GL_SHORT";
284             break;
285         case VertexAttribType::UnsignedByte:
286             os << "GL_UNSIGNED_BYTE";
287             break;
288         case VertexAttribType::UnsignedInt:
289             os << "GL_UNSIGNED_INT";
290             break;
291         case VertexAttribType::UnsignedInt2101010:
292             os << "GL_UNSIGNED_INT_10_10_10_2";
293             break;
294         case VertexAttribType::UnsignedInt1010102:
295             os << "GL_UNSIGNED_INT_10_10_10_2_OES";
296             break;
297         case VertexAttribType::UnsignedShort:
298             os << "GL_UNSIGNED_SHORT";
299             break;
300         default:
301             os << "GL_INVALID_ENUM";
302             break;
303     }
304     return os;
305 }
306 }  // namespace gl
307 
308 namespace egl
309 {
ErrorCodeToMessageType(EGLint errorCode)310 MessageType ErrorCodeToMessageType(EGLint errorCode)
311 {
312     switch (errorCode)
313     {
314         case EGL_BAD_ALLOC:
315         case EGL_CONTEXT_LOST:
316         case EGL_NOT_INITIALIZED:
317             return MessageType::Critical;
318 
319         case EGL_BAD_ACCESS:
320         case EGL_BAD_ATTRIBUTE:
321         case EGL_BAD_CONFIG:
322         case EGL_BAD_CONTEXT:
323         case EGL_BAD_CURRENT_SURFACE:
324         case EGL_BAD_DISPLAY:
325         case EGL_BAD_MATCH:
326         case EGL_BAD_NATIVE_PIXMAP:
327         case EGL_BAD_NATIVE_WINDOW:
328         case EGL_BAD_PARAMETER:
329         case EGL_BAD_SURFACE:
330         case EGL_BAD_STREAM_KHR:
331         case EGL_BAD_STATE_KHR:
332         case EGL_BAD_DEVICE_EXT:
333             return MessageType::Error;
334 
335         case EGL_SUCCESS:
336         default:
337             UNREACHABLE();
338             return MessageType::InvalidEnum;
339     }
340 }
341 }  // namespace egl
342 
343 namespace egl_gl
344 {
345 
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)346 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
347 {
348     ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
349     return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
350 }
351 
EGLImageTargetToTextureTarget(EGLenum eglTarget)352 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
353 {
354     switch (eglTarget)
355     {
356         case EGL_GL_TEXTURE_2D_KHR:
357             return gl::TextureTarget::_2D;
358 
359         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
360         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
361         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
362         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
363         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
364         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
365             return EGLCubeMapTargetToCubeMapTarget(eglTarget);
366 
367         case EGL_GL_TEXTURE_3D_KHR:
368             return gl::TextureTarget::_3D;
369 
370         default:
371             UNREACHABLE();
372             return gl::TextureTarget::InvalidEnum;
373     }
374 }
375 
EGLTextureTargetToTextureType(EGLenum eglTarget)376 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
377 {
378     switch (eglTarget)
379     {
380         case EGL_TEXTURE_2D:
381             return gl::TextureType::_2D;
382 
383         case EGL_TEXTURE_RECTANGLE_ANGLE:
384             return gl::TextureType::Rectangle;
385 
386         default:
387             UNREACHABLE();
388             return gl::TextureType::InvalidEnum;
389     }
390 }
391 
392 }  // namespace egl_gl
393