blob: 2a3ea73a2514e60834ce079da06b9c949acf8f32 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com4f677302012-06-19 15:29:51 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// utilities.cpp: Conversion functions and other utility routines.
8
daniel@transgaming.combbf56f72010-04-20 18:52:13 +00009#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000011#include <limits>
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000012#include <stdio.h>
13#include <windows.h>
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000014
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000015#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016
17#include "libGLESv2/mathutil.h"
18#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000020namespace gl
21{
22
daniel@transgaming.comedc31502011-11-12 03:14:56 +000023// This is how much data the application expects for a uniform
24int UniformExternalComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000025{
26 switch (type)
27 {
28 case GL_BOOL:
29 case GL_FLOAT:
30 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000031 case GL_SAMPLER_2D:
32 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000033 return 1;
34 case GL_BOOL_VEC2:
35 case GL_FLOAT_VEC2:
36 case GL_INT_VEC2:
37 return 2;
38 case GL_INT_VEC3:
39 case GL_FLOAT_VEC3:
40 case GL_BOOL_VEC3:
41 return 3;
42 case GL_BOOL_VEC4:
43 case GL_FLOAT_VEC4:
44 case GL_INT_VEC4:
45 case GL_FLOAT_MAT2:
46 return 4;
47 case GL_FLOAT_MAT3:
48 return 9;
49 case GL_FLOAT_MAT4:
50 return 16;
51 default:
52 UNREACHABLE();
53 }
54
55 return 0;
56}
57
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000058// This is how much data we actually store for a uniform
59int UniformInternalComponentCount(GLenum type)
60{
61 switch (type)
62 {
63 case GL_BOOL:
64 case GL_INT:
65 case GL_SAMPLER_2D:
66 case GL_SAMPLER_CUBE:
67 return 1;
68 case GL_BOOL_VEC2:
69 case GL_INT_VEC2:
70 return 2;
71 case GL_INT_VEC3:
72 case GL_BOOL_VEC3:
73 return 3;
74 case GL_FLOAT:
75 case GL_FLOAT_VEC2:
76 case GL_FLOAT_VEC3:
77 case GL_BOOL_VEC4:
78 case GL_FLOAT_VEC4:
79 case GL_INT_VEC4:
80 return 4;
81 case GL_FLOAT_MAT2:
82 return 8;
83 case GL_FLOAT_MAT3:
84 return 12;
85 case GL_FLOAT_MAT4:
86 return 16;
87 default:
88 UNREACHABLE();
89 }
90
91 return 0;
92}
93
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000094GLenum UniformComponentType(GLenum type)
95{
96 switch(type)
97 {
98 case GL_BOOL:
99 case GL_BOOL_VEC2:
100 case GL_BOOL_VEC3:
101 case GL_BOOL_VEC4:
102 return GL_BOOL;
103 case GL_FLOAT:
104 case GL_FLOAT_VEC2:
105 case GL_FLOAT_VEC3:
106 case GL_FLOAT_VEC4:
107 case GL_FLOAT_MAT2:
108 case GL_FLOAT_MAT3:
109 case GL_FLOAT_MAT4:
110 return GL_FLOAT;
111 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000112 case GL_SAMPLER_2D:
113 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000114 case GL_INT_VEC2:
115 case GL_INT_VEC3:
116 case GL_INT_VEC4:
117 return GL_INT;
118 default:
119 UNREACHABLE();
120 }
121
122 return GL_NONE;
123}
124
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000125size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000126{
127 switch(type)
128 {
daniel@transgaming.com4bf6fd02011-11-12 03:18:16 +0000129 case GL_BOOL: return sizeof(GLint);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000130 case GL_FLOAT: return sizeof(GLfloat);
131 case GL_INT: return sizeof(GLint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000132 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000133 }
134
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000135 return 0;
136}
137
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000138size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000139{
140 return UniformComponentSize(UniformComponentType(type)) * UniformInternalComponentCount(type);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000141}
142
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000143size_t UniformExternalSize(GLenum type)
144{
145 return UniformComponentSize(UniformComponentType(type)) * UniformExternalComponentCount(type);
146}
147
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000148int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000149{
150 switch (type)
151 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000152 case GL_NONE:
153 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000154 case GL_BOOL:
155 case GL_FLOAT:
156 case GL_INT:
157 case GL_BOOL_VEC2:
158 case GL_FLOAT_VEC2:
159 case GL_INT_VEC2:
160 case GL_INT_VEC3:
161 case GL_FLOAT_VEC3:
162 case GL_BOOL_VEC3:
163 case GL_BOOL_VEC4:
164 case GL_FLOAT_VEC4:
165 case GL_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000166 case GL_SAMPLER_2D:
167 case GL_SAMPLER_CUBE:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000168 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000169 case GL_FLOAT_MAT2:
170 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000171 case GL_FLOAT_MAT3:
172 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000173 case GL_FLOAT_MAT4:
174 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000175 default:
176 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000177 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000178
179 return 0;
180}
181
182int VariableColumnCount(GLenum type)
183{
184 switch (type)
185 {
186 case GL_NONE:
187 return 0;
188 case GL_BOOL:
189 case GL_FLOAT:
190 case GL_INT:
191 return 1;
192 case GL_BOOL_VEC2:
193 case GL_FLOAT_VEC2:
194 case GL_INT_VEC2:
195 case GL_FLOAT_MAT2:
196 return 2;
197 case GL_INT_VEC3:
198 case GL_FLOAT_VEC3:
199 case GL_BOOL_VEC3:
200 case GL_FLOAT_MAT3:
201 return 3;
202 case GL_BOOL_VEC4:
203 case GL_FLOAT_VEC4:
204 case GL_INT_VEC4:
205 case GL_FLOAT_MAT4:
206 return 4;
207 default:
208 UNREACHABLE();
209 }
210
211 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000212}
213
214int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
215{
216 ASSERT(allocationSize <= bitsSize);
217
218 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
219
220 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
221 {
222 if ((*bits & mask) == 0)
223 {
224 *bits |= mask;
225 return i;
226 }
227
228 mask <<= 1;
229 }
230
231 return -1;
232}
233
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000234GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000235{
236 ASSERT(alignment > 0 && isPow2(alignment));
237
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000238 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000239 return (rawPitch + alignment - 1) & ~(alignment - 1);
240}
241
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000242GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000243{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000244 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000245}
246
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000247GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000248{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000249 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000250 {
251 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
252 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000253 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000254 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
255 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000256 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000257 default:
258 return 0;
259 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000260}
261
262bool IsCompressed(GLenum format)
263{
264 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000265 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
266 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
267 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000268 {
269 return true;
270 }
271 else
272 {
273 return false;
274 }
275}
276
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000277bool IsDepthTexture(GLenum format)
278{
279 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000280 format == GL_DEPTH_STENCIL_OES ||
281 format == GL_DEPTH_COMPONENT16 ||
282 format == GL_DEPTH_COMPONENT32_OES ||
283 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000284 {
285 return true;
286 }
287
288 return false;
289}
290
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000291bool IsStencilTexture(GLenum format)
292{
293 if (format == GL_DEPTH_STENCIL_OES ||
294 format == GL_DEPTH24_STENCIL8_OES)
295 {
296 return true;
297 }
298
299 return false;
300}
301
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000302void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
303{
304 int upsampleCount = 0;
305
306 if (isCompressed)
307 {
308 // Don't expand the size of full textures that are at least 4x4
309 // already.
310 if (isImage || *requestWidth < 4 || *requestHeight < 4)
311 {
312 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
313 {
314 *requestWidth <<= 1;
315 *requestHeight <<= 1;
316 upsampleCount++;
317 }
318 }
319 }
320 *levelOffset = upsampleCount;
321}
322
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000323// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000324int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000325{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000326 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000327 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000328 case GL_ALPHA8_EXT: return sizeof(unsigned char);
329 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
330 case GL_ALPHA32F_EXT: return sizeof(float);
331 case GL_LUMINANCE32F_EXT: return sizeof(float);
332 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
333 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
334 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
335 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
336 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
337 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
338 case GL_RGB565: return sizeof(unsigned short);
339 case GL_RGB32F_EXT: return sizeof(float) * 3;
340 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
341 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
342 case GL_RGBA4: return sizeof(unsigned short);
343 case GL_RGB5_A1: return sizeof(unsigned short);
344 case GL_RGBA32F_EXT: return sizeof(float) * 4;
345 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
346 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000347 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
348 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000349 default: UNREACHABLE();
350 }
351
352 return 0;
353}
354
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000355bool IsCubemapTextureTarget(GLenum target)
356{
357 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
358}
359
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000360bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000361{
362 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
363}
364
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000365GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
366{
367 switch (format)
368 {
369 case GL_ALPHA:
370 switch (type)
371 {
372 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
373 case GL_FLOAT: return GL_ALPHA32F_EXT;
374 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
375 default: UNIMPLEMENTED();
376 }
377 break;
378 case GL_LUMINANCE:
379 switch (type)
380 {
381 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
382 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
383 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
384 default: UNIMPLEMENTED();
385 }
386 break;
387 case GL_LUMINANCE_ALPHA:
388 switch (type)
389 {
390 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
391 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
392 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
393 default: UNIMPLEMENTED();
394 }
395 break;
396 case GL_RGB:
397 switch (type)
398 {
399 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
400 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
401 case GL_FLOAT: return GL_RGB32F_EXT;
402 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
403 default: UNIMPLEMENTED();
404 }
405 break;
406 case GL_RGBA:
407 switch (type)
408 {
409 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
410 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
411 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
412 case GL_FLOAT: return GL_RGBA32F_EXT;
413 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
414 break;
415 default: UNIMPLEMENTED();
416 }
417 break;
418 case GL_BGRA_EXT:
419 switch (type)
420 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000421 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000422 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
423 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000424 default: UNIMPLEMENTED();
425 }
426 break;
427 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
428 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
429 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
430 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
431 return format;
432 case GL_DEPTH_COMPONENT:
433 switch (type)
434 {
435 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
436 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
437 default: UNIMPLEMENTED();
438 }
439 break;
440 case GL_DEPTH_STENCIL_OES:
441 switch (type)
442 {
443 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
444 default: UNIMPLEMENTED();
445 }
446 break;
447 default:
448 UNIMPLEMENTED();
449 }
450
451 return GL_NONE;
452}
453
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000454GLenum ExtractFormat(GLenum internalformat)
455{
456 switch (internalformat)
457 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000458 case GL_RGB565: return GL_RGB;
459 case GL_RGBA4: return GL_RGBA;
460 case GL_RGB5_A1: return GL_RGBA;
461 case GL_RGB8_OES: return GL_RGB;
462 case GL_RGBA8_OES: return GL_RGBA;
463 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
464 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
465 case GL_ALPHA8_EXT: return GL_ALPHA;
466 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
467 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
468 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
469 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000470 case GL_RGBA32F_EXT: return GL_RGBA;
471 case GL_RGB32F_EXT: return GL_RGB;
472 case GL_ALPHA32F_EXT: return GL_ALPHA;
473 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
474 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
475 case GL_RGBA16F_EXT: return GL_RGBA;
476 case GL_RGB16F_EXT: return GL_RGB;
477 case GL_ALPHA16F_EXT: return GL_ALPHA;
478 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
479 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
480 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000481 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
482 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
483 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000484 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000485 }
486}
487
488GLenum ExtractType(GLenum internalformat)
489{
490 switch (internalformat)
491 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000492 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
493 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
494 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
495 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
496 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
497 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
498 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
499 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
500 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
501 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
502 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
503 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000504 case GL_RGBA32F_EXT: return GL_FLOAT;
505 case GL_RGB32F_EXT: return GL_FLOAT;
506 case GL_ALPHA32F_EXT: return GL_FLOAT;
507 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
508 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
509 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
510 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
511 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
512 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
513 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
514 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000515 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
516 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
517 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000518 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000519 }
520}
521
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000522bool IsColorRenderable(GLenum internalformat)
523{
524 switch (internalformat)
525 {
526 case GL_RGBA4:
527 case GL_RGB5_A1:
528 case GL_RGB565:
529 case GL_RGB8_OES:
530 case GL_RGBA8_OES:
531 return true;
532 case GL_DEPTH_COMPONENT16:
533 case GL_STENCIL_INDEX8:
534 case GL_DEPTH24_STENCIL8_OES:
535 return false;
536 default:
537 UNIMPLEMENTED();
538 }
539
540 return false;
541}
542
543bool IsDepthRenderable(GLenum internalformat)
544{
545 switch (internalformat)
546 {
547 case GL_DEPTH_COMPONENT16:
548 case GL_DEPTH24_STENCIL8_OES:
549 return true;
550 case GL_STENCIL_INDEX8:
551 case GL_RGBA4:
552 case GL_RGB5_A1:
553 case GL_RGB565:
554 case GL_RGB8_OES:
555 case GL_RGBA8_OES:
556 return false;
557 default:
558 UNIMPLEMENTED();
559 }
560
561 return false;
562}
563
564bool IsStencilRenderable(GLenum internalformat)
565{
566 switch (internalformat)
567 {
568 case GL_STENCIL_INDEX8:
569 case GL_DEPTH24_STENCIL8_OES:
570 return true;
571 case GL_RGBA4:
572 case GL_RGB5_A1:
573 case GL_RGB565:
574 case GL_RGB8_OES:
575 case GL_RGBA8_OES:
576 case GL_DEPTH_COMPONENT16:
577 return false;
578 default:
579 UNIMPLEMENTED();
580 }
581
582 return false;
583}
584
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000585bool IsFloat32Format(GLint internalformat)
586{
587 switch (internalformat)
588 {
589 case GL_RGBA32F_EXT:
590 case GL_RGB32F_EXT:
591 case GL_ALPHA32F_EXT:
592 case GL_LUMINANCE32F_EXT:
593 case GL_LUMINANCE_ALPHA32F_EXT:
594 return true;
595 default:
596 return false;
597 }
598}
599
600bool IsFloat16Format(GLint internalformat)
601{
602 switch (internalformat)
603 {
604 case GL_RGBA16F_EXT:
605 case GL_RGB16F_EXT:
606 case GL_ALPHA16F_EXT:
607 case GL_LUMINANCE16F_EXT:
608 case GL_LUMINANCE_ALPHA16F_EXT:
609 return true;
610 default:
611 return false;
612 }
613}
614
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000615unsigned int GetAlphaSize(GLenum colorFormat)
616{
617 switch (colorFormat)
618 {
619 case GL_RGBA16F_EXT:
620 return 16;
621 case GL_RGBA32F_EXT:
622 return 32;
623 case GL_RGBA4:
624 return 4;
625 case GL_RGBA8_OES:
626 case GL_BGRA8_EXT:
627 return 8;
628 case GL_RGB5_A1:
629 return 1;
630 case GL_RGB8_OES:
631 case GL_RGB565:
632 case GL_RGB32F_EXT:
633 case GL_RGB16F_EXT:
634 return 0;
635 default:
636 return 0;
637 }
638}
639
640unsigned int GetRedSize(GLenum colorFormat)
641{
642 switch (colorFormat)
643 {
644 case GL_RGBA16F_EXT:
645 case GL_RGB16F_EXT:
646 return 16;
647 case GL_RGBA32F_EXT:
648 case GL_RGB32F_EXT:
649 return 32;
650 case GL_RGBA4:
651 return 4;
652 case GL_RGBA8_OES:
653 case GL_BGRA8_EXT:
654 case GL_RGB8_OES:
655 return 8;
656 case GL_RGB5_A1:
657 case GL_RGB565:
658 return 5;
659 default:
660 return 0;
661 }
662}
663
664unsigned int GetGreenSize(GLenum colorFormat)
665{
666 switch (colorFormat)
667 {
668 case GL_RGBA16F_EXT:
669 case GL_RGB16F_EXT:
670 return 16;
671 case GL_RGBA32F_EXT:
672 case GL_RGB32F_EXT:
673 return 32;
674 case GL_RGBA4:
675 return 4;
676 case GL_RGBA8_OES:
677 case GL_BGRA8_EXT:
678 case GL_RGB8_OES:
679 return 8;
680 case GL_RGB5_A1:
681 return 5;
682 case GL_RGB565:
683 return 6;
684 default:
685 return 0;
686 }
687}
688
689unsigned int GetBlueSize(GLenum colorFormat)
690{
691 switch (colorFormat)
692 {
693 case GL_RGBA16F_EXT:
694 case GL_RGB16F_EXT:
695 return 16;
696 case GL_RGBA32F_EXT:
697 case GL_RGB32F_EXT:
698 return 32;
699 case GL_RGBA4:
700 return 4;
701 case GL_RGBA8_OES:
702 case GL_BGRA8_EXT:
703 case GL_RGB8_OES:
704 return 8;
705 case GL_RGB5_A1:
706 case GL_RGB565:
707 return 5;
708 default:
709 return 0;
710 }
711}
712
713unsigned int GetDepthSize(GLenum depthFormat)
714{
715 switch (depthFormat)
716 {
717 case GL_DEPTH_COMPONENT16: return 16;
718 case GL_DEPTH_COMPONENT32_OES: return 32;
719 case GL_DEPTH24_STENCIL8_OES: return 24;
720 default: return 0;
721 }
722}
723
724unsigned int GetStencilSize(GLenum stencilFormat)
725{
726 switch (stencilFormat)
727 {
728 case GL_DEPTH24_STENCIL8_OES: return 8;
729 default: return 0;
730 }
731}
732
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000733bool IsTriangleMode(GLenum drawMode)
734{
735 switch (drawMode)
736 {
737 case GL_TRIANGLES:
738 case GL_TRIANGLE_FAN:
739 case GL_TRIANGLE_STRIP:
740 return true;
741 case GL_POINTS:
742 case GL_LINES:
743 case GL_LINE_LOOP:
744 case GL_LINE_STRIP:
745 return false;
746 default: UNREACHABLE();
747 }
748
749 return false;
750}
751
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000752}
753
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000754std::string getTempPath()
755{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000756 char path[MAX_PATH];
757 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
758 if (pathLen == 0)
759 {
760 UNREACHABLE();
761 return std::string();
762 }
763
764 UINT unique = GetTempFileNameA(path, "sh", 0, path);
765 if (unique == 0)
766 {
767 UNREACHABLE();
768 return std::string();
769 }
770
771 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000772}
773
774void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000775{
776 FILE* file = fopen(path, "w");
777 if (!file)
778 {
779 UNREACHABLE();
780 return;
781 }
782
783 fwrite(content, sizeof(char), size, file);
784 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000785}