blob: 1fb0994178f3be80572abc633b16e75eef48cd8a [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// utilities.cpp: Conversion functions and other utility routines.
8
daniel@transgaming.combbf56f72010-04-20 18:52:13 +00009#include "libGLESv2/utilities.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000010#include "libGLESv2/mathutil.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000012namespace gl
13{
14
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000015int UniformComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000016{
17 switch (type)
18 {
19 case GL_BOOL:
20 case GL_FLOAT:
21 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000022 case GL_SAMPLER_2D:
23 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000024 return 1;
25 case GL_BOOL_VEC2:
26 case GL_FLOAT_VEC2:
27 case GL_INT_VEC2:
28 return 2;
29 case GL_INT_VEC3:
30 case GL_FLOAT_VEC3:
31 case GL_BOOL_VEC3:
32 return 3;
33 case GL_BOOL_VEC4:
34 case GL_FLOAT_VEC4:
35 case GL_INT_VEC4:
36 case GL_FLOAT_MAT2:
37 return 4;
38 case GL_FLOAT_MAT3:
39 return 9;
40 case GL_FLOAT_MAT4:
41 return 16;
42 default:
43 UNREACHABLE();
44 }
45
46 return 0;
47}
48
49GLenum UniformComponentType(GLenum type)
50{
51 switch(type)
52 {
53 case GL_BOOL:
54 case GL_BOOL_VEC2:
55 case GL_BOOL_VEC3:
56 case GL_BOOL_VEC4:
57 return GL_BOOL;
58 case GL_FLOAT:
59 case GL_FLOAT_VEC2:
60 case GL_FLOAT_VEC3:
61 case GL_FLOAT_VEC4:
62 case GL_FLOAT_MAT2:
63 case GL_FLOAT_MAT3:
64 case GL_FLOAT_MAT4:
65 return GL_FLOAT;
66 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000067 case GL_SAMPLER_2D:
68 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000069 case GL_INT_VEC2:
70 case GL_INT_VEC3:
71 case GL_INT_VEC4:
72 return GL_INT;
73 default:
74 UNREACHABLE();
75 }
76
77 return GL_NONE;
78}
79
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000080size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000081{
82 switch(type)
83 {
daniel@transgaming.com4bf6fd02011-11-12 03:18:16 +000084 case GL_BOOL: return sizeof(GLint);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000085 case GL_FLOAT: return sizeof(GLfloat);
86 case GL_INT: return sizeof(GLint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000087 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000088 }
89
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000090 return 0;
91}
92
daniel@transgaming.come918ea22011-11-12 03:15:28 +000093size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000094{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000095 // Expanded to 4-element vectors
96 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000097}
98
daniel@transgaming.com47c60052011-11-12 03:17:50 +000099size_t UniformExternalSize(GLenum type)
100{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000101 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000102}
103
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000104int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000105{
106 switch (type)
107 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000108 case GL_NONE:
109 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000110 case GL_BOOL:
111 case GL_FLOAT:
112 case GL_INT:
113 case GL_BOOL_VEC2:
114 case GL_FLOAT_VEC2:
115 case GL_INT_VEC2:
116 case GL_INT_VEC3:
117 case GL_FLOAT_VEC3:
118 case GL_BOOL_VEC3:
119 case GL_BOOL_VEC4:
120 case GL_FLOAT_VEC4:
121 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000122 case GL_SAMPLER_2D:
123 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000124 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000125 case GL_FLOAT_MAT2:
126 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000127 case GL_FLOAT_MAT3:
128 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000129 case GL_FLOAT_MAT4:
130 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000131 default:
132 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000133 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000134
135 return 0;
136}
137
138int VariableColumnCount(GLenum type)
139{
140 switch (type)
141 {
142 case GL_NONE:
143 return 0;
144 case GL_BOOL:
145 case GL_FLOAT:
146 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000147 case GL_SAMPLER_2D:
148 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000149 return 1;
150 case GL_BOOL_VEC2:
151 case GL_FLOAT_VEC2:
152 case GL_INT_VEC2:
153 case GL_FLOAT_MAT2:
154 return 2;
155 case GL_INT_VEC3:
156 case GL_FLOAT_VEC3:
157 case GL_BOOL_VEC3:
158 case GL_FLOAT_MAT3:
159 return 3;
160 case GL_BOOL_VEC4:
161 case GL_FLOAT_VEC4:
162 case GL_INT_VEC4:
163 case GL_FLOAT_MAT4:
164 return 4;
165 default:
166 UNREACHABLE();
167 }
168
169 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000170}
171
172int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
173{
174 ASSERT(allocationSize <= bitsSize);
175
176 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
177
178 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
179 {
180 if ((*bits & mask) == 0)
181 {
182 *bits |= mask;
183 return i;
184 }
185
186 mask <<= 1;
187 }
188
189 return -1;
190}
191
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000192GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000193{
194 ASSERT(alignment > 0 && isPow2(alignment));
195
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000196 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000197 return (rawPitch + alignment - 1) & ~(alignment - 1);
198}
199
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000201{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000202 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000203}
204
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000205GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000206{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000207 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000208 {
209 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
210 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000211 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000212 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
213 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000214 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000215 default:
216 return 0;
217 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000218}
219
220bool IsCompressed(GLenum format)
221{
222 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000223 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
224 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
225 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000226 {
227 return true;
228 }
229 else
230 {
231 return false;
232 }
233}
234
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000235bool IsDepthTexture(GLenum format)
236{
237 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000238 format == GL_DEPTH_STENCIL_OES ||
239 format == GL_DEPTH_COMPONENT16 ||
240 format == GL_DEPTH_COMPONENT32_OES ||
241 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000242 {
243 return true;
244 }
245
246 return false;
247}
248
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000249bool IsStencilTexture(GLenum format)
250{
251 if (format == GL_DEPTH_STENCIL_OES ||
252 format == GL_DEPTH24_STENCIL8_OES)
253 {
254 return true;
255 }
256
257 return false;
258}
259
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000260void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
261{
262 int upsampleCount = 0;
263
264 if (isCompressed)
265 {
266 // Don't expand the size of full textures that are at least 4x4
267 // already.
268 if (isImage || *requestWidth < 4 || *requestHeight < 4)
269 {
270 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
271 {
272 *requestWidth <<= 1;
273 *requestHeight <<= 1;
274 upsampleCount++;
275 }
276 }
277 }
278 *levelOffset = upsampleCount;
279}
280
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000281// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000282int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000283{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000284 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000285 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000286 case GL_ALPHA8_EXT: return sizeof(unsigned char);
287 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
288 case GL_ALPHA32F_EXT: return sizeof(float);
289 case GL_LUMINANCE32F_EXT: return sizeof(float);
290 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
291 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
292 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
293 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
294 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
295 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
296 case GL_RGB565: return sizeof(unsigned short);
297 case GL_RGB32F_EXT: return sizeof(float) * 3;
298 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
299 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
300 case GL_RGBA4: return sizeof(unsigned short);
301 case GL_RGB5_A1: return sizeof(unsigned short);
302 case GL_RGBA32F_EXT: return sizeof(float) * 4;
303 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
304 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000305 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
306 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000307 default: UNREACHABLE();
308 }
309
310 return 0;
311}
312
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000313bool IsCubemapTextureTarget(GLenum target)
314{
315 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
316}
317
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000318bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000319{
320 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
321}
322
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000323GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
324{
325 switch (format)
326 {
327 case GL_ALPHA:
328 switch (type)
329 {
330 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
331 case GL_FLOAT: return GL_ALPHA32F_EXT;
332 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
333 default: UNIMPLEMENTED();
334 }
335 break;
336 case GL_LUMINANCE:
337 switch (type)
338 {
339 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
340 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
341 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
342 default: UNIMPLEMENTED();
343 }
344 break;
345 case GL_LUMINANCE_ALPHA:
346 switch (type)
347 {
348 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
349 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
350 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
351 default: UNIMPLEMENTED();
352 }
353 break;
354 case GL_RGB:
355 switch (type)
356 {
357 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
358 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
359 case GL_FLOAT: return GL_RGB32F_EXT;
360 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
361 default: UNIMPLEMENTED();
362 }
363 break;
364 case GL_RGBA:
365 switch (type)
366 {
367 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
368 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
369 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
370 case GL_FLOAT: return GL_RGBA32F_EXT;
371 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
372 break;
373 default: UNIMPLEMENTED();
374 }
375 break;
376 case GL_BGRA_EXT:
377 switch (type)
378 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000379 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000380 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
381 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000382 default: UNIMPLEMENTED();
383 }
384 break;
385 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
386 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
387 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
388 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
389 return format;
390 case GL_DEPTH_COMPONENT:
391 switch (type)
392 {
393 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
394 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
395 default: UNIMPLEMENTED();
396 }
397 break;
398 case GL_DEPTH_STENCIL_OES:
399 switch (type)
400 {
401 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
402 default: UNIMPLEMENTED();
403 }
404 break;
405 default:
406 UNIMPLEMENTED();
407 }
408
409 return GL_NONE;
410}
411
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000412GLenum ExtractFormat(GLenum internalformat)
413{
414 switch (internalformat)
415 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000416 case GL_RGB565: return GL_RGB;
417 case GL_RGBA4: return GL_RGBA;
418 case GL_RGB5_A1: return GL_RGBA;
419 case GL_RGB8_OES: return GL_RGB;
420 case GL_RGBA8_OES: return GL_RGBA;
421 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
422 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
423 case GL_ALPHA8_EXT: return GL_ALPHA;
424 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
425 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
426 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
427 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000428 case GL_RGBA32F_EXT: return GL_RGBA;
429 case GL_RGB32F_EXT: return GL_RGB;
430 case GL_ALPHA32F_EXT: return GL_ALPHA;
431 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
432 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
433 case GL_RGBA16F_EXT: return GL_RGBA;
434 case GL_RGB16F_EXT: return GL_RGB;
435 case GL_ALPHA16F_EXT: return GL_ALPHA;
436 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
437 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
438 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000439 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
440 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
441 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000442 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000443 }
444}
445
446GLenum ExtractType(GLenum internalformat)
447{
448 switch (internalformat)
449 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000450 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
451 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
452 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
453 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
454 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
455 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
456 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
457 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
458 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
459 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
460 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
461 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000462 case GL_RGBA32F_EXT: return GL_FLOAT;
463 case GL_RGB32F_EXT: return GL_FLOAT;
464 case GL_ALPHA32F_EXT: return GL_FLOAT;
465 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
466 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
467 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
468 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
469 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
470 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
471 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
472 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000473 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
474 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
475 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000476 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000477 }
478}
479
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000480bool IsColorRenderable(GLenum internalformat)
481{
482 switch (internalformat)
483 {
484 case GL_RGBA4:
485 case GL_RGB5_A1:
486 case GL_RGB565:
487 case GL_RGB8_OES:
488 case GL_RGBA8_OES:
489 return true;
490 case GL_DEPTH_COMPONENT16:
491 case GL_STENCIL_INDEX8:
492 case GL_DEPTH24_STENCIL8_OES:
493 return false;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000494 case GL_BGRA8_EXT:
495 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000496 default:
497 UNIMPLEMENTED();
498 }
499
500 return false;
501}
502
503bool IsDepthRenderable(GLenum internalformat)
504{
505 switch (internalformat)
506 {
507 case GL_DEPTH_COMPONENT16:
508 case GL_DEPTH24_STENCIL8_OES:
509 return true;
510 case GL_STENCIL_INDEX8:
511 case GL_RGBA4:
512 case GL_RGB5_A1:
513 case GL_RGB565:
514 case GL_RGB8_OES:
515 case GL_RGBA8_OES:
516 return false;
517 default:
518 UNIMPLEMENTED();
519 }
520
521 return false;
522}
523
524bool IsStencilRenderable(GLenum internalformat)
525{
526 switch (internalformat)
527 {
528 case GL_STENCIL_INDEX8:
529 case GL_DEPTH24_STENCIL8_OES:
530 return true;
531 case GL_RGBA4:
532 case GL_RGB5_A1:
533 case GL_RGB565:
534 case GL_RGB8_OES:
535 case GL_RGBA8_OES:
536 case GL_DEPTH_COMPONENT16:
537 return false;
538 default:
539 UNIMPLEMENTED();
540 }
541
542 return false;
543}
544
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000545bool IsFloat32Format(GLint internalformat)
546{
547 switch (internalformat)
548 {
549 case GL_RGBA32F_EXT:
550 case GL_RGB32F_EXT:
551 case GL_ALPHA32F_EXT:
552 case GL_LUMINANCE32F_EXT:
553 case GL_LUMINANCE_ALPHA32F_EXT:
554 return true;
555 default:
556 return false;
557 }
558}
559
560bool IsFloat16Format(GLint internalformat)
561{
562 switch (internalformat)
563 {
564 case GL_RGBA16F_EXT:
565 case GL_RGB16F_EXT:
566 case GL_ALPHA16F_EXT:
567 case GL_LUMINANCE16F_EXT:
568 case GL_LUMINANCE_ALPHA16F_EXT:
569 return true;
570 default:
571 return false;
572 }
573}
574
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000575unsigned int GetAlphaSize(GLenum colorFormat)
576{
577 switch (colorFormat)
578 {
579 case GL_RGBA16F_EXT:
580 return 16;
581 case GL_RGBA32F_EXT:
582 return 32;
583 case GL_RGBA4:
584 return 4;
585 case GL_RGBA8_OES:
586 case GL_BGRA8_EXT:
587 return 8;
588 case GL_RGB5_A1:
589 return 1;
590 case GL_RGB8_OES:
591 case GL_RGB565:
592 case GL_RGB32F_EXT:
593 case GL_RGB16F_EXT:
594 return 0;
595 default:
596 return 0;
597 }
598}
599
600unsigned int GetRedSize(GLenum colorFormat)
601{
602 switch (colorFormat)
603 {
604 case GL_RGBA16F_EXT:
605 case GL_RGB16F_EXT:
606 return 16;
607 case GL_RGBA32F_EXT:
608 case GL_RGB32F_EXT:
609 return 32;
610 case GL_RGBA4:
611 return 4;
612 case GL_RGBA8_OES:
613 case GL_BGRA8_EXT:
614 case GL_RGB8_OES:
615 return 8;
616 case GL_RGB5_A1:
617 case GL_RGB565:
618 return 5;
619 default:
620 return 0;
621 }
622}
623
624unsigned int GetGreenSize(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 return 5;
642 case GL_RGB565:
643 return 6;
644 default:
645 return 0;
646 }
647}
648
649unsigned int GetBlueSize(GLenum colorFormat)
650{
651 switch (colorFormat)
652 {
653 case GL_RGBA16F_EXT:
654 case GL_RGB16F_EXT:
655 return 16;
656 case GL_RGBA32F_EXT:
657 case GL_RGB32F_EXT:
658 return 32;
659 case GL_RGBA4:
660 return 4;
661 case GL_RGBA8_OES:
662 case GL_BGRA8_EXT:
663 case GL_RGB8_OES:
664 return 8;
665 case GL_RGB5_A1:
666 case GL_RGB565:
667 return 5;
668 default:
669 return 0;
670 }
671}
672
673unsigned int GetDepthSize(GLenum depthFormat)
674{
675 switch (depthFormat)
676 {
677 case GL_DEPTH_COMPONENT16: return 16;
678 case GL_DEPTH_COMPONENT32_OES: return 32;
679 case GL_DEPTH24_STENCIL8_OES: return 24;
680 default: return 0;
681 }
682}
683
684unsigned int GetStencilSize(GLenum stencilFormat)
685{
686 switch (stencilFormat)
687 {
688 case GL_DEPTH24_STENCIL8_OES: return 8;
689 default: return 0;
690 }
691}
692
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000693bool IsTriangleMode(GLenum drawMode)
694{
695 switch (drawMode)
696 {
697 case GL_TRIANGLES:
698 case GL_TRIANGLE_FAN:
699 case GL_TRIANGLE_STRIP:
700 return true;
701 case GL_POINTS:
702 case GL_LINES:
703 case GL_LINE_LOOP:
704 case GL_LINE_STRIP:
705 return false;
706 default: UNREACHABLE();
707 }
708
709 return false;
710}
711
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000712}
713
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000714std::string getTempPath()
715{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000716 char path[MAX_PATH];
717 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
718 if (pathLen == 0)
719 {
720 UNREACHABLE();
721 return std::string();
722 }
723
724 UINT unique = GetTempFileNameA(path, "sh", 0, path);
725 if (unique == 0)
726 {
727 UNREACHABLE();
728 return std::string();
729 }
730
731 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000732}
733
734void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000735{
736 FILE* file = fopen(path, "w");
737 if (!file)
738 {
739 UNREACHABLE();
740 return;
741 }
742
743 fwrite(content, sizeof(char), size, file);
744 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000745}