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::InvalidEnum:
46 return TextureType::InvalidEnum;
47 default:
48 UNREACHABLE();
49 return TextureType::InvalidEnum;
50 }
51 }
52
IsCubeMapFaceTarget(TextureTarget target)53 bool IsCubeMapFaceTarget(TextureTarget target)
54 {
55 return TextureTargetToType(target) == TextureType::CubeMap;
56 }
57
NonCubeTextureTypeToTarget(TextureType type)58 TextureTarget NonCubeTextureTypeToTarget(TextureType type)
59 {
60 switch (type)
61 {
62 case TextureType::External:
63 return TextureTarget::External;
64 case TextureType::Rectangle:
65 return TextureTarget::Rectangle;
66 case TextureType::_2D:
67 return TextureTarget::_2D;
68 case TextureType::_2DArray:
69 return TextureTarget::_2DArray;
70 case TextureType::_2DMultisample:
71 return TextureTarget::_2DMultisample;
72 case TextureType::_2DMultisampleArray:
73 return TextureTarget::_2DMultisampleArray;
74 case TextureType::_3D:
75 return TextureTarget::_3D;
76 case TextureType::CubeMapArray:
77 return TextureTarget::CubeMapArray;
78 case TextureType::VideoImage:
79 return TextureTarget::VideoImage;
80 default:
81 UNREACHABLE();
82 return TextureTarget::InvalidEnum;
83 }
84 }
85
86 // Check that we can do arithmetic on TextureTarget to convert from / to cube map faces
87 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) -
88 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
89 1u,
90 "");
91 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) -
92 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
93 2u,
94 "");
95 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) -
96 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
97 3u,
98 "");
99 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) -
100 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
101 4u,
102 "");
103 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) -
104 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
105 5u,
106 "");
107
CubeFaceIndexToTextureTarget(size_t face)108 TextureTarget CubeFaceIndexToTextureTarget(size_t face)
109 {
110 ASSERT(face < 6u);
111 return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face);
112 }
113
CubeMapTextureTargetToFaceIndex(TextureTarget target)114 size_t CubeMapTextureTargetToFaceIndex(TextureTarget target)
115 {
116 ASSERT(IsCubeMapFaceTarget(target));
117 return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX);
118 }
119
SamplerTypeToTextureType(GLenum samplerType)120 TextureType SamplerTypeToTextureType(GLenum samplerType)
121 {
122 switch (samplerType)
123 {
124 case GL_SAMPLER_2D:
125 case GL_INT_SAMPLER_2D:
126 case GL_UNSIGNED_INT_SAMPLER_2D:
127 case GL_SAMPLER_2D_SHADOW:
128 return TextureType::_2D;
129
130 case GL_SAMPLER_EXTERNAL_OES:
131 return TextureType::External;
132
133 case GL_SAMPLER_CUBE:
134 case GL_INT_SAMPLER_CUBE:
135 case GL_UNSIGNED_INT_SAMPLER_CUBE:
136 case GL_SAMPLER_CUBE_SHADOW:
137 return TextureType::CubeMap;
138
139 case GL_SAMPLER_CUBE_MAP_ARRAY:
140 case GL_INT_SAMPLER_CUBE_MAP_ARRAY:
141 case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:
142 case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW:
143 return TextureType::CubeMapArray;
144
145 case GL_SAMPLER_2D_ARRAY:
146 case GL_INT_SAMPLER_2D_ARRAY:
147 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
148 case GL_SAMPLER_2D_ARRAY_SHADOW:
149 return TextureType::_2DArray;
150
151 case GL_SAMPLER_3D:
152 case GL_INT_SAMPLER_3D:
153 case GL_UNSIGNED_INT_SAMPLER_3D:
154 return TextureType::_3D;
155
156 case GL_SAMPLER_2D_MULTISAMPLE:
157 case GL_INT_SAMPLER_2D_MULTISAMPLE:
158 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
159 return TextureType::_2DMultisample;
160
161 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
162 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
163 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
164 return TextureType::_2DMultisampleArray;
165
166 case GL_SAMPLER_2D_RECT_ANGLE:
167 return TextureType::Rectangle;
168
169 case GL_SAMPLER_VIDEO_IMAGE_WEBGL:
170 return TextureType::VideoImage;
171
172 default:
173 UNREACHABLE();
174 return TextureType::InvalidEnum;
175 }
176 }
177
IsMultisampled(TextureType type)178 bool IsMultisampled(TextureType type)
179 {
180 switch (type)
181 {
182 case TextureType::_2DMultisample:
183 case TextureType::_2DMultisampleArray:
184 return true;
185 default:
186 return false;
187 }
188 }
189
IsArrayTextureType(TextureType type)190 bool IsArrayTextureType(TextureType type)
191 {
192 switch (type)
193 {
194 case TextureType::_2DArray:
195 case TextureType::_2DMultisampleArray:
196 case TextureType::CubeMapArray:
197 return true;
198 default:
199 return false;
200 }
201 }
202
operator <<(std::ostream & os,PrimitiveMode value)203 std::ostream &operator<<(std::ostream &os, PrimitiveMode value)
204 {
205 switch (value)
206 {
207 case PrimitiveMode::LineLoop:
208 os << "GL_LINE_LOOP";
209 break;
210 case PrimitiveMode::Lines:
211 os << "GL_LINES";
212 break;
213 case PrimitiveMode::LinesAdjacency:
214 os << "GL_LINES_ADJACENCY";
215 break;
216 case PrimitiveMode::LineStrip:
217 os << "GL_LINE_STRIP";
218 break;
219 case PrimitiveMode::LineStripAdjacency:
220 os << "GL_LINE_STRIP_ADJANCENCY";
221 break;
222 case PrimitiveMode::Points:
223 os << "GL_POINTS";
224 break;
225 case PrimitiveMode::TriangleFan:
226 os << "GL_TRIANGLE_FAN";
227 break;
228 case PrimitiveMode::Triangles:
229 os << "GL_TRIANGLES";
230 break;
231 case PrimitiveMode::TrianglesAdjacency:
232 os << "GL_TRIANGLES_ADJANCENCY";
233 break;
234 case PrimitiveMode::TriangleStrip:
235 os << "GL_TRIANGLE_STRIP";
236 break;
237 case PrimitiveMode::TriangleStripAdjacency:
238 os << "GL_TRIANGLE_STRIP_ADJACENCY";
239 break;
240 default:
241 os << "GL_INVALID_ENUM";
242 break;
243 }
244 return os;
245 }
246
operator <<(std::ostream & os,DrawElementsType value)247 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
248 {
249 switch (value)
250 {
251 case DrawElementsType::UnsignedByte:
252 os << "GL_UNSIGNED_BYTE";
253 break;
254 case DrawElementsType::UnsignedShort:
255 os << "GL_UNSIGNED_SHORT";
256 break;
257 case DrawElementsType::UnsignedInt:
258 os << "GL_UNSIGNED_INT";
259 break;
260 default:
261 os << "GL_INVALID_ENUM";
262 break;
263 }
264
265 return os;
266 }
267
operator <<(std::ostream & os,BlendEquationType value)268 std::ostream &operator<<(std::ostream &os, BlendEquationType value)
269 {
270 switch (value)
271 {
272 case BlendEquationType::Add:
273 os << "GL_FUNC_ADD";
274 break;
275 case BlendEquationType::Min:
276 os << "GL_MIN";
277 break;
278 case BlendEquationType::Max:
279 os << "GL_MAX";
280 break;
281 case BlendEquationType::Subtract:
282 os << "GL_FUNC_SUBTRACT";
283 break;
284 case BlendEquationType::ReverseSubtract:
285 os << "GL_FUNC_REVERSE_SUBTRACT";
286 break;
287 default:
288 os << "GL_INVALID_ENUM";
289 break;
290 }
291
292 return os;
293 }
294
operator <<(std::ostream & os,BlendFactorType value)295 std::ostream &operator<<(std::ostream &os, BlendFactorType value)
296 {
297 switch (value)
298 {
299 case BlendFactorType::Zero:
300 os << "GL_ZERO";
301 break;
302 case BlendFactorType::One:
303 os << "GL_ONE";
304 break;
305 case BlendFactorType::SrcColor:
306 os << "GL_SRC_COLOR";
307 break;
308 case BlendFactorType::OneMinusSrcColor:
309 os << "GL_ONE_MINUS_SRC_COLOR";
310 break;
311 case BlendFactorType::SrcAlpha:
312 os << "GL_SRC_ALPHA";
313 break;
314 case BlendFactorType::OneMinusSrcAlpha:
315 os << "GL_ONE_MINUS_SRC_ALPHA";
316 break;
317 case BlendFactorType::DstAlpha:
318 os << "GL_DST_ALPHA";
319 break;
320 case BlendFactorType::OneMinusDstAlpha:
321 os << "GL_ONE_MINUS_DST_ALPHA";
322 break;
323 case BlendFactorType::DstColor:
324 os << "GL_DST_COLOR";
325 break;
326 case BlendFactorType::OneMinusDstColor:
327 os << "GL_ONE_MINUS_DST_COLOR";
328 break;
329 case BlendFactorType::SrcAlphaSaturate:
330 os << "GL_SRC_ALPHA_SATURATE";
331 break;
332 case BlendFactorType::ConstantColor:
333 os << "GL_CONSTANT_COLOR";
334 break;
335 case BlendFactorType::OneMinusConstantColor:
336 os << "GL_ONE_MINUS_CONSTANT_COLOR";
337 break;
338 case BlendFactorType::ConstantAlpha:
339 os << "GL_CONSTANT_ALPHA";
340 break;
341 case BlendFactorType::OneMinusConstantAlpha:
342 os << "GL_ONE_MINUS_CONSTANT_ALPHA";
343 break;
344 case BlendFactorType::Src1Alpha:
345 os << "GL_SRC1_ALPHA_EXT";
346 break;
347 case BlendFactorType::Src1Color:
348 os << "GL_SRC1_COLOR_EXT";
349 break;
350 case BlendFactorType::OneMinusSrc1Color:
351 os << "GL_ONE_MINUS_SRC1_COLOR_EXT";
352 break;
353 case BlendFactorType::OneMinusSrc1Alpha:
354 os << "GL_ONE_MINUS_SRC1_ALPHA_EXT";
355 break;
356 default:
357 os << "GL_INVALID_ENUM";
358 break;
359 }
360
361 return os;
362 }
363
operator <<(std::ostream & os,VertexAttribType value)364 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
365 {
366 switch (value)
367 {
368 case VertexAttribType::Byte:
369 os << "GL_BYTE";
370 break;
371 case VertexAttribType::Fixed:
372 os << "GL_FIXED";
373 break;
374 case VertexAttribType::Float:
375 os << "GL_FLOAT";
376 break;
377 case VertexAttribType::HalfFloat:
378 os << "GL_HALF_FLOAT";
379 break;
380 case VertexAttribType::Int:
381 os << "GL_INT";
382 break;
383 case VertexAttribType::Int2101010:
384 os << "GL_INT_10_10_10_2";
385 break;
386 case VertexAttribType::Int1010102:
387 os << "GL_INT_10_10_10_2_OES";
388 break;
389 case VertexAttribType::Short:
390 os << "GL_SHORT";
391 break;
392 case VertexAttribType::UnsignedByte:
393 os << "GL_UNSIGNED_BYTE";
394 break;
395 case VertexAttribType::UnsignedInt:
396 os << "GL_UNSIGNED_INT";
397 break;
398 case VertexAttribType::UnsignedInt2101010:
399 os << "GL_UNSIGNED_INT_10_10_10_2";
400 break;
401 case VertexAttribType::UnsignedInt1010102:
402 os << "GL_UNSIGNED_INT_10_10_10_2_OES";
403 break;
404 case VertexAttribType::UnsignedShort:
405 os << "GL_UNSIGNED_SHORT";
406 break;
407 default:
408 os << "GL_INVALID_ENUM";
409 break;
410 }
411 return os;
412 }
413 } // namespace gl
414
415 namespace egl
416 {
ErrorCodeToMessageType(EGLint errorCode)417 MessageType ErrorCodeToMessageType(EGLint errorCode)
418 {
419 switch (errorCode)
420 {
421 case EGL_BAD_ALLOC:
422 case EGL_CONTEXT_LOST:
423 case EGL_NOT_INITIALIZED:
424 return MessageType::Critical;
425
426 case EGL_BAD_ACCESS:
427 case EGL_BAD_ATTRIBUTE:
428 case EGL_BAD_CONFIG:
429 case EGL_BAD_CONTEXT:
430 case EGL_BAD_CURRENT_SURFACE:
431 case EGL_BAD_DISPLAY:
432 case EGL_BAD_MATCH:
433 case EGL_BAD_NATIVE_PIXMAP:
434 case EGL_BAD_NATIVE_WINDOW:
435 case EGL_BAD_PARAMETER:
436 case EGL_BAD_SURFACE:
437 case EGL_BAD_STREAM_KHR:
438 case EGL_BAD_STATE_KHR:
439 case EGL_BAD_DEVICE_EXT:
440 return MessageType::Error;
441
442 case EGL_SUCCESS:
443 default:
444 UNREACHABLE();
445 return MessageType::InvalidEnum;
446 }
447 }
448 } // namespace egl
449
450 namespace egl_gl
451 {
452
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)453 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
454 {
455 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
456 return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
457 }
458
EGLImageTargetToTextureTarget(EGLenum eglTarget)459 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
460 {
461 switch (eglTarget)
462 {
463 case EGL_GL_TEXTURE_2D_KHR:
464 return gl::TextureTarget::_2D;
465
466 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
467 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
468 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
469 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
470 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
471 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
472 return EGLCubeMapTargetToCubeMapTarget(eglTarget);
473
474 case EGL_GL_TEXTURE_3D_KHR:
475 return gl::TextureTarget::_3D;
476
477 default:
478 UNREACHABLE();
479 return gl::TextureTarget::InvalidEnum;
480 }
481 }
482
EGLTextureTargetToTextureType(EGLenum eglTarget)483 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
484 {
485 switch (eglTarget)
486 {
487 case EGL_TEXTURE_2D:
488 return gl::TextureType::_2D;
489
490 case EGL_TEXTURE_RECTANGLE_ANGLE:
491 return gl::TextureType::Rectangle;
492
493 default:
494 UNREACHABLE();
495 return gl::TextureType::InvalidEnum;
496 }
497 }
498
499 } // namespace egl_gl
500