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::VideoImage:
42 return TextureType::VideoImage;
43 case TextureTarget::InvalidEnum:
44 return TextureType::InvalidEnum;
45 default:
46 UNREACHABLE();
47 return TextureType::InvalidEnum;
48 }
49 }
50
IsCubeMapFaceTarget(TextureTarget target)51 bool IsCubeMapFaceTarget(TextureTarget target)
52 {
53 return TextureTargetToType(target) == TextureType::CubeMap;
54 }
55
NonCubeTextureTypeToTarget(TextureType type)56 TextureTarget NonCubeTextureTypeToTarget(TextureType type)
57 {
58 switch (type)
59 {
60 case TextureType::External:
61 return TextureTarget::External;
62 case TextureType::Rectangle:
63 return TextureTarget::Rectangle;
64 case TextureType::_2D:
65 return TextureTarget::_2D;
66 case TextureType::_2DArray:
67 return TextureTarget::_2DArray;
68 case TextureType::_2DMultisample:
69 return TextureTarget::_2DMultisample;
70 case TextureType::_2DMultisampleArray:
71 return TextureTarget::_2DMultisampleArray;
72 case TextureType::_3D:
73 return TextureTarget::_3D;
74 case TextureType::VideoImage:
75 return TextureTarget::VideoImage;
76 default:
77 UNREACHABLE();
78 return TextureTarget::InvalidEnum;
79 }
80 }
81
82 // Check that we can do arithmetic on TextureTarget to convert from / to cube map faces
83 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) -
84 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
85 1u,
86 "");
87 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) -
88 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
89 2u,
90 "");
91 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) -
92 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
93 3u,
94 "");
95 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) -
96 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
97 4u,
98 "");
99 static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) -
100 static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) ==
101 5u,
102 "");
103
CubeFaceIndexToTextureTarget(size_t face)104 TextureTarget CubeFaceIndexToTextureTarget(size_t face)
105 {
106 ASSERT(face < 6u);
107 return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face);
108 }
109
CubeMapTextureTargetToFaceIndex(TextureTarget target)110 size_t CubeMapTextureTargetToFaceIndex(TextureTarget target)
111 {
112 ASSERT(IsCubeMapFaceTarget(target));
113 return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX);
114 }
115
SamplerTypeToTextureType(GLenum samplerType)116 TextureType SamplerTypeToTextureType(GLenum samplerType)
117 {
118 switch (samplerType)
119 {
120 case GL_SAMPLER_2D:
121 case GL_INT_SAMPLER_2D:
122 case GL_UNSIGNED_INT_SAMPLER_2D:
123 case GL_SAMPLER_2D_SHADOW:
124 return TextureType::_2D;
125
126 case GL_SAMPLER_EXTERNAL_OES:
127 return TextureType::External;
128
129 case GL_SAMPLER_CUBE:
130 case GL_INT_SAMPLER_CUBE:
131 case GL_UNSIGNED_INT_SAMPLER_CUBE:
132 case GL_SAMPLER_CUBE_SHADOW:
133 return TextureType::CubeMap;
134
135 case GL_SAMPLER_2D_ARRAY:
136 case GL_INT_SAMPLER_2D_ARRAY:
137 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
138 case GL_SAMPLER_2D_ARRAY_SHADOW:
139 return TextureType::_2DArray;
140
141 case GL_SAMPLER_3D:
142 case GL_INT_SAMPLER_3D:
143 case GL_UNSIGNED_INT_SAMPLER_3D:
144 return TextureType::_3D;
145
146 case GL_SAMPLER_2D_MULTISAMPLE:
147 case GL_INT_SAMPLER_2D_MULTISAMPLE:
148 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
149 return TextureType::_2DMultisample;
150
151 case GL_SAMPLER_2D_MULTISAMPLE_ARRAY:
152 case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
153 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
154 return TextureType::_2DMultisampleArray;
155
156 case GL_SAMPLER_2D_RECT_ANGLE:
157 return TextureType::Rectangle;
158
159 case GL_SAMPLER_VIDEO_IMAGE_WEBGL:
160 return TextureType::VideoImage;
161
162 default:
163 UNREACHABLE();
164 return TextureType::InvalidEnum;
165 }
166 }
167
IsMultisampled(TextureType type)168 bool IsMultisampled(TextureType type)
169 {
170 switch (type)
171 {
172 case TextureType::_2DMultisample:
173 case TextureType::_2DMultisampleArray:
174 return true;
175 default:
176 return false;
177 }
178 }
179
IsArrayTextureType(TextureType type)180 bool IsArrayTextureType(TextureType type)
181 {
182 switch (type)
183 {
184 case TextureType::_2DArray:
185 case TextureType::_2DMultisampleArray:
186 return true;
187 default:
188 return false;
189 }
190 }
191
operator <<(std::ostream & os,PrimitiveMode value)192 std::ostream &operator<<(std::ostream &os, PrimitiveMode value)
193 {
194 switch (value)
195 {
196 case PrimitiveMode::LineLoop:
197 os << "GL_LINE_LOOP";
198 break;
199 case PrimitiveMode::Lines:
200 os << "GL_LINES";
201 break;
202 case PrimitiveMode::LinesAdjacency:
203 os << "GL_LINES_ADJACENCY";
204 break;
205 case PrimitiveMode::LineStrip:
206 os << "GL_LINE_STRIP";
207 break;
208 case PrimitiveMode::LineStripAdjacency:
209 os << "GL_LINE_STRIP_ADJANCENCY";
210 break;
211 case PrimitiveMode::Points:
212 os << "GL_POINTS";
213 break;
214 case PrimitiveMode::TriangleFan:
215 os << "GL_TRIANGLE_FAN";
216 break;
217 case PrimitiveMode::Triangles:
218 os << "GL_TRIANGLES";
219 break;
220 case PrimitiveMode::TrianglesAdjacency:
221 os << "GL_TRIANGLES_ADJANCENCY";
222 break;
223 case PrimitiveMode::TriangleStrip:
224 os << "GL_TRIANGLE_STRIP";
225 break;
226 case PrimitiveMode::TriangleStripAdjacency:
227 os << "GL_TRIANGLE_STRIP_ADJACENCY";
228 break;
229 default:
230 os << "GL_INVALID_ENUM";
231 break;
232 }
233 return os;
234 }
235
operator <<(std::ostream & os,DrawElementsType value)236 std::ostream &operator<<(std::ostream &os, DrawElementsType value)
237 {
238 switch (value)
239 {
240 case DrawElementsType::UnsignedByte:
241 os << "GL_UNSIGNED_BYTE";
242 break;
243 case DrawElementsType::UnsignedShort:
244 os << "GL_UNSIGNED_SHORT";
245 break;
246 case DrawElementsType::UnsignedInt:
247 os << "GL_UNSIGNED_INT";
248 break;
249 default:
250 os << "GL_INVALID_ENUM";
251 break;
252 }
253
254 return os;
255 }
256
operator <<(std::ostream & os,VertexAttribType value)257 std::ostream &operator<<(std::ostream &os, VertexAttribType value)
258 {
259 switch (value)
260 {
261 case VertexAttribType::Byte:
262 os << "GL_BYTE";
263 break;
264 case VertexAttribType::Fixed:
265 os << "GL_FIXED";
266 break;
267 case VertexAttribType::Float:
268 os << "GL_FLOAT";
269 break;
270 case VertexAttribType::HalfFloat:
271 os << "GL_HALF_FLOAT";
272 break;
273 case VertexAttribType::Int:
274 os << "GL_INT";
275 break;
276 case VertexAttribType::Int2101010:
277 os << "GL_INT_10_10_10_2";
278 break;
279 case VertexAttribType::Int1010102:
280 os << "GL_INT_10_10_10_2_OES";
281 break;
282 case VertexAttribType::Short:
283 os << "GL_SHORT";
284 break;
285 case VertexAttribType::UnsignedByte:
286 os << "GL_UNSIGNED_BYTE";
287 break;
288 case VertexAttribType::UnsignedInt:
289 os << "GL_UNSIGNED_INT";
290 break;
291 case VertexAttribType::UnsignedInt2101010:
292 os << "GL_UNSIGNED_INT_10_10_10_2";
293 break;
294 case VertexAttribType::UnsignedInt1010102:
295 os << "GL_UNSIGNED_INT_10_10_10_2_OES";
296 break;
297 case VertexAttribType::UnsignedShort:
298 os << "GL_UNSIGNED_SHORT";
299 break;
300 default:
301 os << "GL_INVALID_ENUM";
302 break;
303 }
304 return os;
305 }
306 } // namespace gl
307
308 namespace egl
309 {
ErrorCodeToMessageType(EGLint errorCode)310 MessageType ErrorCodeToMessageType(EGLint errorCode)
311 {
312 switch (errorCode)
313 {
314 case EGL_BAD_ALLOC:
315 case EGL_CONTEXT_LOST:
316 case EGL_NOT_INITIALIZED:
317 return MessageType::Critical;
318
319 case EGL_BAD_ACCESS:
320 case EGL_BAD_ATTRIBUTE:
321 case EGL_BAD_CONFIG:
322 case EGL_BAD_CONTEXT:
323 case EGL_BAD_CURRENT_SURFACE:
324 case EGL_BAD_DISPLAY:
325 case EGL_BAD_MATCH:
326 case EGL_BAD_NATIVE_PIXMAP:
327 case EGL_BAD_NATIVE_WINDOW:
328 case EGL_BAD_PARAMETER:
329 case EGL_BAD_SURFACE:
330 case EGL_BAD_STREAM_KHR:
331 case EGL_BAD_STATE_KHR:
332 case EGL_BAD_DEVICE_EXT:
333 return MessageType::Error;
334
335 case EGL_SUCCESS:
336 default:
337 UNREACHABLE();
338 return MessageType::InvalidEnum;
339 }
340 }
341 } // namespace egl
342
343 namespace egl_gl
344 {
345
EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)346 gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget)
347 {
348 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
349 return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
350 }
351
EGLImageTargetToTextureTarget(EGLenum eglTarget)352 gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget)
353 {
354 switch (eglTarget)
355 {
356 case EGL_GL_TEXTURE_2D_KHR:
357 return gl::TextureTarget::_2D;
358
359 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
360 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
361 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
362 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
363 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
364 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
365 return EGLCubeMapTargetToCubeMapTarget(eglTarget);
366
367 case EGL_GL_TEXTURE_3D_KHR:
368 return gl::TextureTarget::_3D;
369
370 default:
371 UNREACHABLE();
372 return gl::TextureTarget::InvalidEnum;
373 }
374 }
375
EGLTextureTargetToTextureType(EGLenum eglTarget)376 gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget)
377 {
378 switch (eglTarget)
379 {
380 case EGL_TEXTURE_2D:
381 return gl::TextureType::_2D;
382
383 case EGL_TEXTURE_RECTANGLE_ANGLE:
384 return gl::TextureType::Rectangle;
385
386 default:
387 UNREACHABLE();
388 return gl::TextureType::InvalidEnum;
389 }
390 }
391
392 } // namespace egl_gl
393