blob: 8fa7f532696dca3e2fec9656779818eaba928e7d [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:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000179 case GL_FLOAT_MAT3x2:
180 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000181 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000182 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000183 case GL_FLOAT_MAT2x3:
184 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000185 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000186 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000187 case GL_FLOAT_MAT2x4:
188 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000189 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000190 default:
191 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000192 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000193
194 return 0;
195}
196
197int VariableColumnCount(GLenum type)
198{
199 switch (type)
200 {
201 case GL_NONE:
202 return 0;
203 case GL_BOOL:
204 case GL_FLOAT:
205 case GL_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000206 case GL_SAMPLER_2D:
207 case GL_SAMPLER_CUBE:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000208 return 1;
209 case GL_BOOL_VEC2:
210 case GL_FLOAT_VEC2:
211 case GL_INT_VEC2:
212 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000213 case GL_FLOAT_MAT2x3:
214 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000215 return 2;
216 case GL_INT_VEC3:
217 case GL_FLOAT_VEC3:
218 case GL_BOOL_VEC3:
219 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000220 case GL_FLOAT_MAT3x2:
221 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000222 return 3;
223 case GL_BOOL_VEC4:
224 case GL_FLOAT_VEC4:
225 case GL_INT_VEC4:
226 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000227 case GL_FLOAT_MAT4x2:
228 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000229 return 4;
230 default:
231 UNREACHABLE();
232 }
233
234 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000235}
236
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000237bool IsMatrixType(GLenum type)
238{
239 return VariableRowCount(type) > 1;
240}
241
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000242int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
243{
244 ASSERT(allocationSize <= bitsSize);
245
246 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
247
248 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
249 {
250 if ((*bits & mask) == 0)
251 {
252 *bits |= mask;
253 return i;
254 }
255
256 mask <<= 1;
257 }
258
259 return -1;
260}
261
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000262GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000263{
264 ASSERT(alignment > 0 && isPow2(alignment));
265
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000266 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000267 return (rawPitch + alignment - 1) & ~(alignment - 1);
268}
269
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000270GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000271{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000272 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000273}
274
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000275GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000276{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000277 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000278 {
279 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
280 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000281 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000282 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
283 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000284 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000285 default:
286 return 0;
287 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000288}
289
290bool IsCompressed(GLenum format)
291{
292 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000293 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
294 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
295 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000296 {
297 return true;
298 }
299 else
300 {
301 return false;
302 }
303}
304
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000305bool IsDepthTexture(GLenum format)
306{
307 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000308 format == GL_DEPTH_STENCIL_OES ||
309 format == GL_DEPTH_COMPONENT16 ||
310 format == GL_DEPTH_COMPONENT32_OES ||
311 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000312 {
313 return true;
314 }
315
316 return false;
317}
318
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000319bool IsStencilTexture(GLenum format)
320{
321 if (format == GL_DEPTH_STENCIL_OES ||
322 format == GL_DEPTH24_STENCIL8_OES)
323 {
324 return true;
325 }
326
327 return false;
328}
329
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000330void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
331{
332 int upsampleCount = 0;
333
334 if (isCompressed)
335 {
336 // Don't expand the size of full textures that are at least 4x4
337 // already.
338 if (isImage || *requestWidth < 4 || *requestHeight < 4)
339 {
340 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
341 {
342 *requestWidth <<= 1;
343 *requestHeight <<= 1;
344 upsampleCount++;
345 }
346 }
347 }
348 *levelOffset = upsampleCount;
349}
350
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000351// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000352int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000353{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000354 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000355 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000356 case GL_ALPHA8_EXT: return sizeof(unsigned char);
357 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
358 case GL_ALPHA32F_EXT: return sizeof(float);
359 case GL_LUMINANCE32F_EXT: return sizeof(float);
360 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
361 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
362 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
363 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
364 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
365 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
366 case GL_RGB565: return sizeof(unsigned short);
367 case GL_RGB32F_EXT: return sizeof(float) * 3;
368 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
369 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
370 case GL_RGBA4: return sizeof(unsigned short);
371 case GL_RGB5_A1: return sizeof(unsigned short);
372 case GL_RGBA32F_EXT: return sizeof(float) * 4;
373 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
374 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000375 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
376 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000377 default: UNREACHABLE();
378 }
379
380 return 0;
381}
382
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000383bool IsCubemapTextureTarget(GLenum target)
384{
385 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
386}
387
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000388bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000389{
390 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
391}
392
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000393GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
394{
395 switch (format)
396 {
397 case GL_ALPHA:
398 switch (type)
399 {
400 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
401 case GL_FLOAT: return GL_ALPHA32F_EXT;
402 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
403 default: UNIMPLEMENTED();
404 }
405 break;
406 case GL_LUMINANCE:
407 switch (type)
408 {
409 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
410 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
411 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
412 default: UNIMPLEMENTED();
413 }
414 break;
415 case GL_LUMINANCE_ALPHA:
416 switch (type)
417 {
418 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
419 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
420 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
421 default: UNIMPLEMENTED();
422 }
423 break;
424 case GL_RGB:
425 switch (type)
426 {
427 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
428 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
429 case GL_FLOAT: return GL_RGB32F_EXT;
430 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
431 default: UNIMPLEMENTED();
432 }
433 break;
434 case GL_RGBA:
435 switch (type)
436 {
437 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
438 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
439 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
440 case GL_FLOAT: return GL_RGBA32F_EXT;
441 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
442 break;
443 default: UNIMPLEMENTED();
444 }
445 break;
446 case GL_BGRA_EXT:
447 switch (type)
448 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000449 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000450 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
451 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000452 default: UNIMPLEMENTED();
453 }
454 break;
455 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
456 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
457 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
458 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
459 return format;
460 case GL_DEPTH_COMPONENT:
461 switch (type)
462 {
463 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
464 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
465 default: UNIMPLEMENTED();
466 }
467 break;
468 case GL_DEPTH_STENCIL_OES:
469 switch (type)
470 {
471 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
472 default: UNIMPLEMENTED();
473 }
474 break;
475 default:
476 UNIMPLEMENTED();
477 }
478
479 return GL_NONE;
480}
481
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000482GLenum ExtractFormat(GLenum internalformat)
483{
484 switch (internalformat)
485 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000486 case GL_RGB565: return GL_RGB;
487 case GL_RGBA4: return GL_RGBA;
488 case GL_RGB5_A1: return GL_RGBA;
489 case GL_RGB8_OES: return GL_RGB;
490 case GL_RGBA8_OES: return GL_RGBA;
491 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
492 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
493 case GL_ALPHA8_EXT: return GL_ALPHA;
494 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
495 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
496 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
497 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000498 case GL_RGBA32F_EXT: return GL_RGBA;
499 case GL_RGB32F_EXT: return GL_RGB;
500 case GL_ALPHA32F_EXT: return GL_ALPHA;
501 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
502 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
503 case GL_RGBA16F_EXT: return GL_RGBA;
504 case GL_RGB16F_EXT: return GL_RGB;
505 case GL_ALPHA16F_EXT: return GL_ALPHA;
506 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
507 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
508 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000509 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
510 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
511 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000512 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000513 }
514}
515
516GLenum ExtractType(GLenum internalformat)
517{
518 switch (internalformat)
519 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000520 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
521 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
522 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
523 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
524 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
525 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
526 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
527 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
528 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
529 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
530 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
531 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000532 case GL_RGBA32F_EXT: return GL_FLOAT;
533 case GL_RGB32F_EXT: return GL_FLOAT;
534 case GL_ALPHA32F_EXT: return GL_FLOAT;
535 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
536 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
537 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
538 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
539 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
540 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
541 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
542 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000543 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
544 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
545 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000546 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000547 }
548}
549
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000550bool IsColorRenderable(GLenum internalformat)
551{
552 switch (internalformat)
553 {
554 case GL_RGBA4:
555 case GL_RGB5_A1:
556 case GL_RGB565:
557 case GL_RGB8_OES:
558 case GL_RGBA8_OES:
559 return true;
560 case GL_DEPTH_COMPONENT16:
561 case GL_STENCIL_INDEX8:
562 case GL_DEPTH24_STENCIL8_OES:
563 return false;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000564 case GL_BGRA8_EXT:
565 return true;
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000566 default:
567 UNIMPLEMENTED();
568 }
569
570 return false;
571}
572
573bool IsDepthRenderable(GLenum internalformat)
574{
575 switch (internalformat)
576 {
577 case GL_DEPTH_COMPONENT16:
578 case GL_DEPTH24_STENCIL8_OES:
579 return true;
580 case GL_STENCIL_INDEX8:
581 case GL_RGBA4:
582 case GL_RGB5_A1:
583 case GL_RGB565:
584 case GL_RGB8_OES:
585 case GL_RGBA8_OES:
586 return false;
587 default:
588 UNIMPLEMENTED();
589 }
590
591 return false;
592}
593
594bool IsStencilRenderable(GLenum internalformat)
595{
596 switch (internalformat)
597 {
598 case GL_STENCIL_INDEX8:
599 case GL_DEPTH24_STENCIL8_OES:
600 return true;
601 case GL_RGBA4:
602 case GL_RGB5_A1:
603 case GL_RGB565:
604 case GL_RGB8_OES:
605 case GL_RGBA8_OES:
606 case GL_DEPTH_COMPONENT16:
607 return false;
608 default:
609 UNIMPLEMENTED();
610 }
611
612 return false;
613}
614
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000615bool IsFloat32Format(GLint internalformat)
616{
617 switch (internalformat)
618 {
619 case GL_RGBA32F_EXT:
620 case GL_RGB32F_EXT:
621 case GL_ALPHA32F_EXT:
622 case GL_LUMINANCE32F_EXT:
623 case GL_LUMINANCE_ALPHA32F_EXT:
624 return true;
625 default:
626 return false;
627 }
628}
629
630bool IsFloat16Format(GLint internalformat)
631{
632 switch (internalformat)
633 {
634 case GL_RGBA16F_EXT:
635 case GL_RGB16F_EXT:
636 case GL_ALPHA16F_EXT:
637 case GL_LUMINANCE16F_EXT:
638 case GL_LUMINANCE_ALPHA16F_EXT:
639 return true;
640 default:
641 return false;
642 }
643}
644
daniel@transgaming.com5ac99782012-10-31 19:51:39 +0000645unsigned int GetAlphaSize(GLenum colorFormat)
646{
647 switch (colorFormat)
648 {
649 case GL_RGBA16F_EXT:
650 return 16;
651 case GL_RGBA32F_EXT:
652 return 32;
653 case GL_RGBA4:
654 return 4;
655 case GL_RGBA8_OES:
656 case GL_BGRA8_EXT:
657 return 8;
658 case GL_RGB5_A1:
659 return 1;
660 case GL_RGB8_OES:
661 case GL_RGB565:
662 case GL_RGB32F_EXT:
663 case GL_RGB16F_EXT:
664 return 0;
665 default:
666 return 0;
667 }
668}
669
670unsigned int GetRedSize(GLenum colorFormat)
671{
672 switch (colorFormat)
673 {
674 case GL_RGBA16F_EXT:
675 case GL_RGB16F_EXT:
676 return 16;
677 case GL_RGBA32F_EXT:
678 case GL_RGB32F_EXT:
679 return 32;
680 case GL_RGBA4:
681 return 4;
682 case GL_RGBA8_OES:
683 case GL_BGRA8_EXT:
684 case GL_RGB8_OES:
685 return 8;
686 case GL_RGB5_A1:
687 case GL_RGB565:
688 return 5;
689 default:
690 return 0;
691 }
692}
693
694unsigned int GetGreenSize(GLenum colorFormat)
695{
696 switch (colorFormat)
697 {
698 case GL_RGBA16F_EXT:
699 case GL_RGB16F_EXT:
700 return 16;
701 case GL_RGBA32F_EXT:
702 case GL_RGB32F_EXT:
703 return 32;
704 case GL_RGBA4:
705 return 4;
706 case GL_RGBA8_OES:
707 case GL_BGRA8_EXT:
708 case GL_RGB8_OES:
709 return 8;
710 case GL_RGB5_A1:
711 return 5;
712 case GL_RGB565:
713 return 6;
714 default:
715 return 0;
716 }
717}
718
719unsigned int GetBlueSize(GLenum colorFormat)
720{
721 switch (colorFormat)
722 {
723 case GL_RGBA16F_EXT:
724 case GL_RGB16F_EXT:
725 return 16;
726 case GL_RGBA32F_EXT:
727 case GL_RGB32F_EXT:
728 return 32;
729 case GL_RGBA4:
730 return 4;
731 case GL_RGBA8_OES:
732 case GL_BGRA8_EXT:
733 case GL_RGB8_OES:
734 return 8;
735 case GL_RGB5_A1:
736 case GL_RGB565:
737 return 5;
738 default:
739 return 0;
740 }
741}
742
743unsigned int GetDepthSize(GLenum depthFormat)
744{
745 switch (depthFormat)
746 {
747 case GL_DEPTH_COMPONENT16: return 16;
748 case GL_DEPTH_COMPONENT32_OES: return 32;
749 case GL_DEPTH24_STENCIL8_OES: return 24;
750 default: return 0;
751 }
752}
753
754unsigned int GetStencilSize(GLenum stencilFormat)
755{
756 switch (stencilFormat)
757 {
758 case GL_DEPTH24_STENCIL8_OES: return 8;
759 default: return 0;
760 }
761}
762
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000763bool IsTriangleMode(GLenum drawMode)
764{
765 switch (drawMode)
766 {
767 case GL_TRIANGLES:
768 case GL_TRIANGLE_FAN:
769 case GL_TRIANGLE_STRIP:
770 return true;
771 case GL_POINTS:
772 case GL_LINES:
773 case GL_LINE_LOOP:
774 case GL_LINE_STRIP:
775 return false;
776 default: UNREACHABLE();
777 }
778
779 return false;
780}
781
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000782}
783
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000784std::string getTempPath()
785{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000786 char path[MAX_PATH];
787 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
788 if (pathLen == 0)
789 {
790 UNREACHABLE();
791 return std::string();
792 }
793
794 UINT unique = GetTempFileNameA(path, "sh", 0, path);
795 if (unique == 0)
796 {
797 UNREACHABLE();
798 return std::string();
799 }
800
801 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000802}
803
804void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000805{
806 FILE* file = fopen(path, "w");
807 if (!file)
808 {
809 UNREACHABLE();
810 return;
811 }
812
813 fwrite(content, sizeof(char), size, file);
814 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000815}