blob: d0db43eb6977b6582c96a62e677493fed60b0971 [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
Geoff Lang3edfe032015-09-04 16:38:24 -040022namespace
23{
24
25template <class IndexType>
26gl::IndexRange ComputeTypedIndexRange(const IndexType *indices,
27 size_t count,
28 bool primitiveRestartEnabled,
29 GLuint primitiveRestartIndex)
30{
31 ASSERT(count > 0);
32
33 IndexType minIndex = 0;
34 IndexType maxIndex = 0;
35 size_t nonPrimitiveRestartIndices = 0;
36
37 if (primitiveRestartEnabled)
38 {
39 // Find the first non-primitive restart index to initialize the min and max values
40 size_t i = 0;
41 for (; i < count; i++)
42 {
43 if (indices[i] != primitiveRestartIndex)
44 {
45 minIndex = indices[i];
46 maxIndex = indices[i];
47 nonPrimitiveRestartIndices++;
48 break;
49 }
50 }
51
52 // Loop over the rest of the indices
53 for (; i < count; i++)
54 {
55 if (indices[i] != primitiveRestartIndex)
56 {
57 if (minIndex > indices[i])
58 {
59 minIndex = indices[i];
60 }
61 if (maxIndex < indices[i])
62 {
63 maxIndex = indices[i];
64 }
65 nonPrimitiveRestartIndices++;
66 }
67 }
68 }
69 else
70 {
71 minIndex = indices[0];
72 maxIndex = indices[0];
73 nonPrimitiveRestartIndices = count;
74
75 for (size_t i = 1; i < count; i++)
76 {
77 if (minIndex > indices[i])
78 {
79 minIndex = indices[i];
80 }
81 if (maxIndex < indices[i])
82 {
83 maxIndex = indices[i];
84 }
85 }
86 }
87
88 return gl::IndexRange(static_cast<size_t>(minIndex), static_cast<size_t>(maxIndex),
89 nonPrimitiveRestartIndices);
90}
91
92} // anonymous namespace
93
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000094namespace gl
95{
96
Jamie Madillf2575982014-06-25 16:04:54 -040097int VariableComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000098{
Jamie Madillaa72d782014-07-02 15:31:19 -040099 return VariableRowCount(type) * VariableColumnCount(type);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000100}
101
Jamie Madillf2575982014-06-25 16:04:54 -0400102GLenum VariableComponentType(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000103{
104 switch(type)
105 {
106 case GL_BOOL:
107 case GL_BOOL_VEC2:
108 case GL_BOOL_VEC3:
109 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400110 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000111 case GL_FLOAT:
112 case GL_FLOAT_VEC2:
113 case GL_FLOAT_VEC3:
114 case GL_FLOAT_VEC4:
115 case GL_FLOAT_MAT2:
116 case GL_FLOAT_MAT3:
117 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +0000118 case GL_FLOAT_MAT2x3:
119 case GL_FLOAT_MAT3x2:
120 case GL_FLOAT_MAT2x4:
121 case GL_FLOAT_MAT4x2:
122 case GL_FLOAT_MAT3x4:
123 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -0400124 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000125 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000126 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400127 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000128 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400129 case GL_SAMPLER_2D_ARRAY:
Ian Ewellbda75592016-04-18 17:25:54 -0400130 case GL_SAMPLER_EXTERNAL_OES:
JiangYizhou40219322016-12-09 09:50:51 +0800131 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400132 case GL_INT_SAMPLER_2D:
133 case GL_INT_SAMPLER_3D:
134 case GL_INT_SAMPLER_CUBE:
135 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800136 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400137 case GL_UNSIGNED_INT_SAMPLER_2D:
138 case GL_UNSIGNED_INT_SAMPLER_3D:
139 case GL_UNSIGNED_INT_SAMPLER_CUBE:
140 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800141 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400142 case GL_SAMPLER_2D_SHADOW:
143 case GL_SAMPLER_CUBE_SHADOW:
144 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000145 case GL_INT_VEC2:
146 case GL_INT_VEC3:
147 case GL_INT_VEC4:
Olli Etuahoceb10482017-02-13 12:31:03 +0000148 case GL_IMAGE_2D:
149 case GL_INT_IMAGE_2D:
150 case GL_UNSIGNED_INT_IMAGE_2D:
151 case GL_IMAGE_3D:
152 case GL_INT_IMAGE_3D:
153 case GL_UNSIGNED_INT_IMAGE_3D:
154 case GL_IMAGE_2D_ARRAY:
155 case GL_INT_IMAGE_2D_ARRAY:
156 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
157 case GL_IMAGE_CUBE:
158 case GL_INT_IMAGE_CUBE:
159 case GL_UNSIGNED_INT_IMAGE_CUBE:
jchen104cdac9e2017-05-08 11:01:20 +0800160 case GL_UNSIGNED_INT_ATOMIC_COUNTER:
Olli Etuahoceb10482017-02-13 12:31:03 +0000161 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000162 case GL_UNSIGNED_INT:
163 case GL_UNSIGNED_INT_VEC2:
164 case GL_UNSIGNED_INT_VEC3:
165 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400166 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000167 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400168 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000169 }
170
171 return GL_NONE;
172}
173
Jamie Madillf2575982014-06-25 16:04:54 -0400174size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000175{
176 switch(type)
177 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000178 case GL_BOOL: return sizeof(GLint);
179 case GL_FLOAT: return sizeof(GLfloat);
180 case GL_INT: return sizeof(GLint);
181 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000182 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000183 }
184
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000185 return 0;
186}
187
Jamie Madillf2575982014-06-25 16:04:54 -0400188size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000189{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000190 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -0400191 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000192}
193
Jamie Madillf2575982014-06-25 16:04:54 -0400194size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000195{
Jamie Madillf2575982014-06-25 16:04:54 -0400196 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000197}
198
Jamie Madillf2575982014-06-25 16:04:54 -0400199GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000200{
201 switch (type)
202 {
203 case GL_FLOAT:
204 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000205 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000206 return GL_BOOL;
207 case GL_FLOAT_VEC2:
208 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000209 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000210 return GL_BOOL_VEC2;
211 case GL_FLOAT_VEC3:
212 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000213 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000214 return GL_BOOL_VEC3;
215 case GL_FLOAT_VEC4:
216 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000217 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000218 return GL_BOOL_VEC4;
219
220 default:
221 UNREACHABLE();
222 return GL_NONE;
223 }
224}
225
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000226int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000227{
228 switch (type)
229 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000230 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400231 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000232 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000233 case GL_BOOL:
234 case GL_FLOAT:
235 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000236 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000237 case GL_BOOL_VEC2:
238 case GL_FLOAT_VEC2:
239 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000240 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000241 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000242 case GL_FLOAT_VEC3:
243 case GL_INT_VEC3:
244 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000245 case GL_BOOL_VEC4:
246 case GL_FLOAT_VEC4:
247 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000248 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000249 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400250 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000251 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400252 case GL_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400253 case GL_SAMPLER_EXTERNAL_OES:
254 case GL_SAMPLER_2D_RECT_ARB:
JiangYizhou40219322016-12-09 09:50:51 +0800255 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400256 case GL_INT_SAMPLER_2D:
257 case GL_INT_SAMPLER_3D:
258 case GL_INT_SAMPLER_CUBE:
259 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800260 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400261 case GL_UNSIGNED_INT_SAMPLER_2D:
262 case GL_UNSIGNED_INT_SAMPLER_3D:
263 case GL_UNSIGNED_INT_SAMPLER_CUBE:
264 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800265 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
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:
Martin Radev2cc85b32016-08-05 16:22:53 +0300269 case GL_IMAGE_2D:
270 case GL_INT_IMAGE_2D:
271 case GL_UNSIGNED_INT_IMAGE_2D:
272 case GL_IMAGE_2D_ARRAY:
273 case GL_INT_IMAGE_2D_ARRAY:
274 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
275 case GL_IMAGE_3D:
276 case GL_INT_IMAGE_3D:
277 case GL_UNSIGNED_INT_IMAGE_3D:
278 case GL_IMAGE_CUBE:
279 case GL_INT_IMAGE_CUBE:
280 case GL_UNSIGNED_INT_IMAGE_CUBE:
jchen104cdac9e2017-05-08 11:01:20 +0800281 case GL_UNSIGNED_INT_ATOMIC_COUNTER:
Martin Radev2cc85b32016-08-05 16:22:53 +0300282 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000283 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000284 case GL_FLOAT_MAT3x2:
285 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000286 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000287 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000288 case GL_FLOAT_MAT2x3:
289 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000290 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000291 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000292 case GL_FLOAT_MAT2x4:
293 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000294 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000295 default:
296 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000297 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000298
299 return 0;
300}
301
302int VariableColumnCount(GLenum type)
303{
304 switch (type)
305 {
306 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400307 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000308 return 0;
309 case GL_BOOL:
310 case GL_FLOAT:
311 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000312 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000313 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400314 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000315 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400316 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800317 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400318 case GL_INT_SAMPLER_2D:
319 case GL_INT_SAMPLER_3D:
320 case GL_INT_SAMPLER_CUBE:
321 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800322 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madillaa72d782014-07-02 15:31:19 -0400323 case GL_SAMPLER_EXTERNAL_OES:
324 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400325 case GL_UNSIGNED_INT_SAMPLER_2D:
326 case GL_UNSIGNED_INT_SAMPLER_3D:
327 case GL_UNSIGNED_INT_SAMPLER_CUBE:
328 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800329 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400330 case GL_SAMPLER_2D_SHADOW:
331 case GL_SAMPLER_CUBE_SHADOW:
332 case GL_SAMPLER_2D_ARRAY_SHADOW:
Olli Etuahoceb10482017-02-13 12:31:03 +0000333 case GL_IMAGE_2D:
334 case GL_INT_IMAGE_2D:
335 case GL_UNSIGNED_INT_IMAGE_2D:
336 case GL_IMAGE_3D:
337 case GL_INT_IMAGE_3D:
338 case GL_UNSIGNED_INT_IMAGE_3D:
339 case GL_IMAGE_2D_ARRAY:
340 case GL_INT_IMAGE_2D_ARRAY:
341 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
342 case GL_IMAGE_CUBE:
343 case GL_INT_IMAGE_CUBE:
344 case GL_UNSIGNED_INT_IMAGE_CUBE:
jchen104cdac9e2017-05-08 11:01:20 +0800345 case GL_UNSIGNED_INT_ATOMIC_COUNTER:
Olli Etuahoceb10482017-02-13 12:31:03 +0000346 return 1;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000347 case GL_BOOL_VEC2:
348 case GL_FLOAT_VEC2:
349 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000350 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000351 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000352 case GL_FLOAT_MAT2x3:
353 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000354 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000355 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000356 case GL_FLOAT_VEC3:
357 case GL_INT_VEC3:
358 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000359 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000360 case GL_FLOAT_MAT3x2:
361 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000362 return 3;
363 case GL_BOOL_VEC4:
364 case GL_FLOAT_VEC4:
365 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000366 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000367 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000368 case GL_FLOAT_MAT4x2:
369 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000370 return 4;
371 default:
372 UNREACHABLE();
373 }
374
375 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000376}
377
Geoff Lang2ec386b2014-12-03 14:44:38 -0500378bool IsSamplerType(GLenum type)
Nicolas Capense6050882013-07-08 10:43:10 -0400379{
380 switch (type)
381 {
382 case GL_SAMPLER_2D:
383 case GL_SAMPLER_3D:
384 case GL_SAMPLER_CUBE:
385 case GL_SAMPLER_2D_ARRAY:
Ian Ewellbda75592016-04-18 17:25:54 -0400386 case GL_SAMPLER_EXTERNAL_OES:
JiangYizhou40219322016-12-09 09:50:51 +0800387 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400388 case GL_INT_SAMPLER_2D:
389 case GL_INT_SAMPLER_3D:
390 case GL_INT_SAMPLER_CUBE:
391 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800392 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400393 case GL_UNSIGNED_INT_SAMPLER_2D:
394 case GL_UNSIGNED_INT_SAMPLER_3D:
395 case GL_UNSIGNED_INT_SAMPLER_CUBE:
396 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800397 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400398 case GL_SAMPLER_2D_SHADOW:
399 case GL_SAMPLER_CUBE_SHADOW:
400 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400401 return true;
402 }
403
404 return false;
405}
406
Olli Etuahoceb10482017-02-13 12:31:03 +0000407bool IsImageType(GLenum type)
408{
409 switch (type)
410 {
411 case GL_IMAGE_2D:
412 case GL_INT_IMAGE_2D:
413 case GL_UNSIGNED_INT_IMAGE_2D:
414 case GL_IMAGE_3D:
415 case GL_INT_IMAGE_3D:
416 case GL_UNSIGNED_INT_IMAGE_3D:
417 case GL_IMAGE_2D_ARRAY:
418 case GL_INT_IMAGE_2D_ARRAY:
419 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
420 case GL_IMAGE_CUBE:
421 case GL_INT_IMAGE_CUBE:
422 case GL_UNSIGNED_INT_IMAGE_CUBE:
423 return true;
424 }
425 return false;
426}
427
jchen104cdac9e2017-05-08 11:01:20 +0800428bool IsAtomicCounterType(GLenum type)
429{
430 return type == GL_UNSIGNED_INT_ATOMIC_COUNTER;
431}
432
Olli Etuahoceb10482017-02-13 12:31:03 +0000433bool IsOpaqueType(GLenum type)
434{
435 // ESSL 3.10 section 4.1.7 defines opaque types as: samplers, images and atomic counters.
jchen104cdac9e2017-05-08 11:01:20 +0800436 return IsImageType(type) || IsSamplerType(type) || IsAtomicCounterType(type);
Olli Etuahoceb10482017-02-13 12:31:03 +0000437}
438
Geoff Langf51bc792015-05-04 14:57:03 -0400439GLenum SamplerTypeToTextureType(GLenum samplerType)
440{
441 switch (samplerType)
442 {
443 case GL_SAMPLER_2D:
444 case GL_INT_SAMPLER_2D:
445 case GL_UNSIGNED_INT_SAMPLER_2D:
446 case GL_SAMPLER_2D_SHADOW:
447 return GL_TEXTURE_2D;
448
Ian Ewellbda75592016-04-18 17:25:54 -0400449 case GL_SAMPLER_EXTERNAL_OES:
450 return GL_TEXTURE_EXTERNAL_OES;
451
Geoff Langf51bc792015-05-04 14:57:03 -0400452 case GL_SAMPLER_CUBE:
453 case GL_INT_SAMPLER_CUBE:
454 case GL_UNSIGNED_INT_SAMPLER_CUBE:
455 case GL_SAMPLER_CUBE_SHADOW:
456 return GL_TEXTURE_CUBE_MAP;
457
458 case GL_SAMPLER_2D_ARRAY:
459 case GL_INT_SAMPLER_2D_ARRAY:
460 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
461 case GL_SAMPLER_2D_ARRAY_SHADOW:
462 return GL_TEXTURE_2D_ARRAY;
463
464 case GL_SAMPLER_3D:
465 case GL_INT_SAMPLER_3D:
466 case GL_UNSIGNED_INT_SAMPLER_3D:
467 return GL_TEXTURE_3D;
468
JiangYizhou40219322016-12-09 09:50:51 +0800469 case GL_SAMPLER_2D_MULTISAMPLE:
470 case GL_INT_SAMPLER_2D_MULTISAMPLE:
471 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
472 return GL_TEXTURE_2D_MULTISAMPLE;
473
Geoff Langf51bc792015-05-04 14:57:03 -0400474 default:
475 UNREACHABLE();
476 return 0;
477 }
478}
479
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000480bool IsMatrixType(GLenum type)
481{
482 return VariableRowCount(type) > 1;
483}
484
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000485GLenum TransposeMatrixType(GLenum type)
486{
487 if (!IsMatrixType(type))
488 {
489 return type;
490 }
491
492 switch (type)
493 {
494 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
495 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
496 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
497 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
498 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
499 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
500 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
501 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
502 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
503 default: UNREACHABLE(); return GL_NONE;
504 }
505}
506
Jamie Madill8c6befc2013-06-20 11:55:55 -0400507int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
508{
509 ASSERT(IsMatrixType(type));
510 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
511}
512
513int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
514{
515 ASSERT(IsMatrixType(type));
516 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
517}
518
Jamie Madillf2575982014-06-25 16:04:54 -0400519int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000520{
521 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
522}
523
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000524int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
525{
526 ASSERT(allocationSize <= bitsSize);
527
528 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
529
530 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
531 {
532 if ((*bits & mask) == 0)
533 {
534 *bits |= mask;
535 return i;
536 }
537
538 mask <<= 1;
539 }
540
541 return -1;
542}
543
Geoff Langd4475812015-03-18 10:53:05 -0400544static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1, "Unexpected GL cube map enum value.");
545static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2, "Unexpected GL cube map enum value.");
546static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3, "Unexpected GL cube map enum value.");
547static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4, "Unexpected GL cube map enum value.");
548static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5, "Unexpected GL cube map enum value.");
Geoff Lang691e58c2014-12-19 17:03:25 -0500549
550bool IsCubeMapTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000551{
Geoff Lang691e58c2014-12-19 17:03:25 -0500552 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
553}
554
555size_t CubeMapTextureTargetToLayerIndex(GLenum target)
556{
557 ASSERT(IsCubeMapTextureTarget(target));
558 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
559}
560
561GLenum LayerIndexToCubeMapTextureTarget(size_t index)
562{
563 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
564 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000565}
566
Geoff Lang3edfe032015-09-04 16:38:24 -0400567IndexRange ComputeIndexRange(GLenum indexType,
568 const GLvoid *indices,
569 size_t count,
570 bool primitiveRestartEnabled)
Geoff Lang831b1952015-05-05 11:02:27 -0400571{
572 switch (indexType)
573 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400574 case GL_UNSIGNED_BYTE:
575 return ComputeTypedIndexRange(static_cast<const GLubyte *>(indices), count,
576 primitiveRestartEnabled,
577 GetPrimitiveRestartIndex(indexType));
578 case GL_UNSIGNED_SHORT:
579 return ComputeTypedIndexRange(static_cast<const GLushort *>(indices), count,
580 primitiveRestartEnabled,
581 GetPrimitiveRestartIndex(indexType));
582 case GL_UNSIGNED_INT:
583 return ComputeTypedIndexRange(static_cast<const GLuint *>(indices), count,
584 primitiveRestartEnabled,
585 GetPrimitiveRestartIndex(indexType));
586 default:
587 UNREACHABLE();
588 return IndexRange();
589 }
590}
591
592GLuint GetPrimitiveRestartIndex(GLenum indexType)
593{
594 switch (indexType)
595 {
596 case GL_UNSIGNED_BYTE:
597 return 0xFF;
598 case GL_UNSIGNED_SHORT:
599 return 0xFFFF;
600 case GL_UNSIGNED_INT:
601 return 0xFFFFFFFF;
602 default:
603 UNREACHABLE();
604 return 0;
Geoff Lang831b1952015-05-05 11:02:27 -0400605 }
606}
607
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000608bool IsTriangleMode(GLenum drawMode)
609{
610 switch (drawMode)
611 {
612 case GL_TRIANGLES:
613 case GL_TRIANGLE_FAN:
614 case GL_TRIANGLE_STRIP:
615 return true;
616 case GL_POINTS:
617 case GL_LINES:
618 case GL_LINE_LOOP:
619 case GL_LINE_STRIP:
620 return false;
621 default: UNREACHABLE();
622 }
623
624 return false;
625}
626
Geoff Lang4f0e0032017-05-01 16:04:35 -0400627bool IsIntegerFormat(GLenum unsizedFormat)
628{
629 switch (unsizedFormat)
630 {
631 case GL_RGBA_INTEGER:
632 case GL_RGB_INTEGER:
633 case GL_RG_INTEGER:
634 case GL_RED_INTEGER:
635 return true;
636
637 default:
638 return false;
639 }
640}
641
Jamie Madill865d1452014-07-02 15:31:20 -0400642// [OpenGL ES SL 3.00.4] Section 11 p. 120
643// Vertex Outs/Fragment Ins packing priorities
644int VariableSortOrder(GLenum type)
645{
646 switch (type)
647 {
648 // 1. Arrays of mat4 and mat4
649 // Non-square matrices of type matCxR consume the same space as a square
650 // matrix of type matN where N is the greater of C and R
651 case GL_FLOAT_MAT4:
652 case GL_FLOAT_MAT2x4:
653 case GL_FLOAT_MAT3x4:
654 case GL_FLOAT_MAT4x2:
655 case GL_FLOAT_MAT4x3:
656 return 0;
657
658 // 2. Arrays of mat2 and mat2 (since they occupy full rows)
659 case GL_FLOAT_MAT2:
660 return 1;
661
662 // 3. Arrays of vec4 and vec4
663 case GL_FLOAT_VEC4:
664 case GL_INT_VEC4:
665 case GL_BOOL_VEC4:
666 case GL_UNSIGNED_INT_VEC4:
667 return 2;
668
669 // 4. Arrays of mat3 and mat3
670 case GL_FLOAT_MAT3:
671 case GL_FLOAT_MAT2x3:
672 case GL_FLOAT_MAT3x2:
673 return 3;
674
675 // 5. Arrays of vec3 and vec3
676 case GL_FLOAT_VEC3:
677 case GL_INT_VEC3:
678 case GL_BOOL_VEC3:
679 case GL_UNSIGNED_INT_VEC3:
680 return 4;
681
682 // 6. Arrays of vec2 and vec2
683 case GL_FLOAT_VEC2:
684 case GL_INT_VEC2:
685 case GL_BOOL_VEC2:
686 case GL_UNSIGNED_INT_VEC2:
687 return 5;
688
689 // 7. Single component types
690 case GL_FLOAT:
691 case GL_INT:
692 case GL_BOOL:
693 case GL_UNSIGNED_INT:
694 case GL_SAMPLER_2D:
695 case GL_SAMPLER_CUBE:
696 case GL_SAMPLER_EXTERNAL_OES:
697 case GL_SAMPLER_2D_RECT_ARB:
698 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800699 case GL_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400700 case GL_SAMPLER_3D:
701 case GL_INT_SAMPLER_2D:
702 case GL_INT_SAMPLER_3D:
703 case GL_INT_SAMPLER_CUBE:
704 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800705 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400706 case GL_UNSIGNED_INT_SAMPLER_2D:
707 case GL_UNSIGNED_INT_SAMPLER_3D:
708 case GL_UNSIGNED_INT_SAMPLER_CUBE:
709 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800710 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400711 case GL_SAMPLER_2D_SHADOW:
712 case GL_SAMPLER_2D_ARRAY_SHADOW:
713 case GL_SAMPLER_CUBE_SHADOW:
714 return 6;
715
716 default:
717 UNREACHABLE();
718 return 0;
719 }
720}
721
jchen1015015f72017-03-16 13:54:21 +0800722std::string ParseResourceName(const std::string &name, size_t *outSubscript)
Geoff Langcfaeaa92015-04-14 13:41:02 -0400723{
724 // Strip any trailing array operator and retrieve the subscript
725 size_t open = name.find_last_of('[');
726 size_t close = name.find_last_of(']');
727 bool hasIndex = (open != std::string::npos) && (close == name.length() - 1);
728 if (!hasIndex)
729 {
730 if (outSubscript)
731 {
732 *outSubscript = GL_INVALID_INDEX;
733 }
734 return name;
735 }
736
737 if (outSubscript)
738 {
739 int index = atoi(name.substr(open + 1).c_str());
740 if (index >= 0)
741 {
742 *outSubscript = index;
743 }
744 else
745 {
746 *outSubscript = GL_INVALID_INDEX;
747 }
748 }
749
750 return name.substr(0, open);
751}
752
Geoff Langc1984ed2016-10-07 12:41:00 -0400753template <>
754GLuint ConvertToGLuint(GLfloat param)
755{
756 return uiround<GLuint>(param);
757}
758
759template <>
760GLint ConvertToGLint(GLfloat param)
761{
762 return iround<GLint>(param);
763}
764
765template <>
766GLint ConvertFromGLfloat(GLfloat param)
767{
768 return iround<GLint>(param);
769}
770template <>
771GLuint ConvertFromGLfloat(GLfloat param)
772{
773 return uiround<GLuint>(param);
774}
775
Jamie Madill4a3c2342015-10-08 12:58:45 -0400776unsigned int ParseAndStripArrayIndex(std::string *name)
777{
778 unsigned int subscript = GL_INVALID_INDEX;
779
780 // Strip any trailing array operator and retrieve the subscript
781 size_t open = name->find_last_of('[');
782 size_t close = name->find_last_of(']');
783 if (open != std::string::npos && close == name->length() - 1)
784 {
785 subscript = atoi(name->c_str() + open + 1);
786 name->erase(open);
787 }
788
789 return subscript;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000790}
791
Jamie Madill4a3c2342015-10-08 12:58:45 -0400792} // namespace gl
793
Geoff Langa8406172015-07-21 16:53:39 -0400794namespace egl
795{
796static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 1,
797 "Unexpected EGL cube map enum value.");
798static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 2,
799 "Unexpected EGL cube map enum value.");
800static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 3,
801 "Unexpected EGL cube map enum value.");
802static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 4,
803 "Unexpected EGL cube map enum value.");
804static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 5,
805 "Unexpected EGL cube map enum value.");
806
807bool IsCubeMapTextureTarget(EGLenum target)
808{
809 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
810}
811
812size_t CubeMapTextureTargetToLayerIndex(EGLenum target)
813{
814 ASSERT(IsCubeMapTextureTarget(target));
815 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
816}
817
818EGLenum LayerIndexToCubeMapTextureTarget(size_t index)
819{
820 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
821 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
822}
823
824bool IsTextureTarget(EGLenum target)
825{
826 switch (target)
827 {
828 case EGL_GL_TEXTURE_2D_KHR:
829 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
830 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
831 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
832 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
833 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
834 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
835 case EGL_GL_TEXTURE_3D_KHR:
836 return true;
837
838 default:
839 return false;
840 }
841}
842
843bool IsRenderbufferTarget(EGLenum target)
844{
845 return target == EGL_GL_RENDERBUFFER_KHR;
846}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400847} // namespace egl
Geoff Langa8406172015-07-21 16:53:39 -0400848
849namespace egl_gl
850{
851GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget)
852{
853 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
854 return gl::LayerIndexToCubeMapTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
855}
856
857GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget)
858{
859 switch (eglTarget)
860 {
861 case EGL_GL_TEXTURE_2D_KHR:
862 return GL_TEXTURE_2D;
863
864 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
865 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
866 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
867 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
868 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
869 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
870 return EGLCubeMapTargetToGLCubeMapTarget(eglTarget);
871
872 case EGL_GL_TEXTURE_3D_KHR:
873 return GL_TEXTURE_3D;
874
875 default:
876 UNREACHABLE();
877 return GL_NONE;
878 }
879}
880
881GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer)
882{
883 return static_cast<GLuint>(reinterpret_cast<uintptr_t>(buffer));
884}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400885} // namespace egl_gl
Geoff Langa8406172015-07-21 16:53:39 -0400886
Geoff Langc5a2a172017-01-13 15:55:07 -0500887namespace gl_egl
888{
889EGLenum GLComponentTypeToEGLColorComponentType(GLenum glComponentType)
890{
891 switch (glComponentType)
892 {
893 case GL_FLOAT:
894 return EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT;
895
896 case GL_UNSIGNED_NORMALIZED:
897 return EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
898
899 default:
900 UNREACHABLE();
901 return EGL_NONE;
902 }
903}
904} // namespace gl_egl
905
Austin Kinross922a9fb2014-10-21 14:26:33 -0700906#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000907std::string getTempPath()
908{
Shannon Woodsfb839472014-06-16 13:21:41 -0400909#ifdef ANGLE_PLATFORM_WINDOWS
Austin Kinross922a9fb2014-10-21 14:26:33 -0700910 char path[MAX_PATH];
911 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
912 if (pathLen == 0)
913 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000914 UNREACHABLE();
915 return std::string();
Austin Kinross922a9fb2014-10-21 14:26:33 -0700916 }
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000917
Austin Kinross922a9fb2014-10-21 14:26:33 -0700918 UINT unique = GetTempFileNameA(path, "sh", 0, path);
919 if (unique == 0)
920 {
921 UNREACHABLE();
922 return std::string();
923 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000924
Austin Kinross922a9fb2014-10-21 14:26:33 -0700925 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500926#else
927 UNIMPLEMENTED();
928 return "";
929#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000930}
931
932void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000933{
934 FILE* file = fopen(path, "w");
935 if (!file)
936 {
937 UNREACHABLE();
938 return;
939 }
940
941 fwrite(content, sizeof(char), size, file);
942 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000943}
Austin Kinross922a9fb2014-10-21 14:26:33 -0700944#endif // !ANGLE_ENABLE_WINDOWS_STORE
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700945
Cooper Partin1edac3b2014-11-20 13:49:27 -0800946#if defined (ANGLE_PLATFORM_WINDOWS)
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700947
Cooper Partin1edac3b2014-11-20 13:49:27 -0800948// Causes the thread to relinquish the remainder of its time slice to any
949// other thread that is ready to run.If there are no other threads ready
950// to run, the function returns immediately, and the thread continues execution.
951void ScheduleYield()
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700952{
Geoff Lange5f735f2015-09-17 13:26:59 -0400953 Sleep(0);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700954}
955
Kenneth Russellb23deb22014-11-21 14:53:56 -0800956#endif