blob: f47f8e548dc0d7ad7b4d6215ce083ecb049e70fc [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"
Geoff Lang44fa7592014-05-30 11:50:07 -040011#include "common/platform.h"
Geoff Lang83217792014-01-16 09:52:38 -050012
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000014
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000015namespace gl
16{
17
Jamie Madillf2575982014-06-25 16:04:54 -040018int VariableComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000019{
20 switch (type)
21 {
22 case GL_BOOL:
23 case GL_FLOAT:
24 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000025 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040026 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000027 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040028 case GL_SAMPLER_2D_ARRAY:
29 case GL_INT_SAMPLER_2D:
30 case GL_INT_SAMPLER_3D:
31 case GL_INT_SAMPLER_CUBE:
32 case GL_INT_SAMPLER_2D_ARRAY:
33 case GL_UNSIGNED_INT_SAMPLER_2D:
34 case GL_UNSIGNED_INT_SAMPLER_3D:
35 case GL_UNSIGNED_INT_SAMPLER_CUBE:
36 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -040037 case GL_SAMPLER_2D_SHADOW:
38 case GL_SAMPLER_CUBE_SHADOW:
39 case GL_SAMPLER_2D_ARRAY_SHADOW:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000040 case GL_UNSIGNED_INT:
Nicolas Capense6050882013-07-08 10:43:10 -040041 return 1;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000042 case GL_BOOL_VEC2:
43 case GL_FLOAT_VEC2:
44 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000045 case GL_UNSIGNED_INT_VEC2:
Nicolas Capense6050882013-07-08 10:43:10 -040046 return 2;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000047 case GL_INT_VEC3:
48 case GL_FLOAT_VEC3:
49 case GL_BOOL_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000050 case GL_UNSIGNED_INT_VEC3:
Nicolas Capense6050882013-07-08 10:43:10 -040051 return 3;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000052 case GL_BOOL_VEC4:
53 case GL_FLOAT_VEC4:
54 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000055 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000056 case GL_FLOAT_MAT2:
Nicolas Capense6050882013-07-08 10:43:10 -040057 return 4;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000058 case GL_FLOAT_MAT2x3:
59 case GL_FLOAT_MAT3x2:
Nicolas Capense6050882013-07-08 10:43:10 -040060 return 6;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000061 case GL_FLOAT_MAT2x4:
62 case GL_FLOAT_MAT4x2:
Nicolas Capense6050882013-07-08 10:43:10 -040063 return 8;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000064 case GL_FLOAT_MAT3:
Nicolas Capense6050882013-07-08 10:43:10 -040065 return 9;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000066 case GL_FLOAT_MAT3x4:
67 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040068 return 12;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000069 case GL_FLOAT_MAT4:
Nicolas Capense6050882013-07-08 10:43:10 -040070 return 16;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000071 default:
Nicolas Capense6050882013-07-08 10:43:10 -040072 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000073 }
74
75 return 0;
76}
77
Jamie Madillf2575982014-06-25 16:04:54 -040078GLenum VariableComponentType(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000079{
80 switch(type)
81 {
82 case GL_BOOL:
83 case GL_BOOL_VEC2:
84 case GL_BOOL_VEC3:
85 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040086 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000087 case GL_FLOAT:
88 case GL_FLOAT_VEC2:
89 case GL_FLOAT_VEC3:
90 case GL_FLOAT_VEC4:
91 case GL_FLOAT_MAT2:
92 case GL_FLOAT_MAT3:
93 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000094 case GL_FLOAT_MAT2x3:
95 case GL_FLOAT_MAT3x2:
96 case GL_FLOAT_MAT2x4:
97 case GL_FLOAT_MAT4x2:
98 case GL_FLOAT_MAT3x4:
99 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -0400100 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000101 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000102 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400103 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000104 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400105 case GL_SAMPLER_2D_ARRAY:
106 case GL_INT_SAMPLER_2D:
107 case GL_INT_SAMPLER_3D:
108 case GL_INT_SAMPLER_CUBE:
109 case GL_INT_SAMPLER_2D_ARRAY:
110 case GL_UNSIGNED_INT_SAMPLER_2D:
111 case GL_UNSIGNED_INT_SAMPLER_3D:
112 case GL_UNSIGNED_INT_SAMPLER_CUBE:
113 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400114 case GL_SAMPLER_2D_SHADOW:
115 case GL_SAMPLER_CUBE_SHADOW:
116 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000117 case GL_INT_VEC2:
118 case GL_INT_VEC3:
119 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400120 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000121 case GL_UNSIGNED_INT:
122 case GL_UNSIGNED_INT_VEC2:
123 case GL_UNSIGNED_INT_VEC3:
124 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400125 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000126 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400127 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000128 }
129
130 return GL_NONE;
131}
132
Jamie Madillf2575982014-06-25 16:04:54 -0400133size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000134{
135 switch(type)
136 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000137 case GL_BOOL: return sizeof(GLint);
138 case GL_FLOAT: return sizeof(GLfloat);
139 case GL_INT: return sizeof(GLint);
140 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000141 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000142 }
143
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000144 return 0;
145}
146
Jamie Madillf2575982014-06-25 16:04:54 -0400147size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000148{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000149 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -0400150 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000151}
152
Jamie Madillf2575982014-06-25 16:04:54 -0400153size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000154{
Jamie Madillf2575982014-06-25 16:04:54 -0400155 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000156}
157
Jamie Madillf2575982014-06-25 16:04:54 -0400158GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000159{
160 switch (type)
161 {
162 case GL_FLOAT:
163 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000164 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000165 return GL_BOOL;
166 case GL_FLOAT_VEC2:
167 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000168 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000169 return GL_BOOL_VEC2;
170 case GL_FLOAT_VEC3:
171 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000172 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000173 return GL_BOOL_VEC3;
174 case GL_FLOAT_VEC4:
175 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000176 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000177 return GL_BOOL_VEC4;
178
179 default:
180 UNREACHABLE();
181 return GL_NONE;
182 }
183}
184
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000185int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000186{
187 switch (type)
188 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000189 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400190 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000191 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000192 case GL_BOOL:
193 case GL_FLOAT:
194 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000195 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000196 case GL_BOOL_VEC2:
197 case GL_FLOAT_VEC2:
198 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000199 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000200 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000201 case GL_FLOAT_VEC3:
202 case GL_INT_VEC3:
203 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000204 case GL_BOOL_VEC4:
205 case GL_FLOAT_VEC4:
206 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000207 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000208 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400209 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000210 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400211 case GL_SAMPLER_2D_ARRAY:
212 case GL_INT_SAMPLER_2D:
213 case GL_INT_SAMPLER_3D:
214 case GL_INT_SAMPLER_CUBE:
215 case GL_INT_SAMPLER_2D_ARRAY:
216 case GL_UNSIGNED_INT_SAMPLER_2D:
217 case GL_UNSIGNED_INT_SAMPLER_3D:
218 case GL_UNSIGNED_INT_SAMPLER_CUBE:
219 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400220 case GL_SAMPLER_2D_SHADOW:
221 case GL_SAMPLER_CUBE_SHADOW:
222 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000223 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000224 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000225 case GL_FLOAT_MAT3x2:
226 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000227 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000228 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000229 case GL_FLOAT_MAT2x3:
230 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000231 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000232 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000233 case GL_FLOAT_MAT2x4:
234 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000235 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000236 default:
237 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000238 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000239
240 return 0;
241}
242
243int VariableColumnCount(GLenum type)
244{
245 switch (type)
246 {
247 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400248 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000249 return 0;
250 case GL_BOOL:
251 case GL_FLOAT:
252 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000253 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000254 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400255 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000256 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400257 case GL_SAMPLER_2D_ARRAY:
258 case GL_INT_SAMPLER_2D:
259 case GL_INT_SAMPLER_3D:
260 case GL_INT_SAMPLER_CUBE:
261 case GL_INT_SAMPLER_2D_ARRAY:
262 case GL_UNSIGNED_INT_SAMPLER_2D:
263 case GL_UNSIGNED_INT_SAMPLER_3D:
264 case GL_UNSIGNED_INT_SAMPLER_CUBE:
265 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400266 case GL_SAMPLER_2D_SHADOW:
267 case GL_SAMPLER_CUBE_SHADOW:
268 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000269 return 1;
270 case GL_BOOL_VEC2:
271 case GL_FLOAT_VEC2:
272 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000273 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000274 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000275 case GL_FLOAT_MAT2x3:
276 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000277 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000278 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000279 case GL_FLOAT_VEC3:
280 case GL_INT_VEC3:
281 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000282 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000283 case GL_FLOAT_MAT3x2:
284 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000285 return 3;
286 case GL_BOOL_VEC4:
287 case GL_FLOAT_VEC4:
288 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000289 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000290 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000291 case GL_FLOAT_MAT4x2:
292 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000293 return 4;
294 default:
295 UNREACHABLE();
296 }
297
298 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000299}
300
Nicolas Capense6050882013-07-08 10:43:10 -0400301bool IsSampler(GLenum type)
302{
303 switch (type)
304 {
305 case GL_SAMPLER_2D:
306 case GL_SAMPLER_3D:
307 case GL_SAMPLER_CUBE:
308 case GL_SAMPLER_2D_ARRAY:
309 case GL_INT_SAMPLER_2D:
310 case GL_INT_SAMPLER_3D:
311 case GL_INT_SAMPLER_CUBE:
312 case GL_INT_SAMPLER_2D_ARRAY:
313 case GL_UNSIGNED_INT_SAMPLER_2D:
314 case GL_UNSIGNED_INT_SAMPLER_3D:
315 case GL_UNSIGNED_INT_SAMPLER_CUBE:
316 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400317 case GL_SAMPLER_2D_SHADOW:
318 case GL_SAMPLER_CUBE_SHADOW:
319 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400320 return true;
321 }
322
323 return false;
324}
325
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000326bool IsMatrixType(GLenum type)
327{
328 return VariableRowCount(type) > 1;
329}
330
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000331GLenum TransposeMatrixType(GLenum type)
332{
333 if (!IsMatrixType(type))
334 {
335 return type;
336 }
337
338 switch (type)
339 {
340 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
341 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
342 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
343 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
344 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
345 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
346 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
347 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
348 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
349 default: UNREACHABLE(); return GL_NONE;
350 }
351}
352
Jamie Madill8c6befc2013-06-20 11:55:55 -0400353int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
354{
355 ASSERT(IsMatrixType(type));
356 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
357}
358
359int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
360{
361 ASSERT(IsMatrixType(type));
362 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
363}
364
Jamie Madillf2575982014-06-25 16:04:54 -0400365int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000366{
367 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
368}
369
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000370int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
371{
372 ASSERT(allocationSize <= bitsSize);
373
374 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
375
376 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
377 {
378 if ((*bits & mask) == 0)
379 {
380 *bits |= mask;
381 return i;
382 }
383
384 mask <<= 1;
385 }
386
387 return -1;
388}
389
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000390bool IsCubemapTextureTarget(GLenum target)
391{
392 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
393}
394
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000395bool IsTriangleMode(GLenum drawMode)
396{
397 switch (drawMode)
398 {
399 case GL_TRIANGLES:
400 case GL_TRIANGLE_FAN:
401 case GL_TRIANGLE_STRIP:
402 return true;
403 case GL_POINTS:
404 case GL_LINES:
405 case GL_LINE_LOOP:
406 case GL_LINE_STRIP:
407 return false;
408 default: UNREACHABLE();
409 }
410
411 return false;
412}
413
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000414}
415
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000416std::string getTempPath()
417{
Shannon Woodsfb839472014-06-16 13:21:41 -0400418#ifdef ANGLE_PLATFORM_WINDOWS
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000419 char path[MAX_PATH];
420 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
421 if (pathLen == 0)
422 {
423 UNREACHABLE();
424 return std::string();
425 }
426
427 UINT unique = GetTempFileNameA(path, "sh", 0, path);
428 if (unique == 0)
429 {
430 UNREACHABLE();
431 return std::string();
432 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000433
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000434 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500435#else
436 UNIMPLEMENTED();
437 return "";
438#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000439}
440
441void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000442{
443 FILE* file = fopen(path, "w");
444 if (!file)
445 {
446 UNREACHABLE();
447 return;
448 }
449
450 fwrite(content, sizeof(char), size, file);
451 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000452}