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::Points:
286 os << "GL_POINTS";
287 break;
288 case PrimitiveMode::TriangleFan:
289 os << "GL_TRIANGLE_FAN";
290 break;
291 case PrimitiveMode::Triangles:
292 os << "GL_TRIANGLES";
293 break;
294 case PrimitiveMode::TrianglesAdjacency:
295 os << "GL_TRIANGLES_ADJANCENCY";
296 break;
297 case PrimitiveMode::TriangleStrip:
298 os << "GL_TRIANGLE_STRIP";
299 break;
300 case PrimitiveMode::TriangleStripAdjacency:
301 os << "GL_TRIANGLE_STRIP_ADJACENCY";
302 break;
303 default:
304 os << "GL_INVALID_ENUM";
305 break;
306 }
307 return os;
308 }
309
operator <<(std::ostream & os,DrawElementsType value)310 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
311 {
312 switch (value)
313 {
314 case DrawElementsType::UnsignedByte:
315 os << "GL_UNSIGNED_BYTE";
316 break;
317 case DrawElementsType::UnsignedShort:
318 os << "GL_UNSIGNED_SHORT";
319 break;
320 case DrawElementsType::UnsignedInt:
321 os << "GL_UNSIGNED_INT";
322 break;
323 default:
324 os << "GL_INVALID_ENUM";
325 break;
326 }
327
328 return os;
329 }
330
operator <<(std::ostream & os,BlendEquationType value)331 std::ostream &operator<<(std::ostream &os, BlendEquationType value)
332 {
333 switch (value)
334 {
335 case BlendEquationType::Add:
336 os << "GL_FUNC_ADD";
337 break;
338 case BlendEquationType::Min:
339 os << "GL_MIN";
340 break;
341 case BlendEquationType::Max:
342 os << "GL_MAX";
343 break;
344 case BlendEquationType::Subtract:
345 os << "GL_FUNC_SUBTRACT";
346 break;
347 case BlendEquationType::ReverseSubtract:
348 os << "GL_FUNC_REVERSE_SUBTRACT";
349 break;
350 default:
351 os << "GL_INVALID_ENUM";
352 break;
353 }
354
355 return os;
356 }
357
operator <<(std::ostream & os,BlendFactorType value)358 std::ostream &operator<<(std::ostream &os, BlendFactorType value)
359 {
360 switch (value)
361 {
362 case BlendFactorType::Zero:
363 os << "GL_ZERO";
364 break;
365 case BlendFactorType::One:
366 os << "GL_ONE";
367 break;
368 case BlendFactorType::SrcColor:
369 os << "GL_SRC_COLOR";
370 break;
371 case BlendFactorType::OneMinusSrcColor:
372 os << "GL_ONE_MINUS_SRC_COLOR";
373 break;
374 case BlendFactorType::SrcAlpha:
375 os << "GL_SRC_ALPHA";
376 break;
377 case BlendFactorType::OneMinusSrcAlpha:
378 os << "GL_ONE_MINUS_SRC_ALPHA";
379 break;
380 case BlendFactorType::DstAlpha:
381 os << "GL_DST_ALPHA";
382 break;
383 case BlendFactorType::OneMinusDstAlpha:
384 os << "GL_ONE_MINUS_DST_ALPHA";
385 break;
386 case BlendFactorType::DstColor:
387 os << "GL_DST_COLOR";
388 break;
389 case BlendFactorType::OneMinusDstColor:
390 os << "GL_ONE_MINUS_DST_COLOR";
391 break;
392 case BlendFactorType::SrcAlphaSaturate:
393 os << "GL_SRC_ALPHA_SATURATE";
394 break;
395 case BlendFactorType::ConstantColor:
396 os << "GL_CONSTANT_COLOR";
397 break;
398 case BlendFactorType::OneMinusConstantColor:
399 os << "GL_ONE_MINUS_CONSTANT_COLOR";
400 break;
401 case BlendFactorType::ConstantAlpha:
402 os << "GL_CONSTANT_ALPHA";
403 break;
404 case BlendFactorType::OneMinusConstantAlpha:
405 os << "GL_ONE_MINUS_CONSTANT_ALPHA";
406 break;
407 case BlendFactorType::Src1Alpha:
408 os << "GL_SRC1_ALPHA_EXT";
409 break;
410 case BlendFactorType::Src1Color:
411 os << "GL_SRC1_COLOR_EXT";
412 break;
413 case BlendFactorType::OneMinusSrc1Color:
414 os << "GL_ONE_MINUS_SRC1_COLOR_EXT";
415 break;
416 case BlendFactorType::OneMinusSrc1Alpha:
417 os << "GL_ONE_MINUS_SRC1_ALPHA_EXT";
418 break;
419 default:
420 os << "GL_INVALID_ENUM";
421 break;
422 }
423
424 return os;
425 }
426
operator <<(std::ostream & os,VertexAttribType value)427 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
428 {
429 switch (value)
430 {
431 case VertexAttribType::Byte:
432 os << "GL_BYTE";
433 break;
434 case VertexAttribType::Fixed:
435 os << "GL_FIXED";
436 break;
437 case VertexAttribType::Float:
438 os << "GL_FLOAT";
439 break;
440 case VertexAttribType::HalfFloat:
441 os << "GL_HALF_FLOAT";
442 break;
443 case VertexAttribType::HalfFloatOES:
444 os << "GL_HALF_FLOAT_OES";
445 break;
446 case VertexAttribType::Int:
447 os << "GL_INT";
448 break;
449 case VertexAttribType::Int2101010:
450 os << "GL_INT_2_10_10_10_REV";
451 break;
452 case VertexAttribType::Int1010102:
453 os << "GL_INT_10_10_10_2_OES";
454 break;
455 case VertexAttribType::Short:
456 os << "GL_SHORT";
457 break;
458 case VertexAttribType::UnsignedByte:
459 os << "GL_UNSIGNED_BYTE";
460 break;
461 case VertexAttribType::UnsignedInt:
462 os << "GL_UNSIGNED_INT";
463 break;
464 case VertexAttribType::UnsignedInt2101010:
465 os << "GL_UNSIGNED_INT_2_10_10_10_REV";
466 break;
467 case VertexAttribType::UnsignedInt1010102:
468 os << "GL_UNSIGNED_INT_10_10_10_2_OES";
469 break;
470 case VertexAttribType::UnsignedShort:
471 os << "GL_UNSIGNED_SHORT";
472 break;
473 default:
474 os << "GL_INVALID_ENUM";
475 break;
476 }
477 return os;
478 }
479
operator <<(std::ostream & os,TessEvaluationType value)480 std::ostream &operator<<(std::ostream &os, TessEvaluationType value)
481 {
482 switch (value)
483 {
484 case TessEvaluationType::Triangles:
485 os << "GL_TRIANGLES";
486 break;
487 case TessEvaluationType::Quads:
488 os << "GL_QUADS";
489 break;
490 case TessEvaluationType::Isolines:
491 os << "GL_ISOLINES";
492 break;
493 case TessEvaluationType::EqualSpacing:
494 os << "GL_EQUAL";
495 break;
496 case TessEvaluationType::FractionalEvenSpacing:
497 os << "GL_FRACTIONAL_EVEN";
498 break;
499 case TessEvaluationType::FractionalOddSpacing:
500 os << "GL_FRACTIONAL_ODD";
501 break;
502 case TessEvaluationType::Cw:
503 os << "GL_CW";
504 break;
505 case TessEvaluationType::Ccw:
506 os << "GL_CCW";
507 break;
508 case TessEvaluationType::PointMode:
509 os << "GL_TESS_GEN_POINT_MODE";
510 break;
511 default:
512 os << "GL_INVALID_ENUM";
513 break;
514 }
515 return os;
516 }
517
ShaderTypeToString(ShaderType shaderType)518 const char *ShaderTypeToString(ShaderType shaderType)
519 {
520 constexpr ShaderMap<const char *> kShaderTypeNameMap = {
521 {ShaderType::Vertex, "Vertex"},
522 {ShaderType::TessControl, "Tessellation control"},
523 {ShaderType::TessEvaluation, "Tessellation evaluation"},
524 {ShaderType::Geometry, "Geometry"},
525 {ShaderType::Fragment, "Fragment"},
526 {ShaderType::Compute, "Compute"}};
527 return kShaderTypeNameMap[shaderType];
528 }
529 } // namespace gl
530
531 namespace egl
532 {
ErrorCodeToMessageType(EGLint errorCode)533 MessageType ErrorCodeToMessageType(EGLint errorCode)
534 {
535 switch (errorCode)
536 {
537 case EGL_BAD_ALLOC:
538 case EGL_CONTEXT_LOST:
539 case EGL_NOT_INITIALIZED:
540 return MessageType::Critical;
541
542 case EGL_BAD_ACCESS:
543 case EGL_BAD_ATTRIBUTE:
544 case EGL_BAD_CONFIG:
545 case EGL_BAD_CONTEXT:
546 case EGL_BAD_CURRENT_SURFACE:
547 case EGL_BAD_DISPLAY:
548 case EGL_BAD_MATCH:
549 case EGL_BAD_NATIVE_PIXMAP:
550 case EGL_BAD_NATIVE_WINDOW:
551 case EGL_BAD_PARAMETER:
552 case EGL_BAD_SURFACE:
553 case EGL_BAD_STREAM_KHR:
554 case EGL_BAD_STATE_KHR:
555 case EGL_BAD_DEVICE_EXT:
556 return MessageType::Error;
557
558 case EGL_SUCCESS:
559 default:
560 UNREACHABLE();
561 return MessageType::InvalidEnum;
562 }
563 }
564 } // namespace egl
565
566 namespace egl_gl
567 {
568
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)569 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
570 {
571 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
572 return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
573 }
574
EGLImageTargetToTextureTarget(EGLenum eglTarget)575 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
576 {
577 switch (eglTarget)
578 {
579 case EGL_GL_TEXTURE_2D_KHR:
580 return gl::TextureTarget::_2D;
581
582 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
583 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
584 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
585 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
586 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
587 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
588 return EGLCubeMapTargetToCubeMapTarget(eglTarget);
589
590 case EGL_GL_TEXTURE_3D_KHR:
591 return gl::TextureTarget::_3D;
592
593 default:
594 UNREACHABLE();
595 return gl::TextureTarget::InvalidEnum;
596 }
597 }
598
EGLTextureTargetToTextureType(EGLenum eglTarget)599 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
600 {
601 switch (eglTarget)
602 {
603 case EGL_TEXTURE_2D:
604 return gl::TextureType::_2D;
605
606 case EGL_TEXTURE_RECTANGLE_ANGLE:
607 return gl::TextureType::Rectangle;
608
609 default:
610 UNREACHABLE();
611 return gl::TextureType::InvalidEnum;
612 }
613 }
614 } // namespace egl_gl
615