blob: 75d8c258e7ec37dc68a039ee471ee28b816a40e2 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// 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
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000010#include "libGLESv2/utilities.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "libGLESv2/mathutil.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000013namespace gl
14{
15
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000016int UniformComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000017{
18 switch (type)
19 {
20 case GL_BOOL:
21 case GL_FLOAT:
22 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000023 case GL_SAMPLER_2D:
24 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000025 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
50GLenum 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:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000068 case GL_SAMPLER_2D:
69 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000070 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
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000081size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000082{
83 switch(type)
84 {
daniel@transgaming.com4bf6fd02011-11-12 03:18:16 +000085 case GL_BOOL: return sizeof(GLint);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000086 case GL_FLOAT: return sizeof(GLfloat);
87 case GL_INT: return sizeof(GLint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000088 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000089 }
90
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000091 return 0;
92}
93
daniel@transgaming.come918ea22011-11-12 03:15:28 +000094size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000095{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000096 // Expanded to 4-element vectors
97 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000098}
99
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000100size_t UniformExternalSize(GLenum type)
101{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000102 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000103}
104
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000105GLenum UniformBoolVectorType(GLenum type)
106{
107 switch (type)
108 {
109 case GL_FLOAT:
110 case GL_INT:
111 return GL_BOOL;
112 case GL_FLOAT_VEC2:
113 case GL_INT_VEC2:
114 return GL_BOOL_VEC2;
115 case GL_FLOAT_VEC3:
116 case GL_INT_VEC3:
117 return GL_BOOL_VEC3;
118 case GL_FLOAT_VEC4:
119 case GL_INT_VEC4:
120 return GL_BOOL_VEC4;
121
122 default:
123 UNREACHABLE();
124 return GL_NONE;
125 }
126}
127
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000128int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000129{
130 switch (type)
131 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000132 case GL_NONE:
133 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000134 case GL_BOOL:
135 case GL_FLOAT:
136 case GL_INT:
137 case GL_BOOL_VEC2:
138 case GL_FLOAT_VEC2:
139 case GL_INT_VEC2:
140 case GL_INT_VEC3:
141 case GL_FLOAT_VEC3:
142 case GL_BOOL_VEC3:
143 case GL_BOOL_VEC4:
144 case GL_FLOAT_VEC4:
145 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000146 case GL_SAMPLER_2D:
147 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000148 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000149 case GL_FLOAT_MAT2:
150 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000151 case GL_FLOAT_MAT3:
152 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000153 case GL_FLOAT_MAT4:
154 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000155 default:
156 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000157 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000158
159 return 0;
160}
161
162int VariableColumnCount(GLenum type)
163{
164 switch (type)
165 {
166 case GL_NONE:
167 return 0;
168 case GL_BOOL:
169 case GL_FLOAT:
170 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000171 case GL_SAMPLER_2D:
172 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000173 return 1;
174 case GL_BOOL_VEC2:
175 case GL_FLOAT_VEC2:
176 case GL_INT_VEC2:
177 case GL_FLOAT_MAT2:
178 return 2;
179 case GL_INT_VEC3:
180 case GL_FLOAT_VEC3:
181 case GL_BOOL_VEC3:
182 case GL_FLOAT_MAT3:
183 return 3;
184 case GL_BOOL_VEC4:
185 case GL_FLOAT_VEC4:
186 case GL_INT_VEC4:
187 case GL_FLOAT_MAT4:
188 return 4;
189 default:
190 UNREACHABLE();
191 }
192
193 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000194}
195
196int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
197{
198 ASSERT(allocationSize <= bitsSize);
199
200 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
201
202 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
203 {
204 if ((*bits & mask) == 0)
205 {
206 *bits |= mask;
207 return i;
208 }
209
210 mask <<= 1;
211 }
212
213 return -1;
214}
215
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000216GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000217{
218 ASSERT(alignment > 0 && isPow2(alignment));
219
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000220 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000221 return (rawPitch + alignment - 1) & ~(alignment - 1);
222}
223
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000224GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000225{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000226 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000227}
228
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000229GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000230{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000231 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000232 {
233 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
234 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000235 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000236 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
237 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000238 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000239 default:
240 return 0;
241 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000242}
243
244bool IsCompressed(GLenum format)
245{
246 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000247 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
248 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
249 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000250 {
251 return true;
252 }
253 else
254 {
255 return false;
256 }
257}
258
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000259bool IsDepthTexture(GLenum format)
260{
261 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000262 format == GL_DEPTH_STENCIL_OES ||
263 format == GL_DEPTH_COMPONENT16 ||
264 format == GL_DEPTH_COMPONENT32_OES ||
265 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000266 {
267 return true;
268 }
269
270 return false;
271}
272
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000273bool 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
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000284void 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
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000305// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000306int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000307{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000308 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000309 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000310 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;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000329 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
330 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000331 default: UNREACHABLE();
332 }
333
334 return 0;
335}
336
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000337bool IsCubemapTextureTarget(GLenum target)
338{
339 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
340}
341
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000342bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000343{
344 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
345}
346
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000347GLint 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 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000403 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000404 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;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000406 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
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000436GLenum ExtractFormat(GLenum internalformat)
437{
438 switch (internalformat)
439 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000440 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;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000452 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;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000463 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;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000466 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000467 }
468}
469
470GLenum ExtractType(GLenum internalformat)
471{
472 switch (internalformat)
473 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000474 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;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000486 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;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000497 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;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000500 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000501 }
502}
503
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000504bool 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;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000518 case GL_BGRA8_EXT:
519 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000520 default:
521 UNIMPLEMENTED();
522 }
523
524 return false;
525}
526
527bool 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
548bool 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
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000569bool 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
584bool 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
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000599unsigned 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
624unsigned 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
648unsigned 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
673unsigned 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
697unsigned 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
708unsigned int GetStencilSize(GLenum stencilFormat)
709{
710 switch (stencilFormat)
711 {
712 case GL_DEPTH24_STENCIL8_OES: return 8;
713 default: return 0;
714 }
715}
716
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000717bool 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
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000736}
737
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738std::string getTempPath()
739{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000740 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;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000756}
757
758void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000759{
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);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000769}