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 case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT:
136 return TextureType::External;
137
138 case GL_SAMPLER_CUBE:
139 case GL_INT_SAMPLER_CUBE:
140 case GL_UNSIGNED_INT_SAMPLER_CUBE:
141 case GL_SAMPLER_CUBE_SHADOW:
142 return TextureType::CubeMap;
143
144 case GL_SAMPLER_CUBE_MAP_ARRAY:
145 case GL_INT_SAMPLER_CUBE_MAP_ARRAY:
146 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:
147 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:
148 return TextureType::CubeMapArray;
149
150 case GL_SAMPLER_2D_ARRAY:
151 case GL_INT_SAMPLER_2D_ARRAY:
152 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
153 case GL_SAMPLER_2D_ARRAY_SHADOW:
154 return TextureType::_2DArray;
155
156 case GL_SAMPLER_3D:
157 case GL_INT_SAMPLER_3D:
158 case GL_UNSIGNED_INT_SAMPLER_3D:
159 return TextureType::_3D;
160
161 case GL_SAMPLER_2D_MULTISAMPLE:
162 case GL_INT_SAMPLER_2D_MULTISAMPLE:
163 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
164 return TextureType::_2DMultisample;
165
166 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
167 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
168 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
169 return TextureType::_2DMultisampleArray;
170
171 case GL_SAMPLER_BUFFER:
172 case GL_INT_SAMPLER_BUFFER:
173 case GL_UNSIGNED_INT_SAMPLER_BUFFER:
174 return TextureType::Buffer;
175
176 case GL_SAMPLER_2D_RECT_ANGLE:
177 return TextureType::Rectangle;
178
179 case GL_SAMPLER_VIDEO_IMAGE_WEBGL:
180 return TextureType::VideoImage;
181
182 default:
183 UNREACHABLE();
184 return TextureType::InvalidEnum;
185 }
186 }
187
ImageTypeToTextureType(GLenum imageType)188 TextureType ImageTypeToTextureType(GLenum imageType)
189 {
190 switch (imageType)
191 {
192 case GL_IMAGE_2D:
193 case GL_INT_IMAGE_2D:
194 case GL_UNSIGNED_INT_IMAGE_2D:
195 return TextureType::_2D;
196
197 case GL_IMAGE_CUBE:
198 case GL_INT_IMAGE_CUBE:
199 case GL_UNSIGNED_INT_IMAGE_CUBE:
200 return TextureType::CubeMap;
201
202 case GL_IMAGE_CUBE_MAP_ARRAY:
203 case GL_INT_IMAGE_CUBE_MAP_ARRAY:
204 case GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY:
205 return TextureType::CubeMapArray;
206
207 case GL_IMAGE_2D_ARRAY:
208 case GL_INT_IMAGE_2D_ARRAY:
209 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
210 return TextureType::_2DArray;
211
212 case GL_IMAGE_3D:
213 case GL_INT_IMAGE_3D:
214 case GL_UNSIGNED_INT_IMAGE_3D:
215 return TextureType::_3D;
216
217 case GL_IMAGE_BUFFER:
218 case GL_INT_IMAGE_BUFFER:
219 case GL_UNSIGNED_INT_IMAGE_BUFFER:
220 return TextureType::Buffer;
221
222 default:
223 UNREACHABLE();
224 return TextureType::InvalidEnum;
225 }
226 }
227
IsMultisampled(TextureType type)228 bool IsMultisampled(TextureType type)
229 {
230 switch (type)
231 {
232 case TextureType::_2DMultisample:
233 case TextureType::_2DMultisampleArray:
234 return true;
235 default:
236 return false;
237 }
238 }
239
IsArrayTextureType(TextureType type)240 bool IsArrayTextureType(TextureType type)
241 {
242 switch (type)
243 {
244 case TextureType::_2DArray:
245 case TextureType::_2DMultisampleArray:
246 case TextureType::CubeMapArray:
247 return true;
248 default:
249 return false;
250 }
251 }
252
IsStaticBufferUsage(BufferUsage useage)253 bool IsStaticBufferUsage(BufferUsage useage)
254 {
255 switch (useage)
256 {
257 case BufferUsage::StaticCopy:
258 case BufferUsage::StaticDraw:
259 case BufferUsage::StaticRead:
260 return true;
261 default:
262 return false;
263 }
264 }
265
operator <<(std::ostream & os,PrimitiveMode value)266 std::ostream &operator<<(std::ostream &os, PrimitiveMode value)
267 {
268 switch (value)
269 {
270 case PrimitiveMode::LineLoop:
271 os << "GL_LINE_LOOP";
272 break;
273 case PrimitiveMode::Lines:
274 os << "GL_LINES";
275 break;
276 case PrimitiveMode::LinesAdjacency:
277 os << "GL_LINES_ADJACENCY";
278 break;
279 case PrimitiveMode::LineStrip:
280 os << "GL_LINE_STRIP";
281 break;
282 case PrimitiveMode::LineStripAdjacency:
283 os << "GL_LINE_STRIP_ADJANCENCY";
284 break;
285 case PrimitiveMode::Patches:
286 os << "GL_PATCHES";
287 break;
288 case PrimitiveMode::Points:
289 os << "GL_POINTS";
290 break;
291 case PrimitiveMode::TriangleFan:
292 os << "GL_TRIANGLE_FAN";
293 break;
294 case PrimitiveMode::Triangles:
295 os << "GL_TRIANGLES";
296 break;
297 case PrimitiveMode::TrianglesAdjacency:
298 os << "GL_TRIANGLES_ADJANCENCY";
299 break;
300 case PrimitiveMode::TriangleStrip:
301 os << "GL_TRIANGLE_STRIP";
302 break;
303 case PrimitiveMode::TriangleStripAdjacency:
304 os << "GL_TRIANGLE_STRIP_ADJACENCY";
305 break;
306 default:
307 os << "GL_INVALID_ENUM";
308 break;
309 }
310 return os;
311 }
312
operator <<(std::ostream & os,DrawElementsType value)313 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
314 {
315 switch (value)
316 {
317 case DrawElementsType::UnsignedByte:
318 os << "GL_UNSIGNED_BYTE";
319 break;
320 case DrawElementsType::UnsignedShort:
321 os << "GL_UNSIGNED_SHORT";
322 break;
323 case DrawElementsType::UnsignedInt:
324 os << "GL_UNSIGNED_INT";
325 break;
326 default:
327 os << "GL_INVALID_ENUM";
328 break;
329 }
330
331 return os;
332 }
333
operator <<(std::ostream & os,BlendEquationType value)334 std::ostream &operator<<(std::ostream &os, BlendEquationType value)
335 {
336 switch (value)
337 {
338 case BlendEquationType::Add:
339 os << "GL_FUNC_ADD";
340 break;
341 case BlendEquationType::Min:
342 os << "GL_MIN";
343 break;
344 case BlendEquationType::Max:
345 os << "GL_MAX";
346 break;
347 case BlendEquationType::Subtract:
348 os << "GL_FUNC_SUBTRACT";
349 break;
350 case BlendEquationType::ReverseSubtract:
351 os << "GL_FUNC_REVERSE_SUBTRACT";
352 break;
353 case BlendEquationType::Multiply:
354 os << "GL_MULTIPLY_KHR";
355 break;
356 case BlendEquationType::Screen:
357 os << "GL_SCREEN_KHR";
358 break;
359 case BlendEquationType::Overlay:
360 os << "GL_OVERLAY_KHR";
361 break;
362 case BlendEquationType::Darken:
363 os << "GL_DARKEN_KHR";
364 break;
365 case BlendEquationType::Lighten:
366 os << "GL_LIGHTEN_KHR";
367 break;
368 case BlendEquationType::Colordodge:
369 os << "GL_COLORDODGE_KHR";
370 break;
371 case BlendEquationType::Colorburn:
372 os << "GL_COLORBURN_KHR";
373 break;
374 case BlendEquationType::Hardlight:
375 os << "GL_HARDLIGHT_KHR";
376 break;
377 case BlendEquationType::Softlight:
378 os << "GL_SOFTLIGHT_KHR";
379 break;
380 case BlendEquationType::Difference:
381 os << "GL_DIFFERENCE_KHR";
382 break;
383 case BlendEquationType::Exclusion:
384 os << "GL_EXCLUSION_KHR";
385 break;
386 case BlendEquationType::HslHue:
387 os << "GL_HSL_HUE_KHR";
388 break;
389 case BlendEquationType::HslSaturation:
390 os << "GL_HSL_SATURATION_KHR";
391 break;
392 case BlendEquationType::HslColor:
393 os << "GL_HSL_COLOR_KHR";
394 break;
395 case BlendEquationType::HslLuminosity:
396 os << "GL_HSL_LUMINOSITY_KHR";
397 break;
398 default:
399 os << "GL_INVALID_ENUM";
400 break;
401 }
402
403 return os;
404 }
405
operator <<(std::ostream & os,BlendFactorType value)406 std::ostream &operator<<(std::ostream &os, BlendFactorType value)
407 {
408 switch (value)
409 {
410 case BlendFactorType::Zero:
411 os << "GL_ZERO";
412 break;
413 case BlendFactorType::One:
414 os << "GL_ONE";
415 break;
416 case BlendFactorType::SrcColor:
417 os << "GL_SRC_COLOR";
418 break;
419 case BlendFactorType::OneMinusSrcColor:
420 os << "GL_ONE_MINUS_SRC_COLOR";
421 break;
422 case BlendFactorType::SrcAlpha:
423 os << "GL_SRC_ALPHA";
424 break;
425 case BlendFactorType::OneMinusSrcAlpha:
426 os << "GL_ONE_MINUS_SRC_ALPHA";
427 break;
428 case BlendFactorType::DstAlpha:
429 os << "GL_DST_ALPHA";
430 break;
431 case BlendFactorType::OneMinusDstAlpha:
432 os << "GL_ONE_MINUS_DST_ALPHA";
433 break;
434 case BlendFactorType::DstColor:
435 os << "GL_DST_COLOR";
436 break;
437 case BlendFactorType::OneMinusDstColor:
438 os << "GL_ONE_MINUS_DST_COLOR";
439 break;
440 case BlendFactorType::SrcAlphaSaturate:
441 os << "GL_SRC_ALPHA_SATURATE";
442 break;
443 case BlendFactorType::ConstantColor:
444 os << "GL_CONSTANT_COLOR";
445 break;
446 case BlendFactorType::OneMinusConstantColor:
447 os << "GL_ONE_MINUS_CONSTANT_COLOR";
448 break;
449 case BlendFactorType::ConstantAlpha:
450 os << "GL_CONSTANT_ALPHA";
451 break;
452 case BlendFactorType::OneMinusConstantAlpha:
453 os << "GL_ONE_MINUS_CONSTANT_ALPHA";
454 break;
455 case BlendFactorType::Src1Alpha:
456 os << "GL_SRC1_ALPHA_EXT";
457 break;
458 case BlendFactorType::Src1Color:
459 os << "GL_SRC1_COLOR_EXT";
460 break;
461 case BlendFactorType::OneMinusSrc1Color:
462 os << "GL_ONE_MINUS_SRC1_COLOR_EXT";
463 break;
464 case BlendFactorType::OneMinusSrc1Alpha:
465 os << "GL_ONE_MINUS_SRC1_ALPHA_EXT";
466 break;
467 default:
468 os << "GL_INVALID_ENUM";
469 break;
470 }
471
472 return os;
473 }
474
operator <<(std::ostream & os,VertexAttribType value)475 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
476 {
477 switch (value)
478 {
479 case VertexAttribType::Byte:
480 os << "GL_BYTE";
481 break;
482 case VertexAttribType::Fixed:
483 os << "GL_FIXED";
484 break;
485 case VertexAttribType::Float:
486 os << "GL_FLOAT";
487 break;
488 case VertexAttribType::HalfFloat:
489 os << "GL_HALF_FLOAT";
490 break;
491 case VertexAttribType::HalfFloatOES:
492 os << "GL_HALF_FLOAT_OES";
493 break;
494 case VertexAttribType::Int:
495 os << "GL_INT";
496 break;
497 case VertexAttribType::Int2101010:
498 os << "GL_INT_2_10_10_10_REV";
499 break;
500 case VertexAttribType::Int1010102:
501 os << "GL_INT_10_10_10_2_OES";
502 break;
503 case VertexAttribType::Short:
504 os << "GL_SHORT";
505 break;
506 case VertexAttribType::UnsignedByte:
507 os << "GL_UNSIGNED_BYTE";
508 break;
509 case VertexAttribType::UnsignedInt:
510 os << "GL_UNSIGNED_INT";
511 break;
512 case VertexAttribType::UnsignedInt2101010:
513 os << "GL_UNSIGNED_INT_2_10_10_10_REV";
514 break;
515 case VertexAttribType::UnsignedInt1010102:
516 os << "GL_UNSIGNED_INT_10_10_10_2_OES";
517 break;
518 case VertexAttribType::UnsignedShort:
519 os << "GL_UNSIGNED_SHORT";
520 break;
521 default:
522 os << "GL_INVALID_ENUM";
523 break;
524 }
525 return os;
526 }
527
operator <<(std::ostream & os,TessEvaluationType value)528 std::ostream &operator<<(std::ostream &os, TessEvaluationType value)
529 {
530 switch (value)
531 {
532 case TessEvaluationType::Triangles:
533 os << "GL_TRIANGLES";
534 break;
535 case TessEvaluationType::Quads:
536 os << "GL_QUADS";
537 break;
538 case TessEvaluationType::Isolines:
539 os << "GL_ISOLINES";
540 break;
541 case TessEvaluationType::EqualSpacing:
542 os << "GL_EQUAL";
543 break;
544 case TessEvaluationType::FractionalEvenSpacing:
545 os << "GL_FRACTIONAL_EVEN";
546 break;
547 case TessEvaluationType::FractionalOddSpacing:
548 os << "GL_FRACTIONAL_ODD";
549 break;
550 case TessEvaluationType::Cw:
551 os << "GL_CW";
552 break;
553 case TessEvaluationType::Ccw:
554 os << "GL_CCW";
555 break;
556 case TessEvaluationType::PointMode:
557 os << "GL_TESS_GEN_POINT_MODE";
558 break;
559 default:
560 os << "GL_INVALID_ENUM";
561 break;
562 }
563 return os;
564 }
565
ShaderTypeToString(ShaderType shaderType)566 const char *ShaderTypeToString(ShaderType shaderType)
567 {
568 constexpr ShaderMap<const char *> kShaderTypeNameMap = {
569 {ShaderType::Vertex, "Vertex"},
570 {ShaderType::TessControl, "Tessellation control"},
571 {ShaderType::TessEvaluation, "Tessellation evaluation"},
572 {ShaderType::Geometry, "Geometry"},
573 {ShaderType::Fragment, "Fragment"},
574 {ShaderType::Compute, "Compute"}};
575 return kShaderTypeNameMap[shaderType];
576 }
577 } // namespace gl
578
579 namespace egl
580 {
ErrorCodeToMessageType(EGLint errorCode)581 MessageType ErrorCodeToMessageType(EGLint errorCode)
582 {
583 switch (errorCode)
584 {
585 case EGL_BAD_ALLOC:
586 case EGL_CONTEXT_LOST:
587 case EGL_NOT_INITIALIZED:
588 return MessageType::Critical;
589
590 case EGL_BAD_ACCESS:
591 case EGL_BAD_ATTRIBUTE:
592 case EGL_BAD_CONFIG:
593 case EGL_BAD_CONTEXT:
594 case EGL_BAD_CURRENT_SURFACE:
595 case EGL_BAD_DISPLAY:
596 case EGL_BAD_MATCH:
597 case EGL_BAD_NATIVE_PIXMAP:
598 case EGL_BAD_NATIVE_WINDOW:
599 case EGL_BAD_PARAMETER:
600 case EGL_BAD_SURFACE:
601 case EGL_BAD_STREAM_KHR:
602 case EGL_BAD_STATE_KHR:
603 case EGL_BAD_DEVICE_EXT:
604 return MessageType::Error;
605
606 case EGL_SUCCESS:
607 default:
608 UNREACHABLE();
609 return MessageType::InvalidEnum;
610 }
611 }
612 } // namespace egl
613
614 namespace egl_gl
615 {
616
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)617 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
618 {
619 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
620 return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
621 }
622
EGLImageTargetToTextureTarget(EGLenum eglTarget)623 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
624 {
625 switch (eglTarget)
626 {
627 case EGL_GL_TEXTURE_2D_KHR:
628 return gl::TextureTarget::_2D;
629
630 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
631 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
632 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
633 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
634 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
635 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
636 return EGLCubeMapTargetToCubeMapTarget(eglTarget);
637
638 case EGL_GL_TEXTURE_3D_KHR:
639 return gl::TextureTarget::_3D;
640
641 default:
642 UNREACHABLE();
643 return gl::TextureTarget::InvalidEnum;
644 }
645 }
646
EGLTextureTargetToTextureType(EGLenum eglTarget)647 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
648 {
649 switch (eglTarget)
650 {
651 case EGL_TEXTURE_2D:
652 return gl::TextureType::_2D;
653
654 case EGL_TEXTURE_RECTANGLE_ANGLE:
655 return gl::TextureType::Rectangle;
656
657 default:
658 UNREACHABLE();
659 return gl::TextureType::InvalidEnum;
660 }
661 }
662 } // namespace egl_gl
663