• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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