1 #include "precompiled.h"
2 //
3 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
6 //
7
8 // utilities.cpp: Conversion functions and other utility routines.
9
10 #include "libGLESv2/utilities.h"
11 #include "libGLESv2/mathutil.h"
12
13 namespace gl
14 {
15
UniformComponentCount(GLenum type)16 int UniformComponentCount(GLenum type)
17 {
18 switch (type)
19 {
20 case GL_BOOL:
21 case GL_FLOAT:
22 case GL_INT:
23 case GL_SAMPLER_2D:
24 case GL_SAMPLER_CUBE:
25 return 1;
26 case GL_BOOL_VEC2:
27 case GL_FLOAT_VEC2:
28 case GL_INT_VEC2:
29 return 2;
30 case GL_INT_VEC3:
31 case GL_FLOAT_VEC3:
32 case GL_BOOL_VEC3:
33 return 3;
34 case GL_BOOL_VEC4:
35 case GL_FLOAT_VEC4:
36 case GL_INT_VEC4:
37 case GL_FLOAT_MAT2:
38 return 4;
39 case GL_FLOAT_MAT3:
40 return 9;
41 case GL_FLOAT_MAT4:
42 return 16;
43 default:
44 UNREACHABLE();
45 }
46
47 return 0;
48 }
49
UniformComponentType(GLenum type)50 GLenum UniformComponentType(GLenum type)
51 {
52 switch(type)
53 {
54 case GL_BOOL:
55 case GL_BOOL_VEC2:
56 case GL_BOOL_VEC3:
57 case GL_BOOL_VEC4:
58 return GL_BOOL;
59 case GL_FLOAT:
60 case GL_FLOAT_VEC2:
61 case GL_FLOAT_VEC3:
62 case GL_FLOAT_VEC4:
63 case GL_FLOAT_MAT2:
64 case GL_FLOAT_MAT3:
65 case GL_FLOAT_MAT4:
66 return GL_FLOAT;
67 case GL_INT:
68 case GL_SAMPLER_2D:
69 case GL_SAMPLER_CUBE:
70 case GL_INT_VEC2:
71 case GL_INT_VEC3:
72 case GL_INT_VEC4:
73 return GL_INT;
74 default:
75 UNREACHABLE();
76 }
77
78 return GL_NONE;
79 }
80
UniformComponentSize(GLenum type)81 size_t UniformComponentSize(GLenum type)
82 {
83 switch(type)
84 {
85 case GL_BOOL: return sizeof(GLint);
86 case GL_FLOAT: return sizeof(GLfloat);
87 case GL_INT: return sizeof(GLint);
88 default: UNREACHABLE();
89 }
90
91 return 0;
92 }
93
UniformInternalSize(GLenum type)94 size_t UniformInternalSize(GLenum type)
95 {
96 // Expanded to 4-element vectors
97 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
98 }
99
UniformExternalSize(GLenum type)100 size_t UniformExternalSize(GLenum type)
101 {
102 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
103 }
104
VariableRowCount(GLenum type)105 int VariableRowCount(GLenum type)
106 {
107 switch (type)
108 {
109 case GL_NONE:
110 return 0;
111 case GL_BOOL:
112 case GL_FLOAT:
113 case GL_INT:
114 case GL_BOOL_VEC2:
115 case GL_FLOAT_VEC2:
116 case GL_INT_VEC2:
117 case GL_INT_VEC3:
118 case GL_FLOAT_VEC3:
119 case GL_BOOL_VEC3:
120 case GL_BOOL_VEC4:
121 case GL_FLOAT_VEC4:
122 case GL_INT_VEC4:
123 case GL_SAMPLER_2D:
124 case GL_SAMPLER_CUBE:
125 return 1;
126 case GL_FLOAT_MAT2:
127 return 2;
128 case GL_FLOAT_MAT3:
129 return 3;
130 case GL_FLOAT_MAT4:
131 return 4;
132 default:
133 UNREACHABLE();
134 }
135
136 return 0;
137 }
138
VariableColumnCount(GLenum type)139 int VariableColumnCount(GLenum type)
140 {
141 switch (type)
142 {
143 case GL_NONE:
144 return 0;
145 case GL_BOOL:
146 case GL_FLOAT:
147 case GL_INT:
148 case GL_SAMPLER_2D:
149 case GL_SAMPLER_CUBE:
150 return 1;
151 case GL_BOOL_VEC2:
152 case GL_FLOAT_VEC2:
153 case GL_INT_VEC2:
154 case GL_FLOAT_MAT2:
155 return 2;
156 case GL_INT_VEC3:
157 case GL_FLOAT_VEC3:
158 case GL_BOOL_VEC3:
159 case GL_FLOAT_MAT3:
160 return 3;
161 case GL_BOOL_VEC4:
162 case GL_FLOAT_VEC4:
163 case GL_INT_VEC4:
164 case GL_FLOAT_MAT4:
165 return 4;
166 default:
167 UNREACHABLE();
168 }
169
170 return 0;
171 }
172
AllocateFirstFreeBits(unsigned int * bits,unsigned int allocationSize,unsigned int bitsSize)173 int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
174 {
175 ASSERT(allocationSize <= bitsSize);
176
177 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
178
179 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
180 {
181 if ((*bits & mask) == 0)
182 {
183 *bits |= mask;
184 return i;
185 }
186
187 mask <<= 1;
188 }
189
190 return -1;
191 }
192
ComputePitch(GLsizei width,GLint internalformat,GLint alignment)193 GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
194 {
195 ASSERT(alignment > 0 && isPow2(alignment));
196
197 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
198 return (rawPitch + alignment - 1) & ~(alignment - 1);
199 }
200
ComputeCompressedPitch(GLsizei width,GLenum internalformat)201 GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
202 {
203 return ComputeCompressedSize(width, 1, internalformat);
204 }
205
ComputeCompressedSize(GLsizei width,GLsizei height,GLenum internalformat)206 GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
207 {
208 switch (internalformat)
209 {
210 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
211 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
212 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
213 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
214 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
215 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
216 default:
217 return 0;
218 }
219 }
220
ComputeTypeSize(GLenum type)221 GLsizei ComputeTypeSize(GLenum type)
222 {
223 switch (type)
224 {
225 case GL_BYTE: return 1;
226 case GL_UNSIGNED_BYTE: return 1;
227 case GL_SHORT: return 2;
228 case GL_UNSIGNED_SHORT: return 2;
229 case GL_INT: return 4;
230 case GL_UNSIGNED_INT: return 4;
231 case GL_FLOAT: return 4;
232 case GL_HALF_FLOAT_OES: return 2;
233 case GL_UNSIGNED_SHORT_5_6_5: return 2;
234 case GL_UNSIGNED_SHORT_4_4_4_4: return 2;
235 case GL_UNSIGNED_SHORT_5_5_5_1: return 2;
236 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return 2;
237 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return 2;
238 case GL_UNSIGNED_INT_2_10_10_10_REV_EXT: return 4;
239 case GL_UNSIGNED_INT_24_8_OES: return 4;
240 default: UNREACHABLE(); return 0;
241 }
242 }
243
IsCompressed(GLenum format)244 bool IsCompressed(GLenum format)
245 {
246 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
247 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
248 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
249 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
250 {
251 return true;
252 }
253 else
254 {
255 return false;
256 }
257 }
258
IsDepthTexture(GLenum format)259 bool IsDepthTexture(GLenum format)
260 {
261 if (format == GL_DEPTH_COMPONENT ||
262 format == GL_DEPTH_STENCIL_OES ||
263 format == GL_DEPTH_COMPONENT16 ||
264 format == GL_DEPTH_COMPONENT32_OES ||
265 format == GL_DEPTH24_STENCIL8_OES)
266 {
267 return true;
268 }
269
270 return false;
271 }
272
IsStencilTexture(GLenum format)273 bool IsStencilTexture(GLenum format)
274 {
275 if (format == GL_DEPTH_STENCIL_OES ||
276 format == GL_DEPTH24_STENCIL8_OES)
277 {
278 return true;
279 }
280
281 return false;
282 }
283
MakeValidSize(bool isImage,bool isCompressed,GLsizei * requestWidth,GLsizei * requestHeight,int * levelOffset)284 void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
285 {
286 int upsampleCount = 0;
287
288 if (isCompressed)
289 {
290 // Don't expand the size of full textures that are at least 4x4
291 // already.
292 if (isImage || *requestWidth < 4 || *requestHeight < 4)
293 {
294 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
295 {
296 *requestWidth <<= 1;
297 *requestHeight <<= 1;
298 upsampleCount++;
299 }
300 }
301 }
302 *levelOffset = upsampleCount;
303 }
304
305 // Returns the size, in bytes, of a single texel in an Image
ComputePixelSize(GLint internalformat)306 int ComputePixelSize(GLint internalformat)
307 {
308 switch (internalformat)
309 {
310 case GL_ALPHA8_EXT: return sizeof(unsigned char);
311 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
312 case GL_ALPHA32F_EXT: return sizeof(float);
313 case GL_LUMINANCE32F_EXT: return sizeof(float);
314 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
315 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
316 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
317 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
318 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
319 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
320 case GL_RGB565: return sizeof(unsigned short);
321 case GL_RGB32F_EXT: return sizeof(float) * 3;
322 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
323 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
324 case GL_RGBA4: return sizeof(unsigned short);
325 case GL_RGB5_A1: return sizeof(unsigned short);
326 case GL_RGBA32F_EXT: return sizeof(float) * 4;
327 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
328 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
329 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
330 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
331 default: UNREACHABLE();
332 }
333
334 return 0;
335 }
336
IsCubemapTextureTarget(GLenum target)337 bool IsCubemapTextureTarget(GLenum target)
338 {
339 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
340 }
341
IsInternalTextureTarget(GLenum target)342 bool IsInternalTextureTarget(GLenum target)
343 {
344 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
345 }
346
ConvertSizedInternalFormat(GLenum format,GLenum type)347 GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
348 {
349 switch (format)
350 {
351 case GL_ALPHA:
352 switch (type)
353 {
354 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
355 case GL_FLOAT: return GL_ALPHA32F_EXT;
356 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
357 default: UNIMPLEMENTED();
358 }
359 break;
360 case GL_LUMINANCE:
361 switch (type)
362 {
363 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
364 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
365 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
366 default: UNIMPLEMENTED();
367 }
368 break;
369 case GL_LUMINANCE_ALPHA:
370 switch (type)
371 {
372 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
373 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
374 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
375 default: UNIMPLEMENTED();
376 }
377 break;
378 case GL_RGB:
379 switch (type)
380 {
381 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
382 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
383 case GL_FLOAT: return GL_RGB32F_EXT;
384 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
385 default: UNIMPLEMENTED();
386 }
387 break;
388 case GL_RGBA:
389 switch (type)
390 {
391 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
392 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
393 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
394 case GL_FLOAT: return GL_RGBA32F_EXT;
395 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
396 break;
397 default: UNIMPLEMENTED();
398 }
399 break;
400 case GL_BGRA_EXT:
401 switch (type)
402 {
403 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
404 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
405 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
406 default: UNIMPLEMENTED();
407 }
408 break;
409 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
410 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
411 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
412 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
413 return format;
414 case GL_DEPTH_COMPONENT:
415 switch (type)
416 {
417 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
418 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
419 default: UNIMPLEMENTED();
420 }
421 break;
422 case GL_DEPTH_STENCIL_OES:
423 switch (type)
424 {
425 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
426 default: UNIMPLEMENTED();
427 }
428 break;
429 default:
430 UNIMPLEMENTED();
431 }
432
433 return GL_NONE;
434 }
435
ExtractFormat(GLenum internalformat)436 GLenum ExtractFormat(GLenum internalformat)
437 {
438 switch (internalformat)
439 {
440 case GL_RGB565: return GL_RGB;
441 case GL_RGBA4: return GL_RGBA;
442 case GL_RGB5_A1: return GL_RGBA;
443 case GL_RGB8_OES: return GL_RGB;
444 case GL_RGBA8_OES: return GL_RGBA;
445 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
446 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
447 case GL_ALPHA8_EXT: return GL_ALPHA;
448 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
449 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
450 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
451 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
452 case GL_RGBA32F_EXT: return GL_RGBA;
453 case GL_RGB32F_EXT: return GL_RGB;
454 case GL_ALPHA32F_EXT: return GL_ALPHA;
455 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
456 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
457 case GL_RGBA16F_EXT: return GL_RGBA;
458 case GL_RGB16F_EXT: return GL_RGB;
459 case GL_ALPHA16F_EXT: return GL_ALPHA;
460 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
461 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
462 case GL_BGRA8_EXT: return GL_BGRA_EXT;
463 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
464 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
465 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
466 default: return GL_NONE; // Unsupported
467 }
468 }
469
ExtractType(GLenum internalformat)470 GLenum ExtractType(GLenum internalformat)
471 {
472 switch (internalformat)
473 {
474 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
475 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
476 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
477 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
478 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
479 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
480 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
481 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
482 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
483 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
484 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
485 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
486 case GL_RGBA32F_EXT: return GL_FLOAT;
487 case GL_RGB32F_EXT: return GL_FLOAT;
488 case GL_ALPHA32F_EXT: return GL_FLOAT;
489 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
490 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
491 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
492 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
493 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
494 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
495 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
496 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
497 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
498 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
499 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
500 default: return GL_NONE; // Unsupported
501 }
502 }
503
IsColorRenderable(GLenum internalformat)504 bool IsColorRenderable(GLenum internalformat)
505 {
506 switch (internalformat)
507 {
508 case GL_RGBA4:
509 case GL_RGB5_A1:
510 case GL_RGB565:
511 case GL_RGB8_OES:
512 case GL_RGBA8_OES:
513 return true;
514 case GL_DEPTH_COMPONENT16:
515 case GL_STENCIL_INDEX8:
516 case GL_DEPTH24_STENCIL8_OES:
517 return false;
518 case GL_BGRA8_EXT:
519 return true;
520 default:
521 UNIMPLEMENTED();
522 }
523
524 return false;
525 }
526
IsDepthRenderable(GLenum internalformat)527 bool IsDepthRenderable(GLenum internalformat)
528 {
529 switch (internalformat)
530 {
531 case GL_DEPTH_COMPONENT16:
532 case GL_DEPTH24_STENCIL8_OES:
533 return true;
534 case GL_STENCIL_INDEX8:
535 case GL_RGBA4:
536 case GL_RGB5_A1:
537 case GL_RGB565:
538 case GL_RGB8_OES:
539 case GL_RGBA8_OES:
540 return false;
541 default:
542 UNIMPLEMENTED();
543 }
544
545 return false;
546 }
547
IsStencilRenderable(GLenum internalformat)548 bool IsStencilRenderable(GLenum internalformat)
549 {
550 switch (internalformat)
551 {
552 case GL_STENCIL_INDEX8:
553 case GL_DEPTH24_STENCIL8_OES:
554 return true;
555 case GL_RGBA4:
556 case GL_RGB5_A1:
557 case GL_RGB565:
558 case GL_RGB8_OES:
559 case GL_RGBA8_OES:
560 case GL_DEPTH_COMPONENT16:
561 return false;
562 default:
563 UNIMPLEMENTED();
564 }
565
566 return false;
567 }
568
IsFloat32Format(GLint internalformat)569 bool IsFloat32Format(GLint internalformat)
570 {
571 switch (internalformat)
572 {
573 case GL_RGBA32F_EXT:
574 case GL_RGB32F_EXT:
575 case GL_ALPHA32F_EXT:
576 case GL_LUMINANCE32F_EXT:
577 case GL_LUMINANCE_ALPHA32F_EXT:
578 return true;
579 default:
580 return false;
581 }
582 }
583
IsFloat16Format(GLint internalformat)584 bool IsFloat16Format(GLint internalformat)
585 {
586 switch (internalformat)
587 {
588 case GL_RGBA16F_EXT:
589 case GL_RGB16F_EXT:
590 case GL_ALPHA16F_EXT:
591 case GL_LUMINANCE16F_EXT:
592 case GL_LUMINANCE_ALPHA16F_EXT:
593 return true;
594 default:
595 return false;
596 }
597 }
598
GetAlphaSize(GLenum colorFormat)599 unsigned int GetAlphaSize(GLenum colorFormat)
600 {
601 switch (colorFormat)
602 {
603 case GL_RGBA16F_EXT:
604 return 16;
605 case GL_RGBA32F_EXT:
606 return 32;
607 case GL_RGBA4:
608 return 4;
609 case GL_RGBA8_OES:
610 case GL_BGRA8_EXT:
611 return 8;
612 case GL_RGB5_A1:
613 return 1;
614 case GL_RGB8_OES:
615 case GL_RGB565:
616 case GL_RGB32F_EXT:
617 case GL_RGB16F_EXT:
618 return 0;
619 default:
620 return 0;
621 }
622 }
623
GetRedSize(GLenum colorFormat)624 unsigned int GetRedSize(GLenum colorFormat)
625 {
626 switch (colorFormat)
627 {
628 case GL_RGBA16F_EXT:
629 case GL_RGB16F_EXT:
630 return 16;
631 case GL_RGBA32F_EXT:
632 case GL_RGB32F_EXT:
633 return 32;
634 case GL_RGBA4:
635 return 4;
636 case GL_RGBA8_OES:
637 case GL_BGRA8_EXT:
638 case GL_RGB8_OES:
639 return 8;
640 case GL_RGB5_A1:
641 case GL_RGB565:
642 return 5;
643 default:
644 return 0;
645 }
646 }
647
GetGreenSize(GLenum colorFormat)648 unsigned int GetGreenSize(GLenum colorFormat)
649 {
650 switch (colorFormat)
651 {
652 case GL_RGBA16F_EXT:
653 case GL_RGB16F_EXT:
654 return 16;
655 case GL_RGBA32F_EXT:
656 case GL_RGB32F_EXT:
657 return 32;
658 case GL_RGBA4:
659 return 4;
660 case GL_RGBA8_OES:
661 case GL_BGRA8_EXT:
662 case GL_RGB8_OES:
663 return 8;
664 case GL_RGB5_A1:
665 return 5;
666 case GL_RGB565:
667 return 6;
668 default:
669 return 0;
670 }
671 }
672
GetBlueSize(GLenum colorFormat)673 unsigned int GetBlueSize(GLenum colorFormat)
674 {
675 switch (colorFormat)
676 {
677 case GL_RGBA16F_EXT:
678 case GL_RGB16F_EXT:
679 return 16;
680 case GL_RGBA32F_EXT:
681 case GL_RGB32F_EXT:
682 return 32;
683 case GL_RGBA4:
684 return 4;
685 case GL_RGBA8_OES:
686 case GL_BGRA8_EXT:
687 case GL_RGB8_OES:
688 return 8;
689 case GL_RGB5_A1:
690 case GL_RGB565:
691 return 5;
692 default:
693 return 0;
694 }
695 }
696
GetDepthSize(GLenum depthFormat)697 unsigned int GetDepthSize(GLenum depthFormat)
698 {
699 switch (depthFormat)
700 {
701 case GL_DEPTH_COMPONENT16: return 16;
702 case GL_DEPTH_COMPONENT32_OES: return 32;
703 case GL_DEPTH24_STENCIL8_OES: return 24;
704 default: return 0;
705 }
706 }
707
GetStencilSize(GLenum stencilFormat)708 unsigned int GetStencilSize(GLenum stencilFormat)
709 {
710 switch (stencilFormat)
711 {
712 case GL_DEPTH24_STENCIL8_OES: return 8;
713 default: return 0;
714 }
715 }
716
IsTriangleMode(GLenum drawMode)717 bool IsTriangleMode(GLenum drawMode)
718 {
719 switch (drawMode)
720 {
721 case GL_TRIANGLES:
722 case GL_TRIANGLE_FAN:
723 case GL_TRIANGLE_STRIP:
724 return true;
725 case GL_POINTS:
726 case GL_LINES:
727 case GL_LINE_LOOP:
728 case GL_LINE_STRIP:
729 return false;
730 default: UNREACHABLE();
731 }
732
733 return false;
734 }
735
736 }
737
getTempPath()738 std::string getTempPath()
739 {
740 char path[MAX_PATH];
741 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
742 if (pathLen == 0)
743 {
744 UNREACHABLE();
745 return std::string();
746 }
747
748 UINT unique = GetTempFileNameA(path, "sh", 0, path);
749 if (unique == 0)
750 {
751 UNREACHABLE();
752 return std::string();
753 }
754
755 return path;
756 }
757
writeFile(const char * path,const void * content,size_t size)758 void writeFile(const char* path, const void* content, size_t size)
759 {
760 FILE* file = fopen(path, "w");
761 if (!file)
762 {
763 UNREACHABLE();
764 return;
765 }
766
767 fwrite(content, sizeof(char), size, file);
768 fclose(file);
769 }
770