blob: b1e989bbf64024dbc5644d01533b22fa87ca04bf [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
Geoff Lang83217792014-01-16 09:52:38 -050012#if defined(_WIN32)
13#include <windows.h>
14#endif
15
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000016#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000018namespace gl
19{
20
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000021int UniformComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000022{
23 switch (type)
24 {
25 case GL_BOOL:
26 case GL_FLOAT:
27 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000028 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040029 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000030 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040031 case GL_SAMPLER_2D_ARRAY:
32 case GL_INT_SAMPLER_2D:
33 case GL_INT_SAMPLER_3D:
34 case GL_INT_SAMPLER_CUBE:
35 case GL_INT_SAMPLER_2D_ARRAY:
36 case GL_UNSIGNED_INT_SAMPLER_2D:
37 case GL_UNSIGNED_INT_SAMPLER_3D:
38 case GL_UNSIGNED_INT_SAMPLER_CUBE:
39 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -040040 case GL_SAMPLER_2D_SHADOW:
41 case GL_SAMPLER_CUBE_SHADOW:
42 case GL_SAMPLER_2D_ARRAY_SHADOW:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000043 case GL_UNSIGNED_INT:
Nicolas Capense6050882013-07-08 10:43:10 -040044 return 1;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000045 case GL_BOOL_VEC2:
46 case GL_FLOAT_VEC2:
47 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000048 case GL_UNSIGNED_INT_VEC2:
Nicolas Capense6050882013-07-08 10:43:10 -040049 return 2;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000050 case GL_INT_VEC3:
51 case GL_FLOAT_VEC3:
52 case GL_BOOL_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000053 case GL_UNSIGNED_INT_VEC3:
Nicolas Capense6050882013-07-08 10:43:10 -040054 return 3;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000055 case GL_BOOL_VEC4:
56 case GL_FLOAT_VEC4:
57 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000058 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000059 case GL_FLOAT_MAT2:
Nicolas Capense6050882013-07-08 10:43:10 -040060 return 4;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000061 case GL_FLOAT_MAT2x3:
62 case GL_FLOAT_MAT3x2:
Nicolas Capense6050882013-07-08 10:43:10 -040063 return 6;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000064 case GL_FLOAT_MAT2x4:
65 case GL_FLOAT_MAT4x2:
Nicolas Capense6050882013-07-08 10:43:10 -040066 return 8;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000067 case GL_FLOAT_MAT3:
Nicolas Capense6050882013-07-08 10:43:10 -040068 return 9;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000069 case GL_FLOAT_MAT3x4:
70 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040071 return 12;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000072 case GL_FLOAT_MAT4:
Nicolas Capense6050882013-07-08 10:43:10 -040073 return 16;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000074 default:
Nicolas Capense6050882013-07-08 10:43:10 -040075 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000076 }
77
78 return 0;
79}
80
81GLenum UniformComponentType(GLenum type)
82{
83 switch(type)
84 {
85 case GL_BOOL:
86 case GL_BOOL_VEC2:
87 case GL_BOOL_VEC3:
88 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040089 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000090 case GL_FLOAT:
91 case GL_FLOAT_VEC2:
92 case GL_FLOAT_VEC3:
93 case GL_FLOAT_VEC4:
94 case GL_FLOAT_MAT2:
95 case GL_FLOAT_MAT3:
96 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000097 case GL_FLOAT_MAT2x3:
98 case GL_FLOAT_MAT3x2:
99 case GL_FLOAT_MAT2x4:
100 case GL_FLOAT_MAT4x2:
101 case GL_FLOAT_MAT3x4:
102 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -0400103 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000104 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000105 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400106 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000107 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400108 case GL_SAMPLER_2D_ARRAY:
109 case GL_INT_SAMPLER_2D:
110 case GL_INT_SAMPLER_3D:
111 case GL_INT_SAMPLER_CUBE:
112 case GL_INT_SAMPLER_2D_ARRAY:
113 case GL_UNSIGNED_INT_SAMPLER_2D:
114 case GL_UNSIGNED_INT_SAMPLER_3D:
115 case GL_UNSIGNED_INT_SAMPLER_CUBE:
116 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400117 case GL_SAMPLER_2D_SHADOW:
118 case GL_SAMPLER_CUBE_SHADOW:
119 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000120 case GL_INT_VEC2:
121 case GL_INT_VEC3:
122 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400123 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000124 case GL_UNSIGNED_INT:
125 case GL_UNSIGNED_INT_VEC2:
126 case GL_UNSIGNED_INT_VEC3:
127 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400128 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000129 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400130 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000131 }
132
133 return GL_NONE;
134}
135
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000136size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000137{
138 switch(type)
139 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000140 case GL_BOOL: return sizeof(GLint);
141 case GL_FLOAT: return sizeof(GLfloat);
142 case GL_INT: return sizeof(GLint);
143 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000144 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000145 }
146
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000147 return 0;
148}
149
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000150size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000151{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000152 // Expanded to 4-element vectors
153 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000154}
155
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000156size_t UniformExternalSize(GLenum type)
157{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000158 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000159}
160
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000161GLenum UniformBoolVectorType(GLenum type)
162{
163 switch (type)
164 {
165 case GL_FLOAT:
166 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000167 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000168 return GL_BOOL;
169 case GL_FLOAT_VEC2:
170 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000171 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000172 return GL_BOOL_VEC2;
173 case GL_FLOAT_VEC3:
174 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000175 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000176 return GL_BOOL_VEC3;
177 case GL_FLOAT_VEC4:
178 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000179 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000180 return GL_BOOL_VEC4;
181
182 default:
183 UNREACHABLE();
184 return GL_NONE;
185 }
186}
187
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000188int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000189{
190 switch (type)
191 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000192 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400193 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000194 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000195 case GL_BOOL:
196 case GL_FLOAT:
197 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000198 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000199 case GL_BOOL_VEC2:
200 case GL_FLOAT_VEC2:
201 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000202 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000203 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000204 case GL_FLOAT_VEC3:
205 case GL_INT_VEC3:
206 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000207 case GL_BOOL_VEC4:
208 case GL_FLOAT_VEC4:
209 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000210 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000211 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400212 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000213 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400214 case GL_SAMPLER_2D_ARRAY:
215 case GL_INT_SAMPLER_2D:
216 case GL_INT_SAMPLER_3D:
217 case GL_INT_SAMPLER_CUBE:
218 case GL_INT_SAMPLER_2D_ARRAY:
219 case GL_UNSIGNED_INT_SAMPLER_2D:
220 case GL_UNSIGNED_INT_SAMPLER_3D:
221 case GL_UNSIGNED_INT_SAMPLER_CUBE:
222 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400223 case GL_SAMPLER_2D_SHADOW:
224 case GL_SAMPLER_CUBE_SHADOW:
225 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000226 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000227 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000228 case GL_FLOAT_MAT3x2:
229 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000230 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000231 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000232 case GL_FLOAT_MAT2x3:
233 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000234 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000235 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000236 case GL_FLOAT_MAT2x4:
237 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000238 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000239 default:
240 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000241 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000242
243 return 0;
244}
245
246int VariableColumnCount(GLenum type)
247{
248 switch (type)
249 {
250 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400251 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000252 return 0;
253 case GL_BOOL:
254 case GL_FLOAT:
255 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000256 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000257 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400258 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000259 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400260 case GL_SAMPLER_2D_ARRAY:
261 case GL_INT_SAMPLER_2D:
262 case GL_INT_SAMPLER_3D:
263 case GL_INT_SAMPLER_CUBE:
264 case GL_INT_SAMPLER_2D_ARRAY:
265 case GL_UNSIGNED_INT_SAMPLER_2D:
266 case GL_UNSIGNED_INT_SAMPLER_3D:
267 case GL_UNSIGNED_INT_SAMPLER_CUBE:
268 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400269 case GL_SAMPLER_2D_SHADOW:
270 case GL_SAMPLER_CUBE_SHADOW:
271 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000272 return 1;
273 case GL_BOOL_VEC2:
274 case GL_FLOAT_VEC2:
275 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000276 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000277 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000278 case GL_FLOAT_MAT2x3:
279 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000280 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000281 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000282 case GL_FLOAT_VEC3:
283 case GL_INT_VEC3:
284 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000285 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000286 case GL_FLOAT_MAT3x2:
287 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000288 return 3;
289 case GL_BOOL_VEC4:
290 case GL_FLOAT_VEC4:
291 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000292 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000293 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000294 case GL_FLOAT_MAT4x2:
295 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000296 return 4;
297 default:
298 UNREACHABLE();
299 }
300
301 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000302}
303
Nicolas Capense6050882013-07-08 10:43:10 -0400304bool IsSampler(GLenum type)
305{
306 switch (type)
307 {
308 case GL_SAMPLER_2D:
309 case GL_SAMPLER_3D:
310 case GL_SAMPLER_CUBE:
311 case GL_SAMPLER_2D_ARRAY:
312 case GL_INT_SAMPLER_2D:
313 case GL_INT_SAMPLER_3D:
314 case GL_INT_SAMPLER_CUBE:
315 case GL_INT_SAMPLER_2D_ARRAY:
316 case GL_UNSIGNED_INT_SAMPLER_2D:
317 case GL_UNSIGNED_INT_SAMPLER_3D:
318 case GL_UNSIGNED_INT_SAMPLER_CUBE:
319 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400320 case GL_SAMPLER_2D_SHADOW:
321 case GL_SAMPLER_CUBE_SHADOW:
322 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400323 return true;
324 }
325
326 return false;
327}
328
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000329bool IsMatrixType(GLenum type)
330{
331 return VariableRowCount(type) > 1;
332}
333
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000334GLenum TransposeMatrixType(GLenum type)
335{
336 if (!IsMatrixType(type))
337 {
338 return type;
339 }
340
341 switch (type)
342 {
343 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
344 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
345 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
346 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
347 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
348 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
349 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
350 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
351 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
352 default: UNREACHABLE(); return GL_NONE;
353 }
354}
355
Jamie Madill8c6befc2013-06-20 11:55:55 -0400356int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
357{
358 ASSERT(IsMatrixType(type));
359 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
360}
361
362int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
363{
364 ASSERT(IsMatrixType(type));
365 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
366}
367
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000368int AttributeRegisterCount(GLenum type)
369{
370 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
371}
372
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000373int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
374{
375 ASSERT(allocationSize <= bitsSize);
376
377 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
378
379 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
380 {
381 if ((*bits & mask) == 0)
382 {
383 *bits |= mask;
384 return i;
385 }
386
387 mask <<= 1;
388 }
389
390 return -1;
391}
392
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000393bool IsCubemapTextureTarget(GLenum target)
394{
395 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
396}
397
Geoff Lang0fe19492013-07-25 17:04:31 -0400398bool IsInternalTextureTarget(GLenum target, GLuint clientVersion)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000399{
Geoff Lang0fe19492013-07-25 17:04:31 -0400400 if (clientVersion == 2)
401 {
402 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
403 }
404 else if (clientVersion == 3)
405 {
406 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) ||
407 target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
408 }
409 else
410 {
411 UNREACHABLE();
412 return false;
413 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000414}
415
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000416bool IsTriangleMode(GLenum drawMode)
417{
418 switch (drawMode)
419 {
420 case GL_TRIANGLES:
421 case GL_TRIANGLE_FAN:
422 case GL_TRIANGLE_STRIP:
423 return true;
424 case GL_POINTS:
425 case GL_LINES:
426 case GL_LINE_LOOP:
427 case GL_LINE_STRIP:
428 return false;
429 default: UNREACHABLE();
430 }
431
432 return false;
433}
434
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000435}
436
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000437std::string getTempPath()
438{
Geoff Lang83217792014-01-16 09:52:38 -0500439#if defined (_WIN32)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000440 char path[MAX_PATH];
441 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
442 if (pathLen == 0)
443 {
444 UNREACHABLE();
445 return std::string();
446 }
447
448 UINT unique = GetTempFileNameA(path, "sh", 0, path);
449 if (unique == 0)
450 {
451 UNREACHABLE();
452 return std::string();
453 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000454
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000455 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500456#else
457 UNIMPLEMENTED();
458 return "";
459#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000460}
461
462void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000463{
464 FILE* file = fopen(path, "w");
465 if (!file)
466 {
467 UNREACHABLE();
468 return;
469 }
470
471 fwrite(content, sizeof(char), size, file);
472 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473}