blob: aac1e81023d342303db92e309893541f42e175be [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;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000043 case GL_FLOAT_MAT2x3:
44 case GL_FLOAT_MAT3x2:
45 return 6;
46 case GL_FLOAT_MAT2x4:
47 case GL_FLOAT_MAT4x2:
48 return 8;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000049 case GL_FLOAT_MAT3:
50 return 9;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000051 case GL_FLOAT_MAT3x4:
52 case GL_FLOAT_MAT4x3:
53 return 12;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000054 case GL_FLOAT_MAT4:
55 return 16;
56 default:
57 UNREACHABLE();
58 }
59
60 return 0;
61}
62
63GLenum UniformComponentType(GLenum type)
64{
65 switch(type)
66 {
67 case GL_BOOL:
68 case GL_BOOL_VEC2:
69 case GL_BOOL_VEC3:
70 case GL_BOOL_VEC4:
71 return GL_BOOL;
72 case GL_FLOAT:
73 case GL_FLOAT_VEC2:
74 case GL_FLOAT_VEC3:
75 case GL_FLOAT_VEC4:
76 case GL_FLOAT_MAT2:
77 case GL_FLOAT_MAT3:
78 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000079 case GL_FLOAT_MAT2x3:
80 case GL_FLOAT_MAT3x2:
81 case GL_FLOAT_MAT2x4:
82 case GL_FLOAT_MAT4x2:
83 case GL_FLOAT_MAT3x4:
84 case GL_FLOAT_MAT4x3:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000085 return GL_FLOAT;
86 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000087 case GL_SAMPLER_2D:
88 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000089 case GL_INT_VEC2:
90 case GL_INT_VEC3:
91 case GL_INT_VEC4:
92 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000093 case GL_UNSIGNED_INT:
94 case GL_UNSIGNED_INT_VEC2:
95 case GL_UNSIGNED_INT_VEC3:
96 case GL_UNSIGNED_INT_VEC4:
97 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000098 default:
99 UNREACHABLE();
100 }
101
102 return GL_NONE;
103}
104
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000105size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000106{
107 switch(type)
108 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000109 case GL_BOOL: return sizeof(GLint);
110 case GL_FLOAT: return sizeof(GLfloat);
111 case GL_INT: return sizeof(GLint);
112 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000113 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000114 }
115
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000116 return 0;
117}
118
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000119size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000120{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000121 // Expanded to 4-element vectors
122 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000123}
124
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000125size_t UniformExternalSize(GLenum type)
126{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000127 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000128}
129
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000130GLenum UniformBoolVectorType(GLenum type)
131{
132 switch (type)
133 {
134 case GL_FLOAT:
135 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000136 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000137 return GL_BOOL;
138 case GL_FLOAT_VEC2:
139 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000140 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000141 return GL_BOOL_VEC2;
142 case GL_FLOAT_VEC3:
143 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000144 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000145 return GL_BOOL_VEC3;
146 case GL_FLOAT_VEC4:
147 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000148 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000149 return GL_BOOL_VEC4;
150
151 default:
152 UNREACHABLE();
153 return GL_NONE;
154 }
155}
156
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000157int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000158{
159 switch (type)
160 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000161 case GL_NONE:
162 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000163 case GL_BOOL:
164 case GL_FLOAT:
165 case GL_INT:
166 case GL_BOOL_VEC2:
167 case GL_FLOAT_VEC2:
168 case GL_INT_VEC2:
169 case GL_INT_VEC3:
170 case GL_FLOAT_VEC3:
171 case GL_BOOL_VEC3:
172 case GL_BOOL_VEC4:
173 case GL_FLOAT_VEC4:
174 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000175 case GL_SAMPLER_2D:
176 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000177 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000178 case GL_FLOAT_MAT2:
179 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000180 case GL_FLOAT_MAT3:
181 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000182 case GL_FLOAT_MAT4:
183 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000184 default:
185 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000186 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000187
188 return 0;
189}
190
191int VariableColumnCount(GLenum type)
192{
193 switch (type)
194 {
195 case GL_NONE:
196 return 0;
197 case GL_BOOL:
198 case GL_FLOAT:
199 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000200 case GL_SAMPLER_2D:
201 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000202 return 1;
203 case GL_BOOL_VEC2:
204 case GL_FLOAT_VEC2:
205 case GL_INT_VEC2:
206 case GL_FLOAT_MAT2:
207 return 2;
208 case GL_INT_VEC3:
209 case GL_FLOAT_VEC3:
210 case GL_BOOL_VEC3:
211 case GL_FLOAT_MAT3:
212 return 3;
213 case GL_BOOL_VEC4:
214 case GL_FLOAT_VEC4:
215 case GL_INT_VEC4:
216 case GL_FLOAT_MAT4:
217 return 4;
218 default:
219 UNREACHABLE();
220 }
221
222 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000223}
224
225int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
226{
227 ASSERT(allocationSize <= bitsSize);
228
229 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
230
231 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
232 {
233 if ((*bits & mask) == 0)
234 {
235 *bits |= mask;
236 return i;
237 }
238
239 mask <<= 1;
240 }
241
242 return -1;
243}
244
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000245GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000246{
247 ASSERT(alignment > 0 && isPow2(alignment));
248
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000249 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000250 return (rawPitch + alignment - 1) & ~(alignment - 1);
251}
252
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000253GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000254{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000255 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000256}
257
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000258GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000259{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000260 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000261 {
262 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
263 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000264 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000265 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
266 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000267 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000268 default:
269 return 0;
270 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000271}
272
273bool IsCompressed(GLenum format)
274{
275 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000276 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
277 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
278 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000279 {
280 return true;
281 }
282 else
283 {
284 return false;
285 }
286}
287
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000288bool IsDepthTexture(GLenum format)
289{
290 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000291 format == GL_DEPTH_STENCIL_OES ||
292 format == GL_DEPTH_COMPONENT16 ||
293 format == GL_DEPTH_COMPONENT32_OES ||
294 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000295 {
296 return true;
297 }
298
299 return false;
300}
301
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000302bool IsStencilTexture(GLenum format)
303{
304 if (format == GL_DEPTH_STENCIL_OES ||
305 format == GL_DEPTH24_STENCIL8_OES)
306 {
307 return true;
308 }
309
310 return false;
311}
312
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000313void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
314{
315 int upsampleCount = 0;
316
317 if (isCompressed)
318 {
319 // Don't expand the size of full textures that are at least 4x4
320 // already.
321 if (isImage || *requestWidth < 4 || *requestHeight < 4)
322 {
323 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
324 {
325 *requestWidth <<= 1;
326 *requestHeight <<= 1;
327 upsampleCount++;
328 }
329 }
330 }
331 *levelOffset = upsampleCount;
332}
333
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000334// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000335int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000336{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000337 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000338 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000339 case GL_ALPHA8_EXT: return sizeof(unsigned char);
340 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
341 case GL_ALPHA32F_EXT: return sizeof(float);
342 case GL_LUMINANCE32F_EXT: return sizeof(float);
343 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
344 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
345 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
346 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
347 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
348 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
349 case GL_RGB565: return sizeof(unsigned short);
350 case GL_RGB32F_EXT: return sizeof(float) * 3;
351 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
352 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
353 case GL_RGBA4: return sizeof(unsigned short);
354 case GL_RGB5_A1: return sizeof(unsigned short);
355 case GL_RGBA32F_EXT: return sizeof(float) * 4;
356 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
357 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000358 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
359 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000360 default: UNREACHABLE();
361 }
362
363 return 0;
364}
365
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000366bool IsCubemapTextureTarget(GLenum target)
367{
368 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
369}
370
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000371bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000372{
373 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
374}
375
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000376GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
377{
378 switch (format)
379 {
380 case GL_ALPHA:
381 switch (type)
382 {
383 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
384 case GL_FLOAT: return GL_ALPHA32F_EXT;
385 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
386 default: UNIMPLEMENTED();
387 }
388 break;
389 case GL_LUMINANCE:
390 switch (type)
391 {
392 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
393 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
394 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
395 default: UNIMPLEMENTED();
396 }
397 break;
398 case GL_LUMINANCE_ALPHA:
399 switch (type)
400 {
401 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
402 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
403 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
404 default: UNIMPLEMENTED();
405 }
406 break;
407 case GL_RGB:
408 switch (type)
409 {
410 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
411 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
412 case GL_FLOAT: return GL_RGB32F_EXT;
413 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
414 default: UNIMPLEMENTED();
415 }
416 break;
417 case GL_RGBA:
418 switch (type)
419 {
420 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
421 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
422 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
423 case GL_FLOAT: return GL_RGBA32F_EXT;
424 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
425 break;
426 default: UNIMPLEMENTED();
427 }
428 break;
429 case GL_BGRA_EXT:
430 switch (type)
431 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000432 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000433 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
434 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000435 default: UNIMPLEMENTED();
436 }
437 break;
438 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
439 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
440 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
441 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
442 return format;
443 case GL_DEPTH_COMPONENT:
444 switch (type)
445 {
446 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
447 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
448 default: UNIMPLEMENTED();
449 }
450 break;
451 case GL_DEPTH_STENCIL_OES:
452 switch (type)
453 {
454 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
455 default: UNIMPLEMENTED();
456 }
457 break;
458 default:
459 UNIMPLEMENTED();
460 }
461
462 return GL_NONE;
463}
464
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000465GLenum ExtractFormat(GLenum internalformat)
466{
467 switch (internalformat)
468 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000469 case GL_RGB565: return GL_RGB;
470 case GL_RGBA4: return GL_RGBA;
471 case GL_RGB5_A1: return GL_RGBA;
472 case GL_RGB8_OES: return GL_RGB;
473 case GL_RGBA8_OES: return GL_RGBA;
474 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
475 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
476 case GL_ALPHA8_EXT: return GL_ALPHA;
477 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
478 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
479 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
480 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000481 case GL_RGBA32F_EXT: return GL_RGBA;
482 case GL_RGB32F_EXT: return GL_RGB;
483 case GL_ALPHA32F_EXT: return GL_ALPHA;
484 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
485 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
486 case GL_RGBA16F_EXT: return GL_RGBA;
487 case GL_RGB16F_EXT: return GL_RGB;
488 case GL_ALPHA16F_EXT: return GL_ALPHA;
489 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
490 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
491 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000492 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
493 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
494 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000495 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000496 }
497}
498
499GLenum ExtractType(GLenum internalformat)
500{
501 switch (internalformat)
502 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000503 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
504 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
505 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
506 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
507 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
508 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
509 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
510 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
511 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
512 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
513 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
514 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000515 case GL_RGBA32F_EXT: return GL_FLOAT;
516 case GL_RGB32F_EXT: return GL_FLOAT;
517 case GL_ALPHA32F_EXT: return GL_FLOAT;
518 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
519 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
520 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
521 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
522 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
523 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
524 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
525 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000526 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
527 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
528 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000529 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000530 }
531}
532
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000533bool IsColorRenderable(GLenum internalformat)
534{
535 switch (internalformat)
536 {
537 case GL_RGBA4:
538 case GL_RGB5_A1:
539 case GL_RGB565:
540 case GL_RGB8_OES:
541 case GL_RGBA8_OES:
542 return true;
543 case GL_DEPTH_COMPONENT16:
544 case GL_STENCIL_INDEX8:
545 case GL_DEPTH24_STENCIL8_OES:
546 return false;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000547 case GL_BGRA8_EXT:
548 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000549 default:
550 UNIMPLEMENTED();
551 }
552
553 return false;
554}
555
556bool IsDepthRenderable(GLenum internalformat)
557{
558 switch (internalformat)
559 {
560 case GL_DEPTH_COMPONENT16:
561 case GL_DEPTH24_STENCIL8_OES:
562 return true;
563 case GL_STENCIL_INDEX8:
564 case GL_RGBA4:
565 case GL_RGB5_A1:
566 case GL_RGB565:
567 case GL_RGB8_OES:
568 case GL_RGBA8_OES:
569 return false;
570 default:
571 UNIMPLEMENTED();
572 }
573
574 return false;
575}
576
577bool IsStencilRenderable(GLenum internalformat)
578{
579 switch (internalformat)
580 {
581 case GL_STENCIL_INDEX8:
582 case GL_DEPTH24_STENCIL8_OES:
583 return true;
584 case GL_RGBA4:
585 case GL_RGB5_A1:
586 case GL_RGB565:
587 case GL_RGB8_OES:
588 case GL_RGBA8_OES:
589 case GL_DEPTH_COMPONENT16:
590 return false;
591 default:
592 UNIMPLEMENTED();
593 }
594
595 return false;
596}
597
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000598bool IsFloat32Format(GLint internalformat)
599{
600 switch (internalformat)
601 {
602 case GL_RGBA32F_EXT:
603 case GL_RGB32F_EXT:
604 case GL_ALPHA32F_EXT:
605 case GL_LUMINANCE32F_EXT:
606 case GL_LUMINANCE_ALPHA32F_EXT:
607 return true;
608 default:
609 return false;
610 }
611}
612
613bool IsFloat16Format(GLint internalformat)
614{
615 switch (internalformat)
616 {
617 case GL_RGBA16F_EXT:
618 case GL_RGB16F_EXT:
619 case GL_ALPHA16F_EXT:
620 case GL_LUMINANCE16F_EXT:
621 case GL_LUMINANCE_ALPHA16F_EXT:
622 return true;
623 default:
624 return false;
625 }
626}
627
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000628unsigned int GetAlphaSize(GLenum colorFormat)
629{
630 switch (colorFormat)
631 {
632 case GL_RGBA16F_EXT:
633 return 16;
634 case GL_RGBA32F_EXT:
635 return 32;
636 case GL_RGBA4:
637 return 4;
638 case GL_RGBA8_OES:
639 case GL_BGRA8_EXT:
640 return 8;
641 case GL_RGB5_A1:
642 return 1;
643 case GL_RGB8_OES:
644 case GL_RGB565:
645 case GL_RGB32F_EXT:
646 case GL_RGB16F_EXT:
647 return 0;
648 default:
649 return 0;
650 }
651}
652
653unsigned int GetRedSize(GLenum colorFormat)
654{
655 switch (colorFormat)
656 {
657 case GL_RGBA16F_EXT:
658 case GL_RGB16F_EXT:
659 return 16;
660 case GL_RGBA32F_EXT:
661 case GL_RGB32F_EXT:
662 return 32;
663 case GL_RGBA4:
664 return 4;
665 case GL_RGBA8_OES:
666 case GL_BGRA8_EXT:
667 case GL_RGB8_OES:
668 return 8;
669 case GL_RGB5_A1:
670 case GL_RGB565:
671 return 5;
672 default:
673 return 0;
674 }
675}
676
677unsigned int GetGreenSize(GLenum colorFormat)
678{
679 switch (colorFormat)
680 {
681 case GL_RGBA16F_EXT:
682 case GL_RGB16F_EXT:
683 return 16;
684 case GL_RGBA32F_EXT:
685 case GL_RGB32F_EXT:
686 return 32;
687 case GL_RGBA4:
688 return 4;
689 case GL_RGBA8_OES:
690 case GL_BGRA8_EXT:
691 case GL_RGB8_OES:
692 return 8;
693 case GL_RGB5_A1:
694 return 5;
695 case GL_RGB565:
696 return 6;
697 default:
698 return 0;
699 }
700}
701
702unsigned int GetBlueSize(GLenum colorFormat)
703{
704 switch (colorFormat)
705 {
706 case GL_RGBA16F_EXT:
707 case GL_RGB16F_EXT:
708 return 16;
709 case GL_RGBA32F_EXT:
710 case GL_RGB32F_EXT:
711 return 32;
712 case GL_RGBA4:
713 return 4;
714 case GL_RGBA8_OES:
715 case GL_BGRA8_EXT:
716 case GL_RGB8_OES:
717 return 8;
718 case GL_RGB5_A1:
719 case GL_RGB565:
720 return 5;
721 default:
722 return 0;
723 }
724}
725
726unsigned int GetDepthSize(GLenum depthFormat)
727{
728 switch (depthFormat)
729 {
730 case GL_DEPTH_COMPONENT16: return 16;
731 case GL_DEPTH_COMPONENT32_OES: return 32;
732 case GL_DEPTH24_STENCIL8_OES: return 24;
733 default: return 0;
734 }
735}
736
737unsigned int GetStencilSize(GLenum stencilFormat)
738{
739 switch (stencilFormat)
740 {
741 case GL_DEPTH24_STENCIL8_OES: return 8;
742 default: return 0;
743 }
744}
745
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000746bool IsTriangleMode(GLenum drawMode)
747{
748 switch (drawMode)
749 {
750 case GL_TRIANGLES:
751 case GL_TRIANGLE_FAN:
752 case GL_TRIANGLE_STRIP:
753 return true;
754 case GL_POINTS:
755 case GL_LINES:
756 case GL_LINE_LOOP:
757 case GL_LINE_STRIP:
758 return false;
759 default: UNREACHABLE();
760 }
761
762 return false;
763}
764
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000765}
766
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000767std::string getTempPath()
768{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000769 char path[MAX_PATH];
770 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
771 if (pathLen == 0)
772 {
773 UNREACHABLE();
774 return std::string();
775 }
776
777 UINT unique = GetTempFileNameA(path, "sh", 0, path);
778 if (unique == 0)
779 {
780 UNREACHABLE();
781 return std::string();
782 }
783
784 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000785}
786
787void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000788{
789 FILE* file = fopen(path, "w");
790 if (!file)
791 {
792 UNREACHABLE();
793 return;
794 }
795
796 fwrite(content, sizeof(char), size, file);
797 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000798}