blob: 86a228bd60af97ce66c0b75ea778362f97389d32 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +00002// Copyright (c) 2002-2013 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
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +00009#include "common/utilities.h"
10#include "common/mathutil.h"
11
12#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000014namespace gl
15{
16
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000017int UniformComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000018{
19 switch (type)
20 {
21 case GL_BOOL:
22 case GL_FLOAT:
23 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000024 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040025 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000026 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040027 case GL_SAMPLER_2D_ARRAY:
28 case GL_INT_SAMPLER_2D:
29 case GL_INT_SAMPLER_3D:
30 case GL_INT_SAMPLER_CUBE:
31 case GL_INT_SAMPLER_2D_ARRAY:
32 case GL_UNSIGNED_INT_SAMPLER_2D:
33 case GL_UNSIGNED_INT_SAMPLER_3D:
34 case GL_UNSIGNED_INT_SAMPLER_CUBE:
35 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000036 case GL_UNSIGNED_INT:
Nicolas Capense6050882013-07-08 10:43:10 -040037 return 1;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000038 case GL_BOOL_VEC2:
39 case GL_FLOAT_VEC2:
40 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000041 case GL_UNSIGNED_INT_VEC2:
Nicolas Capense6050882013-07-08 10:43:10 -040042 return 2;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000043 case GL_INT_VEC3:
44 case GL_FLOAT_VEC3:
45 case GL_BOOL_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000046 case GL_UNSIGNED_INT_VEC3:
Nicolas Capense6050882013-07-08 10:43:10 -040047 return 3;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000048 case GL_BOOL_VEC4:
49 case GL_FLOAT_VEC4:
50 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000051 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000052 case GL_FLOAT_MAT2:
Nicolas Capense6050882013-07-08 10:43:10 -040053 return 4;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000054 case GL_FLOAT_MAT2x3:
55 case GL_FLOAT_MAT3x2:
Nicolas Capense6050882013-07-08 10:43:10 -040056 return 6;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000057 case GL_FLOAT_MAT2x4:
58 case GL_FLOAT_MAT4x2:
Nicolas Capense6050882013-07-08 10:43:10 -040059 return 8;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000060 case GL_FLOAT_MAT3:
Nicolas Capense6050882013-07-08 10:43:10 -040061 return 9;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000062 case GL_FLOAT_MAT3x4:
63 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040064 return 12;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000065 case GL_FLOAT_MAT4:
Nicolas Capense6050882013-07-08 10:43:10 -040066 return 16;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000067 default:
Nicolas Capense6050882013-07-08 10:43:10 -040068 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000069 }
70
71 return 0;
72}
73
74GLenum UniformComponentType(GLenum type)
75{
76 switch(type)
77 {
78 case GL_BOOL:
79 case GL_BOOL_VEC2:
80 case GL_BOOL_VEC3:
81 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040082 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000083 case GL_FLOAT:
84 case GL_FLOAT_VEC2:
85 case GL_FLOAT_VEC3:
86 case GL_FLOAT_VEC4:
87 case GL_FLOAT_MAT2:
88 case GL_FLOAT_MAT3:
89 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000090 case GL_FLOAT_MAT2x3:
91 case GL_FLOAT_MAT3x2:
92 case GL_FLOAT_MAT2x4:
93 case GL_FLOAT_MAT4x2:
94 case GL_FLOAT_MAT3x4:
95 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040096 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000097 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000098 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040099 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000100 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400101 case GL_SAMPLER_2D_ARRAY:
102 case GL_INT_SAMPLER_2D:
103 case GL_INT_SAMPLER_3D:
104 case GL_INT_SAMPLER_CUBE:
105 case GL_INT_SAMPLER_2D_ARRAY:
106 case GL_UNSIGNED_INT_SAMPLER_2D:
107 case GL_UNSIGNED_INT_SAMPLER_3D:
108 case GL_UNSIGNED_INT_SAMPLER_CUBE:
109 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000110 case GL_INT_VEC2:
111 case GL_INT_VEC3:
112 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400113 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000114 case GL_UNSIGNED_INT:
115 case GL_UNSIGNED_INT_VEC2:
116 case GL_UNSIGNED_INT_VEC3:
117 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400118 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000119 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400120 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000121 }
122
123 return GL_NONE;
124}
125
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000126size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000127{
128 switch(type)
129 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000130 case GL_BOOL: return sizeof(GLint);
131 case GL_FLOAT: return sizeof(GLfloat);
132 case GL_INT: return sizeof(GLint);
133 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000134 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000135 }
136
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000137 return 0;
138}
139
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000140size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000141{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000142 // Expanded to 4-element vectors
143 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000144}
145
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000146size_t UniformExternalSize(GLenum type)
147{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000148 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000149}
150
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000151GLenum UniformBoolVectorType(GLenum type)
152{
153 switch (type)
154 {
155 case GL_FLOAT:
156 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000157 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000158 return GL_BOOL;
159 case GL_FLOAT_VEC2:
160 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000161 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000162 return GL_BOOL_VEC2;
163 case GL_FLOAT_VEC3:
164 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000165 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000166 return GL_BOOL_VEC3;
167 case GL_FLOAT_VEC4:
168 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000169 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000170 return GL_BOOL_VEC4;
171
172 default:
173 UNREACHABLE();
174 return GL_NONE;
175 }
176}
177
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000178int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000179{
180 switch (type)
181 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000182 case GL_NONE:
183 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000184 case GL_BOOL:
185 case GL_FLOAT:
186 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000187 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000188 case GL_BOOL_VEC2:
189 case GL_FLOAT_VEC2:
190 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000191 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000192 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000193 case GL_FLOAT_VEC3:
194 case GL_INT_VEC3:
195 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000196 case GL_BOOL_VEC4:
197 case GL_FLOAT_VEC4:
198 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000199 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000200 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400201 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000202 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400203 case GL_SAMPLER_2D_ARRAY:
204 case GL_INT_SAMPLER_2D:
205 case GL_INT_SAMPLER_3D:
206 case GL_INT_SAMPLER_CUBE:
207 case GL_INT_SAMPLER_2D_ARRAY:
208 case GL_UNSIGNED_INT_SAMPLER_2D:
209 case GL_UNSIGNED_INT_SAMPLER_3D:
210 case GL_UNSIGNED_INT_SAMPLER_CUBE:
211 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000212 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000213 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000214 case GL_FLOAT_MAT3x2:
215 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000216 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000217 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000218 case GL_FLOAT_MAT2x3:
219 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000220 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000221 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000222 case GL_FLOAT_MAT2x4:
223 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000224 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000225 default:
226 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000227 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000228
229 return 0;
230}
231
232int VariableColumnCount(GLenum type)
233{
234 switch (type)
235 {
236 case GL_NONE:
237 return 0;
238 case GL_BOOL:
239 case GL_FLOAT:
240 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000241 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000242 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400243 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000244 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400245 case GL_SAMPLER_2D_ARRAY:
246 case GL_INT_SAMPLER_2D:
247 case GL_INT_SAMPLER_3D:
248 case GL_INT_SAMPLER_CUBE:
249 case GL_INT_SAMPLER_2D_ARRAY:
250 case GL_UNSIGNED_INT_SAMPLER_2D:
251 case GL_UNSIGNED_INT_SAMPLER_3D:
252 case GL_UNSIGNED_INT_SAMPLER_CUBE:
253 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000254 return 1;
255 case GL_BOOL_VEC2:
256 case GL_FLOAT_VEC2:
257 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000258 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000259 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000260 case GL_FLOAT_MAT2x3:
261 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000262 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000263 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000264 case GL_FLOAT_VEC3:
265 case GL_INT_VEC3:
266 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000267 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000268 case GL_FLOAT_MAT3x2:
269 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000270 return 3;
271 case GL_BOOL_VEC4:
272 case GL_FLOAT_VEC4:
273 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000274 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000275 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000276 case GL_FLOAT_MAT4x2:
277 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000278 return 4;
279 default:
280 UNREACHABLE();
281 }
282
283 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000284}
285
Nicolas Capense6050882013-07-08 10:43:10 -0400286bool IsSampler(GLenum type)
287{
288 switch (type)
289 {
290 case GL_SAMPLER_2D:
291 case GL_SAMPLER_3D:
292 case GL_SAMPLER_CUBE:
293 case GL_SAMPLER_2D_ARRAY:
294 case GL_INT_SAMPLER_2D:
295 case GL_INT_SAMPLER_3D:
296 case GL_INT_SAMPLER_CUBE:
297 case GL_INT_SAMPLER_2D_ARRAY:
298 case GL_UNSIGNED_INT_SAMPLER_2D:
299 case GL_UNSIGNED_INT_SAMPLER_3D:
300 case GL_UNSIGNED_INT_SAMPLER_CUBE:
301 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
302 return true;
303 }
304
305 return false;
306}
307
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000308bool IsMatrixType(GLenum type)
309{
310 return VariableRowCount(type) > 1;
311}
312
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000313GLenum TransposeMatrixType(GLenum type)
314{
315 if (!IsMatrixType(type))
316 {
317 return type;
318 }
319
320 switch (type)
321 {
322 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
323 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
324 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
325 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
326 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
327 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
328 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
329 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
330 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
331 default: UNREACHABLE(); return GL_NONE;
332 }
333}
334
Jamie Madill8c6befc2013-06-20 11:55:55 -0400335int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
336{
337 ASSERT(IsMatrixType(type));
338 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
339}
340
341int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
342{
343 ASSERT(IsMatrixType(type));
344 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
345}
346
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000347int AttributeRegisterCount(GLenum type)
348{
349 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
350}
351
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000352int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
353{
354 ASSERT(allocationSize <= bitsSize);
355
356 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
357
358 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
359 {
360 if ((*bits & mask) == 0)
361 {
362 *bits |= mask;
363 return i;
364 }
365
366 mask <<= 1;
367 }
368
369 return -1;
370}
371
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000372bool IsStencilTexture(GLenum format)
373{
374 if (format == GL_DEPTH_STENCIL_OES ||
375 format == GL_DEPTH24_STENCIL8_OES)
376 {
377 return true;
378 }
379
380 return false;
381}
382
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000383void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
384{
385 int upsampleCount = 0;
386
387 if (isCompressed)
388 {
389 // Don't expand the size of full textures that are at least 4x4
390 // already.
391 if (isImage || *requestWidth < 4 || *requestHeight < 4)
392 {
393 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
394 {
395 *requestWidth <<= 1;
396 *requestHeight <<= 1;
397 upsampleCount++;
398 }
399 }
400 }
401 *levelOffset = upsampleCount;
402}
403
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000404// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000405int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000406{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000407 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000408 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000409 case GL_ALPHA8_EXT: return sizeof(unsigned char);
410 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
411 case GL_ALPHA32F_EXT: return sizeof(float);
412 case GL_LUMINANCE32F_EXT: return sizeof(float);
413 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
414 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
415 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
416 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
417 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
418 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
419 case GL_RGB565: return sizeof(unsigned short);
420 case GL_RGB32F_EXT: return sizeof(float) * 3;
421 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
422 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
423 case GL_RGBA4: return sizeof(unsigned short);
424 case GL_RGB5_A1: return sizeof(unsigned short);
425 case GL_RGBA32F_EXT: return sizeof(float) * 4;
426 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
427 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +0000428 case GL_SRGB8_ALPHA8: return sizeof(unsigned char) * 4;
429 case GL_RGB10_A2: return sizeof(unsigned char) * 4;
430 case GL_RG8: return sizeof(unsigned char) * 2;
431 case GL_R8: return sizeof(unsigned char);
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000432 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
433 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +0000434 default:
435 UNIMPLEMENTED(); // TODO: Remaining ES3 formats
436 UNREACHABLE();
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000437 }
438
439 return 0;
440}
441
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000442bool IsCubemapTextureTarget(GLenum target)
443{
444 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
445}
446
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000447bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000448{
449 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
450}
451
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000452bool IsTriangleMode(GLenum drawMode)
453{
454 switch (drawMode)
455 {
456 case GL_TRIANGLES:
457 case GL_TRIANGLE_FAN:
458 case GL_TRIANGLE_STRIP:
459 return true;
460 case GL_POINTS:
461 case GL_LINES:
462 case GL_LINE_LOOP:
463 case GL_LINE_STRIP:
464 return false;
465 default: UNREACHABLE();
466 }
467
468 return false;
469}
470
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000471}
472
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473std::string getTempPath()
474{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000475 char path[MAX_PATH];
476 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
477 if (pathLen == 0)
478 {
479 UNREACHABLE();
480 return std::string();
481 }
482
483 UINT unique = GetTempFileNameA(path, "sh", 0, path);
484 if (unique == 0)
485 {
486 UNREACHABLE();
487 return std::string();
488 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000489
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000490 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000491}
492
493void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000494{
495 FILE* file = fopen(path, "w");
496 if (!file)
497 {
498 UNREACHABLE();
499 return;
500 }
501
502 fwrite(content, sizeof(char), size, file);
503 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000504}