blob: 6d7c28b538794c2dbd9959f360f562f38eee01a1 [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{
Jamie Madillaa72d782014-07-02 15:31:19 -040020 return VariableRowCount(type) * VariableColumnCount(type);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000021}
22
Jamie Madillf2575982014-06-25 16:04:54 -040023GLenum VariableComponentType(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000024{
25 switch(type)
26 {
27 case GL_BOOL:
28 case GL_BOOL_VEC2:
29 case GL_BOOL_VEC3:
30 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040031 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000032 case GL_FLOAT:
33 case GL_FLOAT_VEC2:
34 case GL_FLOAT_VEC3:
35 case GL_FLOAT_VEC4:
36 case GL_FLOAT_MAT2:
37 case GL_FLOAT_MAT3:
38 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000039 case GL_FLOAT_MAT2x3:
40 case GL_FLOAT_MAT3x2:
41 case GL_FLOAT_MAT2x4:
42 case GL_FLOAT_MAT4x2:
43 case GL_FLOAT_MAT3x4:
44 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040045 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000046 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000047 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040048 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000049 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040050 case GL_SAMPLER_2D_ARRAY:
51 case GL_INT_SAMPLER_2D:
52 case GL_INT_SAMPLER_3D:
53 case GL_INT_SAMPLER_CUBE:
54 case GL_INT_SAMPLER_2D_ARRAY:
55 case GL_UNSIGNED_INT_SAMPLER_2D:
56 case GL_UNSIGNED_INT_SAMPLER_3D:
57 case GL_UNSIGNED_INT_SAMPLER_CUBE:
58 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -040059 case GL_SAMPLER_2D_SHADOW:
60 case GL_SAMPLER_CUBE_SHADOW:
61 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000062 case GL_INT_VEC2:
63 case GL_INT_VEC3:
64 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040065 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000066 case GL_UNSIGNED_INT:
67 case GL_UNSIGNED_INT_VEC2:
68 case GL_UNSIGNED_INT_VEC3:
69 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040070 return GL_UNSIGNED_INT;
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 GL_NONE;
76}
77
Jamie Madillf2575982014-06-25 16:04:54 -040078size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000079{
80 switch(type)
81 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000082 case GL_BOOL: return sizeof(GLint);
83 case GL_FLOAT: return sizeof(GLfloat);
84 case GL_INT: return sizeof(GLint);
85 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000086 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000087 }
88
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000089 return 0;
90}
91
Jamie Madillf2575982014-06-25 16:04:54 -040092size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000093{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000094 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -040095 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000096}
97
Jamie Madillf2575982014-06-25 16:04:54 -040098size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +000099{
Jamie Madillf2575982014-06-25 16:04:54 -0400100 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000101}
102
Jamie Madillf2575982014-06-25 16:04:54 -0400103GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000104{
105 switch (type)
106 {
107 case GL_FLOAT:
108 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000109 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000110 return GL_BOOL;
111 case GL_FLOAT_VEC2:
112 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000113 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000114 return GL_BOOL_VEC2;
115 case GL_FLOAT_VEC3:
116 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000117 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000118 return GL_BOOL_VEC3;
119 case GL_FLOAT_VEC4:
120 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000121 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000122 return GL_BOOL_VEC4;
123
124 default:
125 UNREACHABLE();
126 return GL_NONE;
127 }
128}
129
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000130int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000131{
132 switch (type)
133 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000134 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400135 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000136 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000137 case GL_BOOL:
138 case GL_FLOAT:
139 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000140 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000141 case GL_BOOL_VEC2:
142 case GL_FLOAT_VEC2:
143 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000144 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000145 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000146 case GL_FLOAT_VEC3:
147 case GL_INT_VEC3:
148 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000149 case GL_BOOL_VEC4:
150 case GL_FLOAT_VEC4:
151 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000152 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000153 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400154 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000155 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400156 case GL_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400157 case GL_SAMPLER_EXTERNAL_OES:
158 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400159 case GL_INT_SAMPLER_2D:
160 case GL_INT_SAMPLER_3D:
161 case GL_INT_SAMPLER_CUBE:
162 case GL_INT_SAMPLER_2D_ARRAY:
163 case GL_UNSIGNED_INT_SAMPLER_2D:
164 case GL_UNSIGNED_INT_SAMPLER_3D:
165 case GL_UNSIGNED_INT_SAMPLER_CUBE:
166 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400167 case GL_SAMPLER_2D_SHADOW:
168 case GL_SAMPLER_CUBE_SHADOW:
169 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000170 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000171 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000172 case GL_FLOAT_MAT3x2:
173 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000174 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000175 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000176 case GL_FLOAT_MAT2x3:
177 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000178 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000179 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000180 case GL_FLOAT_MAT2x4:
181 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000182 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000183 default:
184 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000185 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000186
187 return 0;
188}
189
190int VariableColumnCount(GLenum type)
191{
192 switch (type)
193 {
194 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400195 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000196 return 0;
197 case GL_BOOL:
198 case GL_FLOAT:
199 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000200 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000201 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400202 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000203 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400204 case GL_SAMPLER_2D_ARRAY:
205 case GL_INT_SAMPLER_2D:
206 case GL_INT_SAMPLER_3D:
207 case GL_INT_SAMPLER_CUBE:
208 case GL_INT_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400209 case GL_SAMPLER_EXTERNAL_OES:
210 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400211 case GL_UNSIGNED_INT_SAMPLER_2D:
212 case GL_UNSIGNED_INT_SAMPLER_3D:
213 case GL_UNSIGNED_INT_SAMPLER_CUBE:
214 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400215 case GL_SAMPLER_2D_SHADOW:
216 case GL_SAMPLER_CUBE_SHADOW:
217 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000218 return 1;
219 case GL_BOOL_VEC2:
220 case GL_FLOAT_VEC2:
221 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000222 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000223 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000224 case GL_FLOAT_MAT2x3:
225 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000226 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000227 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000228 case GL_FLOAT_VEC3:
229 case GL_INT_VEC3:
230 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000231 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000232 case GL_FLOAT_MAT3x2:
233 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000234 return 3;
235 case GL_BOOL_VEC4:
236 case GL_FLOAT_VEC4:
237 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000238 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000239 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000240 case GL_FLOAT_MAT4x2:
241 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000242 return 4;
243 default:
244 UNREACHABLE();
245 }
246
247 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000248}
249
Nicolas Capense6050882013-07-08 10:43:10 -0400250bool IsSampler(GLenum type)
251{
252 switch (type)
253 {
254 case GL_SAMPLER_2D:
255 case GL_SAMPLER_3D:
256 case GL_SAMPLER_CUBE:
257 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:
Nicolas Capense6050882013-07-08 10:43:10 -0400269 return true;
270 }
271
272 return false;
273}
274
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000275bool IsMatrixType(GLenum type)
276{
277 return VariableRowCount(type) > 1;
278}
279
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000280GLenum TransposeMatrixType(GLenum type)
281{
282 if (!IsMatrixType(type))
283 {
284 return type;
285 }
286
287 switch (type)
288 {
289 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
290 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
291 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
292 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
293 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
294 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
295 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
296 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
297 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
298 default: UNREACHABLE(); return GL_NONE;
299 }
300}
301
Jamie Madill8c6befc2013-06-20 11:55:55 -0400302int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
303{
304 ASSERT(IsMatrixType(type));
305 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
306}
307
308int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
309{
310 ASSERT(IsMatrixType(type));
311 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
312}
313
Jamie Madillf2575982014-06-25 16:04:54 -0400314int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000315{
316 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
317}
318
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000319int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
320{
321 ASSERT(allocationSize <= bitsSize);
322
323 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
324
325 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
326 {
327 if ((*bits & mask) == 0)
328 {
329 *bits |= mask;
330 return i;
331 }
332
333 mask <<= 1;
334 }
335
336 return -1;
337}
338
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000339bool IsCubemapTextureTarget(GLenum target)
340{
341 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
342}
343
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000344bool IsTriangleMode(GLenum drawMode)
345{
346 switch (drawMode)
347 {
348 case GL_TRIANGLES:
349 case GL_TRIANGLE_FAN:
350 case GL_TRIANGLE_STRIP:
351 return true;
352 case GL_POINTS:
353 case GL_LINES:
354 case GL_LINE_LOOP:
355 case GL_LINE_STRIP:
356 return false;
357 default: UNREACHABLE();
358 }
359
360 return false;
361}
362
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000363}
364
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000365std::string getTempPath()
366{
Shannon Woodsfb839472014-06-16 13:21:41 -0400367#ifdef ANGLE_PLATFORM_WINDOWS
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000368 char path[MAX_PATH];
369 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
370 if (pathLen == 0)
371 {
372 UNREACHABLE();
373 return std::string();
374 }
375
376 UINT unique = GetTempFileNameA(path, "sh", 0, path);
377 if (unique == 0)
378 {
379 UNREACHABLE();
380 return std::string();
381 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000382
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000383 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500384#else
385 UNIMPLEMENTED();
386 return "";
387#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000388}
389
390void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000391{
392 FILE* file = fopen(path, "w");
393 if (!file)
394 {
395 UNREACHABLE();
396 return;
397 }
398
399 fwrite(content, sizeof(char), size, file);
400 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000401}