blob: 9d797a6612f71deed01a15e9861e29def20282ac [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
Cooper Partin88d3b8c2014-10-08 10:41:56 -070015#if defined(ANGLE_ENABLE_WINDOWS_STORE)
16# include <wrl.h>
17# include <wrl/wrappers/corewrappers.h>
18# include <windows.applicationmodel.core.h>
19# include <windows.graphics.display.h>
20#endif
21
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000022namespace gl
23{
24
Jamie Madillf2575982014-06-25 16:04:54 -040025int VariableComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000026{
Jamie Madillaa72d782014-07-02 15:31:19 -040027 return VariableRowCount(type) * VariableColumnCount(type);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000028}
29
Jamie Madillf2575982014-06-25 16:04:54 -040030GLenum VariableComponentType(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000031{
32 switch(type)
33 {
34 case GL_BOOL:
35 case GL_BOOL_VEC2:
36 case GL_BOOL_VEC3:
37 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040038 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000039 case GL_FLOAT:
40 case GL_FLOAT_VEC2:
41 case GL_FLOAT_VEC3:
42 case GL_FLOAT_VEC4:
43 case GL_FLOAT_MAT2:
44 case GL_FLOAT_MAT3:
45 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000046 case GL_FLOAT_MAT2x3:
47 case GL_FLOAT_MAT3x2:
48 case GL_FLOAT_MAT2x4:
49 case GL_FLOAT_MAT4x2:
50 case GL_FLOAT_MAT3x4:
51 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040052 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000053 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000054 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040055 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000056 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040057 case GL_SAMPLER_2D_ARRAY:
58 case GL_INT_SAMPLER_2D:
59 case GL_INT_SAMPLER_3D:
60 case GL_INT_SAMPLER_CUBE:
61 case GL_INT_SAMPLER_2D_ARRAY:
62 case GL_UNSIGNED_INT_SAMPLER_2D:
63 case GL_UNSIGNED_INT_SAMPLER_3D:
64 case GL_UNSIGNED_INT_SAMPLER_CUBE:
65 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -040066 case GL_SAMPLER_2D_SHADOW:
67 case GL_SAMPLER_CUBE_SHADOW:
68 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000069 case GL_INT_VEC2:
70 case GL_INT_VEC3:
71 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040072 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000073 case GL_UNSIGNED_INT:
74 case GL_UNSIGNED_INT_VEC2:
75 case GL_UNSIGNED_INT_VEC3:
76 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040077 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000078 default:
Nicolas Capense6050882013-07-08 10:43:10 -040079 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000080 }
81
82 return GL_NONE;
83}
84
Jamie Madillf2575982014-06-25 16:04:54 -040085size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000086{
87 switch(type)
88 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000089 case GL_BOOL: return sizeof(GLint);
90 case GL_FLOAT: return sizeof(GLfloat);
91 case GL_INT: return sizeof(GLint);
92 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000093 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000094 }
95
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000096 return 0;
97}
98
Jamie Madillf2575982014-06-25 16:04:54 -040099size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000100{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000101 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -0400102 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000103}
104
Jamie Madillf2575982014-06-25 16:04:54 -0400105size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000106{
Jamie Madillf2575982014-06-25 16:04:54 -0400107 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000108}
109
Jamie Madillf2575982014-06-25 16:04:54 -0400110GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000111{
112 switch (type)
113 {
114 case GL_FLOAT:
115 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000116 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000117 return GL_BOOL;
118 case GL_FLOAT_VEC2:
119 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000120 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000121 return GL_BOOL_VEC2;
122 case GL_FLOAT_VEC3:
123 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000124 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000125 return GL_BOOL_VEC3;
126 case GL_FLOAT_VEC4:
127 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000128 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000129 return GL_BOOL_VEC4;
130
131 default:
132 UNREACHABLE();
133 return GL_NONE;
134 }
135}
136
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000137int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000138{
139 switch (type)
140 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000141 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400142 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000143 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000144 case GL_BOOL:
145 case GL_FLOAT:
146 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000147 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000148 case GL_BOOL_VEC2:
149 case GL_FLOAT_VEC2:
150 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000151 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000152 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000153 case GL_FLOAT_VEC3:
154 case GL_INT_VEC3:
155 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000156 case GL_BOOL_VEC4:
157 case GL_FLOAT_VEC4:
158 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000159 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000160 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400161 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000162 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400163 case GL_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400164 case GL_SAMPLER_EXTERNAL_OES:
165 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400166 case GL_INT_SAMPLER_2D:
167 case GL_INT_SAMPLER_3D:
168 case GL_INT_SAMPLER_CUBE:
169 case GL_INT_SAMPLER_2D_ARRAY:
170 case GL_UNSIGNED_INT_SAMPLER_2D:
171 case GL_UNSIGNED_INT_SAMPLER_3D:
172 case GL_UNSIGNED_INT_SAMPLER_CUBE:
173 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400174 case GL_SAMPLER_2D_SHADOW:
175 case GL_SAMPLER_CUBE_SHADOW:
176 case GL_SAMPLER_2D_ARRAY_SHADOW:
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:
Jamie Madill66192b32013-09-09 15:41:37 -0400202 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000203 return 0;
204 case GL_BOOL:
205 case GL_FLOAT:
206 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000207 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000208 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400209 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +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:
Jamie Madillaa72d782014-07-02 15:31:19 -0400216 case GL_SAMPLER_EXTERNAL_OES:
217 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400218 case GL_UNSIGNED_INT_SAMPLER_2D:
219 case GL_UNSIGNED_INT_SAMPLER_3D:
220 case GL_UNSIGNED_INT_SAMPLER_CUBE:
221 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400222 case GL_SAMPLER_2D_SHADOW:
223 case GL_SAMPLER_CUBE_SHADOW:
224 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000225 return 1;
226 case GL_BOOL_VEC2:
227 case GL_FLOAT_VEC2:
228 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000229 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000230 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000231 case GL_FLOAT_MAT2x3:
232 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000233 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000234 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000235 case GL_FLOAT_VEC3:
236 case GL_INT_VEC3:
237 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000238 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000239 case GL_FLOAT_MAT3x2:
240 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000241 return 3;
242 case GL_BOOL_VEC4:
243 case GL_FLOAT_VEC4:
244 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000245 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000246 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000247 case GL_FLOAT_MAT4x2:
248 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000249 return 4;
250 default:
251 UNREACHABLE();
252 }
253
254 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000255}
256
Nicolas Capense6050882013-07-08 10:43:10 -0400257bool IsSampler(GLenum type)
258{
259 switch (type)
260 {
261 case GL_SAMPLER_2D:
262 case GL_SAMPLER_3D:
263 case GL_SAMPLER_CUBE:
264 case GL_SAMPLER_2D_ARRAY:
265 case GL_INT_SAMPLER_2D:
266 case GL_INT_SAMPLER_3D:
267 case GL_INT_SAMPLER_CUBE:
268 case GL_INT_SAMPLER_2D_ARRAY:
269 case GL_UNSIGNED_INT_SAMPLER_2D:
270 case GL_UNSIGNED_INT_SAMPLER_3D:
271 case GL_UNSIGNED_INT_SAMPLER_CUBE:
272 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400273 case GL_SAMPLER_2D_SHADOW:
274 case GL_SAMPLER_CUBE_SHADOW:
275 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400276 return true;
277 }
278
279 return false;
280}
281
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000282bool IsMatrixType(GLenum type)
283{
284 return VariableRowCount(type) > 1;
285}
286
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000287GLenum TransposeMatrixType(GLenum type)
288{
289 if (!IsMatrixType(type))
290 {
291 return type;
292 }
293
294 switch (type)
295 {
296 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
297 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
298 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
299 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
300 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
301 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
302 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
303 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
304 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
305 default: UNREACHABLE(); return GL_NONE;
306 }
307}
308
Jamie Madill8c6befc2013-06-20 11:55:55 -0400309int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
310{
311 ASSERT(IsMatrixType(type));
312 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
313}
314
315int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
316{
317 ASSERT(IsMatrixType(type));
318 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
319}
320
Jamie Madillf2575982014-06-25 16:04:54 -0400321int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000322{
323 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
324}
325
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000326int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
327{
328 ASSERT(allocationSize <= bitsSize);
329
330 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
331
332 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
333 {
334 if ((*bits & mask) == 0)
335 {
336 *bits |= mask;
337 return i;
338 }
339
340 mask <<= 1;
341 }
342
343 return -1;
344}
345
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000346bool IsCubemapTextureTarget(GLenum target)
347{
348 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
349}
350
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000351bool IsTriangleMode(GLenum drawMode)
352{
353 switch (drawMode)
354 {
355 case GL_TRIANGLES:
356 case GL_TRIANGLE_FAN:
357 case GL_TRIANGLE_STRIP:
358 return true;
359 case GL_POINTS:
360 case GL_LINES:
361 case GL_LINE_LOOP:
362 case GL_LINE_STRIP:
363 return false;
364 default: UNREACHABLE();
365 }
366
367 return false;
368}
369
Jamie Madill865d1452014-07-02 15:31:20 -0400370// [OpenGL ES SL 3.00.4] Section 11 p. 120
371// Vertex Outs/Fragment Ins packing priorities
372int VariableSortOrder(GLenum type)
373{
374 switch (type)
375 {
376 // 1. Arrays of mat4 and mat4
377 // Non-square matrices of type matCxR consume the same space as a square
378 // matrix of type matN where N is the greater of C and R
379 case GL_FLOAT_MAT4:
380 case GL_FLOAT_MAT2x4:
381 case GL_FLOAT_MAT3x4:
382 case GL_FLOAT_MAT4x2:
383 case GL_FLOAT_MAT4x3:
384 return 0;
385
386 // 2. Arrays of mat2 and mat2 (since they occupy full rows)
387 case GL_FLOAT_MAT2:
388 return 1;
389
390 // 3. Arrays of vec4 and vec4
391 case GL_FLOAT_VEC4:
392 case GL_INT_VEC4:
393 case GL_BOOL_VEC4:
394 case GL_UNSIGNED_INT_VEC4:
395 return 2;
396
397 // 4. Arrays of mat3 and mat3
398 case GL_FLOAT_MAT3:
399 case GL_FLOAT_MAT2x3:
400 case GL_FLOAT_MAT3x2:
401 return 3;
402
403 // 5. Arrays of vec3 and vec3
404 case GL_FLOAT_VEC3:
405 case GL_INT_VEC3:
406 case GL_BOOL_VEC3:
407 case GL_UNSIGNED_INT_VEC3:
408 return 4;
409
410 // 6. Arrays of vec2 and vec2
411 case GL_FLOAT_VEC2:
412 case GL_INT_VEC2:
413 case GL_BOOL_VEC2:
414 case GL_UNSIGNED_INT_VEC2:
415 return 5;
416
417 // 7. Single component types
418 case GL_FLOAT:
419 case GL_INT:
420 case GL_BOOL:
421 case GL_UNSIGNED_INT:
422 case GL_SAMPLER_2D:
423 case GL_SAMPLER_CUBE:
424 case GL_SAMPLER_EXTERNAL_OES:
425 case GL_SAMPLER_2D_RECT_ARB:
426 case GL_SAMPLER_2D_ARRAY:
427 case GL_SAMPLER_3D:
428 case GL_INT_SAMPLER_2D:
429 case GL_INT_SAMPLER_3D:
430 case GL_INT_SAMPLER_CUBE:
431 case GL_INT_SAMPLER_2D_ARRAY:
432 case GL_UNSIGNED_INT_SAMPLER_2D:
433 case GL_UNSIGNED_INT_SAMPLER_3D:
434 case GL_UNSIGNED_INT_SAMPLER_CUBE:
435 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
436 case GL_SAMPLER_2D_SHADOW:
437 case GL_SAMPLER_2D_ARRAY_SHADOW:
438 case GL_SAMPLER_CUBE_SHADOW:
439 return 6;
440
441 default:
442 UNREACHABLE();
443 return 0;
444 }
445}
446
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000447}
448
Austin Kinross922a9fb2014-10-21 14:26:33 -0700449#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000450std::string getTempPath()
451{
Shannon Woodsfb839472014-06-16 13:21:41 -0400452#ifdef ANGLE_PLATFORM_WINDOWS
Austin Kinross922a9fb2014-10-21 14:26:33 -0700453 char path[MAX_PATH];
454 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
455 if (pathLen == 0)
456 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000457 UNREACHABLE();
458 return std::string();
Austin Kinross922a9fb2014-10-21 14:26:33 -0700459 }
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000460
Austin Kinross922a9fb2014-10-21 14:26:33 -0700461 UINT unique = GetTempFileNameA(path, "sh", 0, path);
462 if (unique == 0)
463 {
464 UNREACHABLE();
465 return std::string();
466 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000467
Austin Kinross922a9fb2014-10-21 14:26:33 -0700468 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500469#else
470 UNIMPLEMENTED();
471 return "";
472#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000473}
474
475void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000476{
477 FILE* file = fopen(path, "w");
478 if (!file)
479 {
480 UNREACHABLE();
481 return;
482 }
483
484 fwrite(content, sizeof(char), size, file);
485 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000486}
Austin Kinross922a9fb2014-10-21 14:26:33 -0700487#endif // !ANGLE_ENABLE_WINDOWS_STORE
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700488
489#if defined(ANGLE_ENABLE_WINDOWS_STORE)
490
491void Sleep(unsigned long dwMilliseconds)
492{
493 static HANDLE singletonEvent = nullptr;
494 HANDLE sleepEvent = singletonEvent;
495 if (!sleepEvent)
496 {
497 sleepEvent = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
498
499 if (!sleepEvent)
500 return;
501
502 HANDLE previousEvent = InterlockedCompareExchangePointerRelease(&singletonEvent, sleepEvent, nullptr);
503
504 if (previousEvent)
505 {
506 // Back out if multiple threads try to demand create at the same time.
507 CloseHandle(sleepEvent);
508 sleepEvent = previousEvent;
509 }
510 }
511
512 // Emulate sleep by waiting with timeout on an event that is never signalled.
513 WaitForSingleObjectEx(sleepEvent, dwMilliseconds, false);
514}
515
Austin Kinross922a9fb2014-10-21 14:26:33 -0700516#endif // ANGLE_ENABLE_WINDOWS_STORE