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