|
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 |
|
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 |
|
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 |
|
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 |
|
94 size_t UniformInternalSize(GLenum type) |
|
95 { |
|
96 // Expanded to 4-element vectors |
|
97 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4; |
|
98 } |
|
99 |
|
100 size_t UniformExternalSize(GLenum type) |
|
101 { |
|
102 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type); |
|
103 } |
|
104 |
|
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 |
|
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 |
|
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 |
|
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 |
|
201 GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat) |
|
202 { |
|
203 return ComputeCompressedSize(width, 1, internalformat); |
|
204 } |
|
205 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
337 bool IsCubemapTextureTarget(GLenum target) |
|
338 { |
|
339 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); |
|
340 } |
|
341 |
|
342 bool IsInternalTextureTarget(GLenum target) |
|
343 { |
|
344 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); |
|
345 } |
|
346 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 } |