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