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