blob: 9809b9d8e8238188a9b674612487ae1353e2be76 [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
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000105int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000106{
107 switch (type)
108 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000109 case GL_NONE:
110 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000111 case GL_BOOL:
112 case GL_FLOAT:
113 case GL_INT:
114 case GL_BOOL_VEC2:
115 case GL_FLOAT_VEC2:
116 case GL_INT_VEC2:
117 case GL_INT_VEC3:
118 case GL_FLOAT_VEC3:
119 case GL_BOOL_VEC3:
120 case GL_BOOL_VEC4:
121 case GL_FLOAT_VEC4:
122 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000123 case GL_SAMPLER_2D:
124 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000125 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000126 case GL_FLOAT_MAT2:
127 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000128 case GL_FLOAT_MAT3:
129 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000130 case GL_FLOAT_MAT4:
131 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000132 default:
133 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000134 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000135
136 return 0;
137}
138
139int VariableColumnCount(GLenum type)
140{
141 switch (type)
142 {
143 case GL_NONE:
144 return 0;
145 case GL_BOOL:
146 case GL_FLOAT:
147 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000148 case GL_SAMPLER_2D:
149 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000150 return 1;
151 case GL_BOOL_VEC2:
152 case GL_FLOAT_VEC2:
153 case GL_INT_VEC2:
154 case GL_FLOAT_MAT2:
155 return 2;
156 case GL_INT_VEC3:
157 case GL_FLOAT_VEC3:
158 case GL_BOOL_VEC3:
159 case GL_FLOAT_MAT3:
160 return 3;
161 case GL_BOOL_VEC4:
162 case GL_FLOAT_VEC4:
163 case GL_INT_VEC4:
164 case GL_FLOAT_MAT4:
165 return 4;
166 default:
167 UNREACHABLE();
168 }
169
170 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000171}
172
173int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
174{
175 ASSERT(allocationSize <= bitsSize);
176
177 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
178
179 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
180 {
181 if ((*bits & mask) == 0)
182 {
183 *bits |= mask;
184 return i;
185 }
186
187 mask <<= 1;
188 }
189
190 return -1;
191}
192
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000193GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000194{
195 ASSERT(alignment > 0 && isPow2(alignment));
196
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000197 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000198 return (rawPitch + alignment - 1) & ~(alignment - 1);
199}
200
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000201GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000202{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000203 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000204}
205
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000206GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000207{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000208 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000209 {
210 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
211 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000212 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000213 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
214 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000215 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000216 default:
217 return 0;
218 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000219}
220
221bool IsCompressed(GLenum format)
222{
223 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000224 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
225 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
226 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000227 {
228 return true;
229 }
230 else
231 {
232 return false;
233 }
234}
235
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000236bool IsDepthTexture(GLenum format)
237{
238 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000239 format == GL_DEPTH_STENCIL_OES ||
240 format == GL_DEPTH_COMPONENT16 ||
241 format == GL_DEPTH_COMPONENT32_OES ||
242 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000243 {
244 return true;
245 }
246
247 return false;
248}
249
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000250bool IsStencilTexture(GLenum format)
251{
252 if (format == GL_DEPTH_STENCIL_OES ||
253 format == GL_DEPTH24_STENCIL8_OES)
254 {
255 return true;
256 }
257
258 return false;
259}
260
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000261void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
262{
263 int upsampleCount = 0;
264
265 if (isCompressed)
266 {
267 // Don't expand the size of full textures that are at least 4x4
268 // already.
269 if (isImage || *requestWidth < 4 || *requestHeight < 4)
270 {
271 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
272 {
273 *requestWidth <<= 1;
274 *requestHeight <<= 1;
275 upsampleCount++;
276 }
277 }
278 }
279 *levelOffset = upsampleCount;
280}
281
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000282// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000283int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000284{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000285 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000286 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000287 case GL_ALPHA8_EXT: return sizeof(unsigned char);
288 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
289 case GL_ALPHA32F_EXT: return sizeof(float);
290 case GL_LUMINANCE32F_EXT: return sizeof(float);
291 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
292 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
293 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
294 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
295 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
296 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
297 case GL_RGB565: return sizeof(unsigned short);
298 case GL_RGB32F_EXT: return sizeof(float) * 3;
299 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
300 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
301 case GL_RGBA4: return sizeof(unsigned short);
302 case GL_RGB5_A1: return sizeof(unsigned short);
303 case GL_RGBA32F_EXT: return sizeof(float) * 4;
304 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
305 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000306 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
307 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000308 default: UNREACHABLE();
309 }
310
311 return 0;
312}
313
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000314bool IsCubemapTextureTarget(GLenum target)
315{
316 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
317}
318
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000319bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000320{
321 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
322}
323
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000324GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
325{
326 switch (format)
327 {
328 case GL_ALPHA:
329 switch (type)
330 {
331 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
332 case GL_FLOAT: return GL_ALPHA32F_EXT;
333 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
334 default: UNIMPLEMENTED();
335 }
336 break;
337 case GL_LUMINANCE:
338 switch (type)
339 {
340 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
341 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
342 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
343 default: UNIMPLEMENTED();
344 }
345 break;
346 case GL_LUMINANCE_ALPHA:
347 switch (type)
348 {
349 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
350 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
351 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
352 default: UNIMPLEMENTED();
353 }
354 break;
355 case GL_RGB:
356 switch (type)
357 {
358 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
359 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
360 case GL_FLOAT: return GL_RGB32F_EXT;
361 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
362 default: UNIMPLEMENTED();
363 }
364 break;
365 case GL_RGBA:
366 switch (type)
367 {
368 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
369 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
370 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
371 case GL_FLOAT: return GL_RGBA32F_EXT;
372 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
373 break;
374 default: UNIMPLEMENTED();
375 }
376 break;
377 case GL_BGRA_EXT:
378 switch (type)
379 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000380 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000381 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
382 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000383 default: UNIMPLEMENTED();
384 }
385 break;
386 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
387 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
388 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
389 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
390 return format;
391 case GL_DEPTH_COMPONENT:
392 switch (type)
393 {
394 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
395 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
396 default: UNIMPLEMENTED();
397 }
398 break;
399 case GL_DEPTH_STENCIL_OES:
400 switch (type)
401 {
402 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
403 default: UNIMPLEMENTED();
404 }
405 break;
406 default:
407 UNIMPLEMENTED();
408 }
409
410 return GL_NONE;
411}
412
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000413GLenum ExtractFormat(GLenum internalformat)
414{
415 switch (internalformat)
416 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000417 case GL_RGB565: return GL_RGB;
418 case GL_RGBA4: return GL_RGBA;
419 case GL_RGB5_A1: return GL_RGBA;
420 case GL_RGB8_OES: return GL_RGB;
421 case GL_RGBA8_OES: return GL_RGBA;
422 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
423 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
424 case GL_ALPHA8_EXT: return GL_ALPHA;
425 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
426 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
427 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
428 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000429 case GL_RGBA32F_EXT: return GL_RGBA;
430 case GL_RGB32F_EXT: return GL_RGB;
431 case GL_ALPHA32F_EXT: return GL_ALPHA;
432 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
433 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
434 case GL_RGBA16F_EXT: return GL_RGBA;
435 case GL_RGB16F_EXT: return GL_RGB;
436 case GL_ALPHA16F_EXT: return GL_ALPHA;
437 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
438 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
439 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000440 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
441 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
442 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000443 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000444 }
445}
446
447GLenum ExtractType(GLenum internalformat)
448{
449 switch (internalformat)
450 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000451 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
452 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
453 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
454 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
455 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
456 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
457 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
458 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
459 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
460 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
461 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
462 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000463 case GL_RGBA32F_EXT: return GL_FLOAT;
464 case GL_RGB32F_EXT: return GL_FLOAT;
465 case GL_ALPHA32F_EXT: return GL_FLOAT;
466 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
467 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
468 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
469 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
470 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
471 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
472 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
473 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000474 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
475 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
476 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000477 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000478 }
479}
480
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000481bool IsColorRenderable(GLenum internalformat)
482{
483 switch (internalformat)
484 {
485 case GL_RGBA4:
486 case GL_RGB5_A1:
487 case GL_RGB565:
488 case GL_RGB8_OES:
489 case GL_RGBA8_OES:
490 return true;
491 case GL_DEPTH_COMPONENT16:
492 case GL_STENCIL_INDEX8:
493 case GL_DEPTH24_STENCIL8_OES:
494 return false;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000495 case GL_BGRA8_EXT:
496 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000497 default:
498 UNIMPLEMENTED();
499 }
500
501 return false;
502}
503
504bool IsDepthRenderable(GLenum internalformat)
505{
506 switch (internalformat)
507 {
508 case GL_DEPTH_COMPONENT16:
509 case GL_DEPTH24_STENCIL8_OES:
510 return true;
511 case GL_STENCIL_INDEX8:
512 case GL_RGBA4:
513 case GL_RGB5_A1:
514 case GL_RGB565:
515 case GL_RGB8_OES:
516 case GL_RGBA8_OES:
517 return false;
518 default:
519 UNIMPLEMENTED();
520 }
521
522 return false;
523}
524
525bool IsStencilRenderable(GLenum internalformat)
526{
527 switch (internalformat)
528 {
529 case GL_STENCIL_INDEX8:
530 case GL_DEPTH24_STENCIL8_OES:
531 return true;
532 case GL_RGBA4:
533 case GL_RGB5_A1:
534 case GL_RGB565:
535 case GL_RGB8_OES:
536 case GL_RGBA8_OES:
537 case GL_DEPTH_COMPONENT16:
538 return false;
539 default:
540 UNIMPLEMENTED();
541 }
542
543 return false;
544}
545
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000546bool IsFloat32Format(GLint internalformat)
547{
548 switch (internalformat)
549 {
550 case GL_RGBA32F_EXT:
551 case GL_RGB32F_EXT:
552 case GL_ALPHA32F_EXT:
553 case GL_LUMINANCE32F_EXT:
554 case GL_LUMINANCE_ALPHA32F_EXT:
555 return true;
556 default:
557 return false;
558 }
559}
560
561bool IsFloat16Format(GLint internalformat)
562{
563 switch (internalformat)
564 {
565 case GL_RGBA16F_EXT:
566 case GL_RGB16F_EXT:
567 case GL_ALPHA16F_EXT:
568 case GL_LUMINANCE16F_EXT:
569 case GL_LUMINANCE_ALPHA16F_EXT:
570 return true;
571 default:
572 return false;
573 }
574}
575
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000576unsigned int GetAlphaSize(GLenum colorFormat)
577{
578 switch (colorFormat)
579 {
580 case GL_RGBA16F_EXT:
581 return 16;
582 case GL_RGBA32F_EXT:
583 return 32;
584 case GL_RGBA4:
585 return 4;
586 case GL_RGBA8_OES:
587 case GL_BGRA8_EXT:
588 return 8;
589 case GL_RGB5_A1:
590 return 1;
591 case GL_RGB8_OES:
592 case GL_RGB565:
593 case GL_RGB32F_EXT:
594 case GL_RGB16F_EXT:
595 return 0;
596 default:
597 return 0;
598 }
599}
600
601unsigned int GetRedSize(GLenum colorFormat)
602{
603 switch (colorFormat)
604 {
605 case GL_RGBA16F_EXT:
606 case GL_RGB16F_EXT:
607 return 16;
608 case GL_RGBA32F_EXT:
609 case GL_RGB32F_EXT:
610 return 32;
611 case GL_RGBA4:
612 return 4;
613 case GL_RGBA8_OES:
614 case GL_BGRA8_EXT:
615 case GL_RGB8_OES:
616 return 8;
617 case GL_RGB5_A1:
618 case GL_RGB565:
619 return 5;
620 default:
621 return 0;
622 }
623}
624
625unsigned int GetGreenSize(GLenum colorFormat)
626{
627 switch (colorFormat)
628 {
629 case GL_RGBA16F_EXT:
630 case GL_RGB16F_EXT:
631 return 16;
632 case GL_RGBA32F_EXT:
633 case GL_RGB32F_EXT:
634 return 32;
635 case GL_RGBA4:
636 return 4;
637 case GL_RGBA8_OES:
638 case GL_BGRA8_EXT:
639 case GL_RGB8_OES:
640 return 8;
641 case GL_RGB5_A1:
642 return 5;
643 case GL_RGB565:
644 return 6;
645 default:
646 return 0;
647 }
648}
649
650unsigned int GetBlueSize(GLenum colorFormat)
651{
652 switch (colorFormat)
653 {
654 case GL_RGBA16F_EXT:
655 case GL_RGB16F_EXT:
656 return 16;
657 case GL_RGBA32F_EXT:
658 case GL_RGB32F_EXT:
659 return 32;
660 case GL_RGBA4:
661 return 4;
662 case GL_RGBA8_OES:
663 case GL_BGRA8_EXT:
664 case GL_RGB8_OES:
665 return 8;
666 case GL_RGB5_A1:
667 case GL_RGB565:
668 return 5;
669 default:
670 return 0;
671 }
672}
673
674unsigned int GetDepthSize(GLenum depthFormat)
675{
676 switch (depthFormat)
677 {
678 case GL_DEPTH_COMPONENT16: return 16;
679 case GL_DEPTH_COMPONENT32_OES: return 32;
680 case GL_DEPTH24_STENCIL8_OES: return 24;
681 default: return 0;
682 }
683}
684
685unsigned int GetStencilSize(GLenum stencilFormat)
686{
687 switch (stencilFormat)
688 {
689 case GL_DEPTH24_STENCIL8_OES: return 8;
690 default: return 0;
691 }
692}
693
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000694bool IsTriangleMode(GLenum drawMode)
695{
696 switch (drawMode)
697 {
698 case GL_TRIANGLES:
699 case GL_TRIANGLE_FAN:
700 case GL_TRIANGLE_STRIP:
701 return true;
702 case GL_POINTS:
703 case GL_LINES:
704 case GL_LINE_LOOP:
705 case GL_LINE_STRIP:
706 return false;
707 default: UNREACHABLE();
708 }
709
710 return false;
711}
712
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000713}
714
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000715std::string getTempPath()
716{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000717 char path[MAX_PATH];
718 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
719 if (pathLen == 0)
720 {
721 UNREACHABLE();
722 return std::string();
723 }
724
725 UINT unique = GetTempFileNameA(path, "sh", 0, path);
726 if (unique == 0)
727 {
728 UNREACHABLE();
729 return std::string();
730 }
731
732 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000733}
734
735void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000736{
737 FILE* file = fopen(path, "w");
738 if (!file)
739 {
740 UNREACHABLE();
741 return;
742 }
743
744 fwrite(content, sizeof(char), size, file);
745 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000746}