blob: 62f5303b7168a0e8d3f1714382ca66315fddbaea [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:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000025 case GL_UNSIGNED_INT:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000026 return 1;
27 case GL_BOOL_VEC2:
28 case GL_FLOAT_VEC2:
29 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000030 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000031 return 2;
32 case GL_INT_VEC3:
33 case GL_FLOAT_VEC3:
34 case GL_BOOL_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000035 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000036 return 3;
37 case GL_BOOL_VEC4:
38 case GL_FLOAT_VEC4:
39 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000040 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000041 case GL_FLOAT_MAT2:
42 return 4;
43 case GL_FLOAT_MAT3:
44 return 9;
45 case GL_FLOAT_MAT4:
46 return 16;
47 default:
48 UNREACHABLE();
49 }
50
51 return 0;
52}
53
54GLenum UniformComponentType(GLenum type)
55{
56 switch(type)
57 {
58 case GL_BOOL:
59 case GL_BOOL_VEC2:
60 case GL_BOOL_VEC3:
61 case GL_BOOL_VEC4:
62 return GL_BOOL;
63 case GL_FLOAT:
64 case GL_FLOAT_VEC2:
65 case GL_FLOAT_VEC3:
66 case GL_FLOAT_VEC4:
67 case GL_FLOAT_MAT2:
68 case GL_FLOAT_MAT3:
69 case GL_FLOAT_MAT4:
70 return GL_FLOAT;
71 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000072 case GL_SAMPLER_2D:
73 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000074 case GL_INT_VEC2:
75 case GL_INT_VEC3:
76 case GL_INT_VEC4:
77 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000078 case GL_UNSIGNED_INT:
79 case GL_UNSIGNED_INT_VEC2:
80 case GL_UNSIGNED_INT_VEC3:
81 case GL_UNSIGNED_INT_VEC4:
82 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000083 default:
84 UNREACHABLE();
85 }
86
87 return GL_NONE;
88}
89
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000090size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000091{
92 switch(type)
93 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000094 case GL_BOOL: return sizeof(GLint);
95 case GL_FLOAT: return sizeof(GLfloat);
96 case GL_INT: return sizeof(GLint);
97 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000098 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000099 }
100
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000101 return 0;
102}
103
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000104size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000105{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000106 // Expanded to 4-element vectors
107 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000108}
109
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000110size_t UniformExternalSize(GLenum type)
111{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000112 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000113}
114
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000115GLenum UniformBoolVectorType(GLenum type)
116{
117 switch (type)
118 {
119 case GL_FLOAT:
120 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000121 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000122 return GL_BOOL;
123 case GL_FLOAT_VEC2:
124 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000125 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000126 return GL_BOOL_VEC2;
127 case GL_FLOAT_VEC3:
128 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000129 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000130 return GL_BOOL_VEC3;
131 case GL_FLOAT_VEC4:
132 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000133 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000134 return GL_BOOL_VEC4;
135
136 default:
137 UNREACHABLE();
138 return GL_NONE;
139 }
140}
141
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000142int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000143{
144 switch (type)
145 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000146 case GL_NONE:
147 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000148 case GL_BOOL:
149 case GL_FLOAT:
150 case GL_INT:
151 case GL_BOOL_VEC2:
152 case GL_FLOAT_VEC2:
153 case GL_INT_VEC2:
154 case GL_INT_VEC3:
155 case GL_FLOAT_VEC3:
156 case GL_BOOL_VEC3:
157 case GL_BOOL_VEC4:
158 case GL_FLOAT_VEC4:
159 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000160 case GL_SAMPLER_2D:
161 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000162 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000163 case GL_FLOAT_MAT2:
164 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000165 case GL_FLOAT_MAT3:
166 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000167 case GL_FLOAT_MAT4:
168 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000169 default:
170 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000171 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000172
173 return 0;
174}
175
176int VariableColumnCount(GLenum type)
177{
178 switch (type)
179 {
180 case GL_NONE:
181 return 0;
182 case GL_BOOL:
183 case GL_FLOAT:
184 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000185 case GL_SAMPLER_2D:
186 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000187 return 1;
188 case GL_BOOL_VEC2:
189 case GL_FLOAT_VEC2:
190 case GL_INT_VEC2:
191 case GL_FLOAT_MAT2:
192 return 2;
193 case GL_INT_VEC3:
194 case GL_FLOAT_VEC3:
195 case GL_BOOL_VEC3:
196 case GL_FLOAT_MAT3:
197 return 3;
198 case GL_BOOL_VEC4:
199 case GL_FLOAT_VEC4:
200 case GL_INT_VEC4:
201 case GL_FLOAT_MAT4:
202 return 4;
203 default:
204 UNREACHABLE();
205 }
206
207 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000208}
209
210int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
211{
212 ASSERT(allocationSize <= bitsSize);
213
214 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
215
216 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
217 {
218 if ((*bits & mask) == 0)
219 {
220 *bits |= mask;
221 return i;
222 }
223
224 mask <<= 1;
225 }
226
227 return -1;
228}
229
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000230GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000231{
232 ASSERT(alignment > 0 && isPow2(alignment));
233
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000234 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000235 return (rawPitch + alignment - 1) & ~(alignment - 1);
236}
237
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000238GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000239{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000240 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000241}
242
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000243GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000244{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000245 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000246 {
247 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
248 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000249 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000250 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
251 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000252 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000253 default:
254 return 0;
255 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000256}
257
258bool IsCompressed(GLenum format)
259{
260 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000261 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
262 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
263 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000264 {
265 return true;
266 }
267 else
268 {
269 return false;
270 }
271}
272
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000273bool IsDepthTexture(GLenum format)
274{
275 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000276 format == GL_DEPTH_STENCIL_OES ||
277 format == GL_DEPTH_COMPONENT16 ||
278 format == GL_DEPTH_COMPONENT32_OES ||
279 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000280 {
281 return true;
282 }
283
284 return false;
285}
286
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000287bool IsStencilTexture(GLenum format)
288{
289 if (format == GL_DEPTH_STENCIL_OES ||
290 format == GL_DEPTH24_STENCIL8_OES)
291 {
292 return true;
293 }
294
295 return false;
296}
297
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000298void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
299{
300 int upsampleCount = 0;
301
302 if (isCompressed)
303 {
304 // Don't expand the size of full textures that are at least 4x4
305 // already.
306 if (isImage || *requestWidth < 4 || *requestHeight < 4)
307 {
308 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
309 {
310 *requestWidth <<= 1;
311 *requestHeight <<= 1;
312 upsampleCount++;
313 }
314 }
315 }
316 *levelOffset = upsampleCount;
317}
318
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000319// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000320int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000321{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000322 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000323 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000324 case GL_ALPHA8_EXT: return sizeof(unsigned char);
325 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
326 case GL_ALPHA32F_EXT: return sizeof(float);
327 case GL_LUMINANCE32F_EXT: return sizeof(float);
328 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
329 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
330 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
331 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
332 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
333 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
334 case GL_RGB565: return sizeof(unsigned short);
335 case GL_RGB32F_EXT: return sizeof(float) * 3;
336 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
337 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
338 case GL_RGBA4: return sizeof(unsigned short);
339 case GL_RGB5_A1: return sizeof(unsigned short);
340 case GL_RGBA32F_EXT: return sizeof(float) * 4;
341 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
342 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000343 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
344 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000345 default: UNREACHABLE();
346 }
347
348 return 0;
349}
350
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000351bool IsCubemapTextureTarget(GLenum target)
352{
353 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
354}
355
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000356bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000357{
358 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
359}
360
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000361GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
362{
363 switch (format)
364 {
365 case GL_ALPHA:
366 switch (type)
367 {
368 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
369 case GL_FLOAT: return GL_ALPHA32F_EXT;
370 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
371 default: UNIMPLEMENTED();
372 }
373 break;
374 case GL_LUMINANCE:
375 switch (type)
376 {
377 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
378 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
379 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
380 default: UNIMPLEMENTED();
381 }
382 break;
383 case GL_LUMINANCE_ALPHA:
384 switch (type)
385 {
386 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
387 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
388 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
389 default: UNIMPLEMENTED();
390 }
391 break;
392 case GL_RGB:
393 switch (type)
394 {
395 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
396 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
397 case GL_FLOAT: return GL_RGB32F_EXT;
398 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
399 default: UNIMPLEMENTED();
400 }
401 break;
402 case GL_RGBA:
403 switch (type)
404 {
405 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
406 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
407 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
408 case GL_FLOAT: return GL_RGBA32F_EXT;
409 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
410 break;
411 default: UNIMPLEMENTED();
412 }
413 break;
414 case GL_BGRA_EXT:
415 switch (type)
416 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000417 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000418 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
419 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000420 default: UNIMPLEMENTED();
421 }
422 break;
423 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
424 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
425 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
426 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
427 return format;
428 case GL_DEPTH_COMPONENT:
429 switch (type)
430 {
431 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
432 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
433 default: UNIMPLEMENTED();
434 }
435 break;
436 case GL_DEPTH_STENCIL_OES:
437 switch (type)
438 {
439 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
440 default: UNIMPLEMENTED();
441 }
442 break;
443 default:
444 UNIMPLEMENTED();
445 }
446
447 return GL_NONE;
448}
449
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000450GLenum ExtractFormat(GLenum internalformat)
451{
452 switch (internalformat)
453 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000454 case GL_RGB565: return GL_RGB;
455 case GL_RGBA4: return GL_RGBA;
456 case GL_RGB5_A1: return GL_RGBA;
457 case GL_RGB8_OES: return GL_RGB;
458 case GL_RGBA8_OES: return GL_RGBA;
459 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
460 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
461 case GL_ALPHA8_EXT: return GL_ALPHA;
462 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
463 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
464 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
465 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000466 case GL_RGBA32F_EXT: return GL_RGBA;
467 case GL_RGB32F_EXT: return GL_RGB;
468 case GL_ALPHA32F_EXT: return GL_ALPHA;
469 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
470 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
471 case GL_RGBA16F_EXT: return GL_RGBA;
472 case GL_RGB16F_EXT: return GL_RGB;
473 case GL_ALPHA16F_EXT: return GL_ALPHA;
474 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
475 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
476 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000477 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
478 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
479 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000480 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000481 }
482}
483
484GLenum ExtractType(GLenum internalformat)
485{
486 switch (internalformat)
487 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000488 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
489 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
490 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
491 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
492 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
493 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
494 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
495 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
496 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
497 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
498 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
499 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000500 case GL_RGBA32F_EXT: return GL_FLOAT;
501 case GL_RGB32F_EXT: return GL_FLOAT;
502 case GL_ALPHA32F_EXT: return GL_FLOAT;
503 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
504 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
505 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
506 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
507 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
508 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
509 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
510 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000511 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
512 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
513 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000514 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000515 }
516}
517
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000518bool IsColorRenderable(GLenum internalformat)
519{
520 switch (internalformat)
521 {
522 case GL_RGBA4:
523 case GL_RGB5_A1:
524 case GL_RGB565:
525 case GL_RGB8_OES:
526 case GL_RGBA8_OES:
527 return true;
528 case GL_DEPTH_COMPONENT16:
529 case GL_STENCIL_INDEX8:
530 case GL_DEPTH24_STENCIL8_OES:
531 return false;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000532 case GL_BGRA8_EXT:
533 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000534 default:
535 UNIMPLEMENTED();
536 }
537
538 return false;
539}
540
541bool IsDepthRenderable(GLenum internalformat)
542{
543 switch (internalformat)
544 {
545 case GL_DEPTH_COMPONENT16:
546 case GL_DEPTH24_STENCIL8_OES:
547 return true;
548 case GL_STENCIL_INDEX8:
549 case GL_RGBA4:
550 case GL_RGB5_A1:
551 case GL_RGB565:
552 case GL_RGB8_OES:
553 case GL_RGBA8_OES:
554 return false;
555 default:
556 UNIMPLEMENTED();
557 }
558
559 return false;
560}
561
562bool IsStencilRenderable(GLenum internalformat)
563{
564 switch (internalformat)
565 {
566 case GL_STENCIL_INDEX8:
567 case GL_DEPTH24_STENCIL8_OES:
568 return true;
569 case GL_RGBA4:
570 case GL_RGB5_A1:
571 case GL_RGB565:
572 case GL_RGB8_OES:
573 case GL_RGBA8_OES:
574 case GL_DEPTH_COMPONENT16:
575 return false;
576 default:
577 UNIMPLEMENTED();
578 }
579
580 return false;
581}
582
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000583bool IsFloat32Format(GLint internalformat)
584{
585 switch (internalformat)
586 {
587 case GL_RGBA32F_EXT:
588 case GL_RGB32F_EXT:
589 case GL_ALPHA32F_EXT:
590 case GL_LUMINANCE32F_EXT:
591 case GL_LUMINANCE_ALPHA32F_EXT:
592 return true;
593 default:
594 return false;
595 }
596}
597
598bool IsFloat16Format(GLint internalformat)
599{
600 switch (internalformat)
601 {
602 case GL_RGBA16F_EXT:
603 case GL_RGB16F_EXT:
604 case GL_ALPHA16F_EXT:
605 case GL_LUMINANCE16F_EXT:
606 case GL_LUMINANCE_ALPHA16F_EXT:
607 return true;
608 default:
609 return false;
610 }
611}
612
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000613unsigned int GetAlphaSize(GLenum colorFormat)
614{
615 switch (colorFormat)
616 {
617 case GL_RGBA16F_EXT:
618 return 16;
619 case GL_RGBA32F_EXT:
620 return 32;
621 case GL_RGBA4:
622 return 4;
623 case GL_RGBA8_OES:
624 case GL_BGRA8_EXT:
625 return 8;
626 case GL_RGB5_A1:
627 return 1;
628 case GL_RGB8_OES:
629 case GL_RGB565:
630 case GL_RGB32F_EXT:
631 case GL_RGB16F_EXT:
632 return 0;
633 default:
634 return 0;
635 }
636}
637
638unsigned int GetRedSize(GLenum colorFormat)
639{
640 switch (colorFormat)
641 {
642 case GL_RGBA16F_EXT:
643 case GL_RGB16F_EXT:
644 return 16;
645 case GL_RGBA32F_EXT:
646 case GL_RGB32F_EXT:
647 return 32;
648 case GL_RGBA4:
649 return 4;
650 case GL_RGBA8_OES:
651 case GL_BGRA8_EXT:
652 case GL_RGB8_OES:
653 return 8;
654 case GL_RGB5_A1:
655 case GL_RGB565:
656 return 5;
657 default:
658 return 0;
659 }
660}
661
662unsigned int GetGreenSize(GLenum colorFormat)
663{
664 switch (colorFormat)
665 {
666 case GL_RGBA16F_EXT:
667 case GL_RGB16F_EXT:
668 return 16;
669 case GL_RGBA32F_EXT:
670 case GL_RGB32F_EXT:
671 return 32;
672 case GL_RGBA4:
673 return 4;
674 case GL_RGBA8_OES:
675 case GL_BGRA8_EXT:
676 case GL_RGB8_OES:
677 return 8;
678 case GL_RGB5_A1:
679 return 5;
680 case GL_RGB565:
681 return 6;
682 default:
683 return 0;
684 }
685}
686
687unsigned int GetBlueSize(GLenum colorFormat)
688{
689 switch (colorFormat)
690 {
691 case GL_RGBA16F_EXT:
692 case GL_RGB16F_EXT:
693 return 16;
694 case GL_RGBA32F_EXT:
695 case GL_RGB32F_EXT:
696 return 32;
697 case GL_RGBA4:
698 return 4;
699 case GL_RGBA8_OES:
700 case GL_BGRA8_EXT:
701 case GL_RGB8_OES:
702 return 8;
703 case GL_RGB5_A1:
704 case GL_RGB565:
705 return 5;
706 default:
707 return 0;
708 }
709}
710
711unsigned int GetDepthSize(GLenum depthFormat)
712{
713 switch (depthFormat)
714 {
715 case GL_DEPTH_COMPONENT16: return 16;
716 case GL_DEPTH_COMPONENT32_OES: return 32;
717 case GL_DEPTH24_STENCIL8_OES: return 24;
718 default: return 0;
719 }
720}
721
722unsigned int GetStencilSize(GLenum stencilFormat)
723{
724 switch (stencilFormat)
725 {
726 case GL_DEPTH24_STENCIL8_OES: return 8;
727 default: return 0;
728 }
729}
730
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000731bool IsTriangleMode(GLenum drawMode)
732{
733 switch (drawMode)
734 {
735 case GL_TRIANGLES:
736 case GL_TRIANGLE_FAN:
737 case GL_TRIANGLE_STRIP:
738 return true;
739 case GL_POINTS:
740 case GL_LINES:
741 case GL_LINE_LOOP:
742 case GL_LINE_STRIP:
743 return false;
744 default: UNREACHABLE();
745 }
746
747 return false;
748}
749
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000750}
751
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000752std::string getTempPath()
753{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000754 char path[MAX_PATH];
755 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
756 if (pathLen == 0)
757 {
758 UNREACHABLE();
759 return std::string();
760 }
761
762 UINT unique = GetTempFileNameA(path, "sh", 0, path);
763 if (unique == 0)
764 {
765 UNREACHABLE();
766 return std::string();
767 }
768
769 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000770}
771
772void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000773{
774 FILE* file = fopen(path, "w");
775 if (!file)
776 {
777 UNREACHABLE();
778 return;
779 }
780
781 fwrite(content, sizeof(char), size, file);
782 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000783}