blob: 95fa4c87dce42ef34f7b30d3d5927541754ecd42 [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:
160 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000161 case GL_UNSIGNED_INT:
162 case GL_UNSIGNED_INT_VEC2:
163 case GL_UNSIGNED_INT_VEC3:
164 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400165 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000166 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400167 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000168 }
169
170 return GL_NONE;
171}
172
Jamie Madillf2575982014-06-25 16:04:54 -0400173size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000174{
175 switch(type)
176 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000177 case GL_BOOL: return sizeof(GLint);
178 case GL_FLOAT: return sizeof(GLfloat);
179 case GL_INT: return sizeof(GLint);
180 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000181 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000182 }
183
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000184 return 0;
185}
186
Jamie Madillf2575982014-06-25 16:04:54 -0400187size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000188{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000189 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -0400190 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000191}
192
Jamie Madillf2575982014-06-25 16:04:54 -0400193size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000194{
Jamie Madillf2575982014-06-25 16:04:54 -0400195 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000196}
197
Jamie Madillf2575982014-06-25 16:04:54 -0400198GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000199{
200 switch (type)
201 {
202 case GL_FLOAT:
203 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000204 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000205 return GL_BOOL;
206 case GL_FLOAT_VEC2:
207 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000208 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000209 return GL_BOOL_VEC2;
210 case GL_FLOAT_VEC3:
211 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000212 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000213 return GL_BOOL_VEC3;
214 case GL_FLOAT_VEC4:
215 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000216 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000217 return GL_BOOL_VEC4;
218
219 default:
220 UNREACHABLE();
221 return GL_NONE;
222 }
223}
224
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000225int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000226{
227 switch (type)
228 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000229 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400230 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000231 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000232 case GL_BOOL:
233 case GL_FLOAT:
234 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000235 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000236 case GL_BOOL_VEC2:
237 case GL_FLOAT_VEC2:
238 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000239 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000240 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000241 case GL_FLOAT_VEC3:
242 case GL_INT_VEC3:
243 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000244 case GL_BOOL_VEC4:
245 case GL_FLOAT_VEC4:
246 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000247 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000248 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400249 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000250 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400251 case GL_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400252 case GL_SAMPLER_EXTERNAL_OES:
253 case GL_SAMPLER_2D_RECT_ARB:
JiangYizhou40219322016-12-09 09:50:51 +0800254 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400255 case GL_INT_SAMPLER_2D:
256 case GL_INT_SAMPLER_3D:
257 case GL_INT_SAMPLER_CUBE:
258 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800259 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400260 case GL_UNSIGNED_INT_SAMPLER_2D:
261 case GL_UNSIGNED_INT_SAMPLER_3D:
262 case GL_UNSIGNED_INT_SAMPLER_CUBE:
263 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800264 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400265 case GL_SAMPLER_2D_SHADOW:
266 case GL_SAMPLER_CUBE_SHADOW:
267 case GL_SAMPLER_2D_ARRAY_SHADOW:
Martin Radev2cc85b32016-08-05 16:22:53 +0300268 case GL_IMAGE_2D:
269 case GL_INT_IMAGE_2D:
270 case GL_UNSIGNED_INT_IMAGE_2D:
271 case GL_IMAGE_2D_ARRAY:
272 case GL_INT_IMAGE_2D_ARRAY:
273 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
274 case GL_IMAGE_3D:
275 case GL_INT_IMAGE_3D:
276 case GL_UNSIGNED_INT_IMAGE_3D:
277 case GL_IMAGE_CUBE:
278 case GL_INT_IMAGE_CUBE:
279 case GL_UNSIGNED_INT_IMAGE_CUBE:
280 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000281 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000282 case GL_FLOAT_MAT3x2:
283 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000284 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000285 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000286 case GL_FLOAT_MAT2x3:
287 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000288 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000289 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000290 case GL_FLOAT_MAT2x4:
291 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000292 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000293 default:
294 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000295 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000296
297 return 0;
298}
299
300int VariableColumnCount(GLenum type)
301{
302 switch (type)
303 {
304 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400305 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000306 return 0;
307 case GL_BOOL:
308 case GL_FLOAT:
309 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000310 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000311 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400312 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000313 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400314 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800315 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400316 case GL_INT_SAMPLER_2D:
317 case GL_INT_SAMPLER_3D:
318 case GL_INT_SAMPLER_CUBE:
319 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800320 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madillaa72d782014-07-02 15:31:19 -0400321 case GL_SAMPLER_EXTERNAL_OES:
322 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400323 case GL_UNSIGNED_INT_SAMPLER_2D:
324 case GL_UNSIGNED_INT_SAMPLER_3D:
325 case GL_UNSIGNED_INT_SAMPLER_CUBE:
326 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800327 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400328 case GL_SAMPLER_2D_SHADOW:
329 case GL_SAMPLER_CUBE_SHADOW:
330 case GL_SAMPLER_2D_ARRAY_SHADOW:
Olli Etuahoceb10482017-02-13 12:31:03 +0000331 case GL_IMAGE_2D:
332 case GL_INT_IMAGE_2D:
333 case GL_UNSIGNED_INT_IMAGE_2D:
334 case GL_IMAGE_3D:
335 case GL_INT_IMAGE_3D:
336 case GL_UNSIGNED_INT_IMAGE_3D:
337 case GL_IMAGE_2D_ARRAY:
338 case GL_INT_IMAGE_2D_ARRAY:
339 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
340 case GL_IMAGE_CUBE:
341 case GL_INT_IMAGE_CUBE:
342 case GL_UNSIGNED_INT_IMAGE_CUBE:
343 return 1;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000344 case GL_BOOL_VEC2:
345 case GL_FLOAT_VEC2:
346 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000347 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000348 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000349 case GL_FLOAT_MAT2x3:
350 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000351 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000352 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000353 case GL_FLOAT_VEC3:
354 case GL_INT_VEC3:
355 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000356 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000357 case GL_FLOAT_MAT3x2:
358 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000359 return 3;
360 case GL_BOOL_VEC4:
361 case GL_FLOAT_VEC4:
362 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000363 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000364 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000365 case GL_FLOAT_MAT4x2:
366 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000367 return 4;
368 default:
369 UNREACHABLE();
370 }
371
372 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000373}
374
Geoff Lang2ec386b2014-12-03 14:44:38 -0500375bool IsSamplerType(GLenum type)
Nicolas Capense6050882013-07-08 10:43:10 -0400376{
377 switch (type)
378 {
379 case GL_SAMPLER_2D:
380 case GL_SAMPLER_3D:
381 case GL_SAMPLER_CUBE:
382 case GL_SAMPLER_2D_ARRAY:
Ian Ewellbda75592016-04-18 17:25:54 -0400383 case GL_SAMPLER_EXTERNAL_OES:
JiangYizhou40219322016-12-09 09:50:51 +0800384 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400385 case GL_INT_SAMPLER_2D:
386 case GL_INT_SAMPLER_3D:
387 case GL_INT_SAMPLER_CUBE:
388 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800389 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400390 case GL_UNSIGNED_INT_SAMPLER_2D:
391 case GL_UNSIGNED_INT_SAMPLER_3D:
392 case GL_UNSIGNED_INT_SAMPLER_CUBE:
393 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800394 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400395 case GL_SAMPLER_2D_SHADOW:
396 case GL_SAMPLER_CUBE_SHADOW:
397 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400398 return true;
399 }
400
401 return false;
402}
403
Olli Etuahoceb10482017-02-13 12:31:03 +0000404bool IsImageType(GLenum type)
405{
406 switch (type)
407 {
408 case GL_IMAGE_2D:
409 case GL_INT_IMAGE_2D:
410 case GL_UNSIGNED_INT_IMAGE_2D:
411 case GL_IMAGE_3D:
412 case GL_INT_IMAGE_3D:
413 case GL_UNSIGNED_INT_IMAGE_3D:
414 case GL_IMAGE_2D_ARRAY:
415 case GL_INT_IMAGE_2D_ARRAY:
416 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
417 case GL_IMAGE_CUBE:
418 case GL_INT_IMAGE_CUBE:
419 case GL_UNSIGNED_INT_IMAGE_CUBE:
420 return true;
421 }
422 return false;
423}
424
425bool IsOpaqueType(GLenum type)
426{
427 // ESSL 3.10 section 4.1.7 defines opaque types as: samplers, images and atomic counters.
428 // TODO(oetuaho): add atomic types
429 return IsImageType(type) || IsSamplerType(type);
430}
431
Geoff Langf51bc792015-05-04 14:57:03 -0400432GLenum SamplerTypeToTextureType(GLenum samplerType)
433{
434 switch (samplerType)
435 {
436 case GL_SAMPLER_2D:
437 case GL_INT_SAMPLER_2D:
438 case GL_UNSIGNED_INT_SAMPLER_2D:
439 case GL_SAMPLER_2D_SHADOW:
440 return GL_TEXTURE_2D;
441
Ian Ewellbda75592016-04-18 17:25:54 -0400442 case GL_SAMPLER_EXTERNAL_OES:
443 return GL_TEXTURE_EXTERNAL_OES;
444
Geoff Langf51bc792015-05-04 14:57:03 -0400445 case GL_SAMPLER_CUBE:
446 case GL_INT_SAMPLER_CUBE:
447 case GL_UNSIGNED_INT_SAMPLER_CUBE:
448 case GL_SAMPLER_CUBE_SHADOW:
449 return GL_TEXTURE_CUBE_MAP;
450
451 case GL_SAMPLER_2D_ARRAY:
452 case GL_INT_SAMPLER_2D_ARRAY:
453 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
454 case GL_SAMPLER_2D_ARRAY_SHADOW:
455 return GL_TEXTURE_2D_ARRAY;
456
457 case GL_SAMPLER_3D:
458 case GL_INT_SAMPLER_3D:
459 case GL_UNSIGNED_INT_SAMPLER_3D:
460 return GL_TEXTURE_3D;
461
JiangYizhou40219322016-12-09 09:50:51 +0800462 case GL_SAMPLER_2D_MULTISAMPLE:
463 case GL_INT_SAMPLER_2D_MULTISAMPLE:
464 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
465 return GL_TEXTURE_2D_MULTISAMPLE;
466
Geoff Langf51bc792015-05-04 14:57:03 -0400467 default:
468 UNREACHABLE();
469 return 0;
470 }
471}
472
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000473bool IsMatrixType(GLenum type)
474{
475 return VariableRowCount(type) > 1;
476}
477
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000478GLenum TransposeMatrixType(GLenum type)
479{
480 if (!IsMatrixType(type))
481 {
482 return type;
483 }
484
485 switch (type)
486 {
487 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
488 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
489 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
490 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
491 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
492 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
493 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
494 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
495 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
496 default: UNREACHABLE(); return GL_NONE;
497 }
498}
499
Jamie Madill8c6befc2013-06-20 11:55:55 -0400500int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
501{
502 ASSERT(IsMatrixType(type));
503 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
504}
505
506int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
507{
508 ASSERT(IsMatrixType(type));
509 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
510}
511
Jamie Madillf2575982014-06-25 16:04:54 -0400512int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000513{
514 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
515}
516
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000517int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
518{
519 ASSERT(allocationSize <= bitsSize);
520
521 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
522
523 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
524 {
525 if ((*bits & mask) == 0)
526 {
527 *bits |= mask;
528 return i;
529 }
530
531 mask <<= 1;
532 }
533
534 return -1;
535}
536
Geoff Langd4475812015-03-18 10:53:05 -0400537static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1, "Unexpected GL cube map enum value.");
538static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2, "Unexpected GL cube map enum value.");
539static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3, "Unexpected GL cube map enum value.");
540static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4, "Unexpected GL cube map enum value.");
541static_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 -0500542
543bool IsCubeMapTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000544{
Geoff Lang691e58c2014-12-19 17:03:25 -0500545 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
546}
547
548size_t CubeMapTextureTargetToLayerIndex(GLenum target)
549{
550 ASSERT(IsCubeMapTextureTarget(target));
551 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
552}
553
554GLenum LayerIndexToCubeMapTextureTarget(size_t index)
555{
556 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
557 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000558}
559
Geoff Lang3edfe032015-09-04 16:38:24 -0400560IndexRange ComputeIndexRange(GLenum indexType,
561 const GLvoid *indices,
562 size_t count,
563 bool primitiveRestartEnabled)
Geoff Lang831b1952015-05-05 11:02:27 -0400564{
565 switch (indexType)
566 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400567 case GL_UNSIGNED_BYTE:
568 return ComputeTypedIndexRange(static_cast<const GLubyte *>(indices), count,
569 primitiveRestartEnabled,
570 GetPrimitiveRestartIndex(indexType));
571 case GL_UNSIGNED_SHORT:
572 return ComputeTypedIndexRange(static_cast<const GLushort *>(indices), count,
573 primitiveRestartEnabled,
574 GetPrimitiveRestartIndex(indexType));
575 case GL_UNSIGNED_INT:
576 return ComputeTypedIndexRange(static_cast<const GLuint *>(indices), count,
577 primitiveRestartEnabled,
578 GetPrimitiveRestartIndex(indexType));
579 default:
580 UNREACHABLE();
581 return IndexRange();
582 }
583}
584
585GLuint GetPrimitiveRestartIndex(GLenum indexType)
586{
587 switch (indexType)
588 {
589 case GL_UNSIGNED_BYTE:
590 return 0xFF;
591 case GL_UNSIGNED_SHORT:
592 return 0xFFFF;
593 case GL_UNSIGNED_INT:
594 return 0xFFFFFFFF;
595 default:
596 UNREACHABLE();
597 return 0;
Geoff Lang831b1952015-05-05 11:02:27 -0400598 }
599}
600
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000601bool IsTriangleMode(GLenum drawMode)
602{
603 switch (drawMode)
604 {
605 case GL_TRIANGLES:
606 case GL_TRIANGLE_FAN:
607 case GL_TRIANGLE_STRIP:
608 return true;
609 case GL_POINTS:
610 case GL_LINES:
611 case GL_LINE_LOOP:
612 case GL_LINE_STRIP:
613 return false;
614 default: UNREACHABLE();
615 }
616
617 return false;
618}
619
Geoff Lang4f0e0032017-05-01 16:04:35 -0400620bool IsIntegerFormat(GLenum unsizedFormat)
621{
622 switch (unsizedFormat)
623 {
624 case GL_RGBA_INTEGER:
625 case GL_RGB_INTEGER:
626 case GL_RG_INTEGER:
627 case GL_RED_INTEGER:
628 return true;
629
630 default:
631 return false;
632 }
633}
634
Jamie Madill865d1452014-07-02 15:31:20 -0400635// [OpenGL ES SL 3.00.4] Section 11 p. 120
636// Vertex Outs/Fragment Ins packing priorities
637int VariableSortOrder(GLenum type)
638{
639 switch (type)
640 {
641 // 1. Arrays of mat4 and mat4
642 // Non-square matrices of type matCxR consume the same space as a square
643 // matrix of type matN where N is the greater of C and R
644 case GL_FLOAT_MAT4:
645 case GL_FLOAT_MAT2x4:
646 case GL_FLOAT_MAT3x4:
647 case GL_FLOAT_MAT4x2:
648 case GL_FLOAT_MAT4x3:
649 return 0;
650
651 // 2. Arrays of mat2 and mat2 (since they occupy full rows)
652 case GL_FLOAT_MAT2:
653 return 1;
654
655 // 3. Arrays of vec4 and vec4
656 case GL_FLOAT_VEC4:
657 case GL_INT_VEC4:
658 case GL_BOOL_VEC4:
659 case GL_UNSIGNED_INT_VEC4:
660 return 2;
661
662 // 4. Arrays of mat3 and mat3
663 case GL_FLOAT_MAT3:
664 case GL_FLOAT_MAT2x3:
665 case GL_FLOAT_MAT3x2:
666 return 3;
667
668 // 5. Arrays of vec3 and vec3
669 case GL_FLOAT_VEC3:
670 case GL_INT_VEC3:
671 case GL_BOOL_VEC3:
672 case GL_UNSIGNED_INT_VEC3:
673 return 4;
674
675 // 6. Arrays of vec2 and vec2
676 case GL_FLOAT_VEC2:
677 case GL_INT_VEC2:
678 case GL_BOOL_VEC2:
679 case GL_UNSIGNED_INT_VEC2:
680 return 5;
681
682 // 7. Single component types
683 case GL_FLOAT:
684 case GL_INT:
685 case GL_BOOL:
686 case GL_UNSIGNED_INT:
687 case GL_SAMPLER_2D:
688 case GL_SAMPLER_CUBE:
689 case GL_SAMPLER_EXTERNAL_OES:
690 case GL_SAMPLER_2D_RECT_ARB:
691 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800692 case GL_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400693 case GL_SAMPLER_3D:
694 case GL_INT_SAMPLER_2D:
695 case GL_INT_SAMPLER_3D:
696 case GL_INT_SAMPLER_CUBE:
697 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800698 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400699 case GL_UNSIGNED_INT_SAMPLER_2D:
700 case GL_UNSIGNED_INT_SAMPLER_3D:
701 case GL_UNSIGNED_INT_SAMPLER_CUBE:
702 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800703 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400704 case GL_SAMPLER_2D_SHADOW:
705 case GL_SAMPLER_2D_ARRAY_SHADOW:
706 case GL_SAMPLER_CUBE_SHADOW:
707 return 6;
708
709 default:
710 UNREACHABLE();
711 return 0;
712 }
713}
714
jchen1015015f72017-03-16 13:54:21 +0800715std::string ParseResourceName(const std::string &name, size_t *outSubscript)
Geoff Langcfaeaa92015-04-14 13:41:02 -0400716{
717 // Strip any trailing array operator and retrieve the subscript
718 size_t open = name.find_last_of('[');
719 size_t close = name.find_last_of(']');
720 bool hasIndex = (open != std::string::npos) && (close == name.length() - 1);
721 if (!hasIndex)
722 {
723 if (outSubscript)
724 {
725 *outSubscript = GL_INVALID_INDEX;
726 }
727 return name;
728 }
729
730 if (outSubscript)
731 {
732 int index = atoi(name.substr(open + 1).c_str());
733 if (index >= 0)
734 {
735 *outSubscript = index;
736 }
737 else
738 {
739 *outSubscript = GL_INVALID_INDEX;
740 }
741 }
742
743 return name.substr(0, open);
744}
745
Geoff Langc1984ed2016-10-07 12:41:00 -0400746template <>
747GLuint ConvertToGLuint(GLfloat param)
748{
749 return uiround<GLuint>(param);
750}
751
752template <>
753GLint ConvertToGLint(GLfloat param)
754{
755 return iround<GLint>(param);
756}
757
758template <>
759GLint ConvertFromGLfloat(GLfloat param)
760{
761 return iround<GLint>(param);
762}
763template <>
764GLuint ConvertFromGLfloat(GLfloat param)
765{
766 return uiround<GLuint>(param);
767}
768
Jamie Madill4a3c2342015-10-08 12:58:45 -0400769unsigned int ParseAndStripArrayIndex(std::string *name)
770{
771 unsigned int subscript = GL_INVALID_INDEX;
772
773 // Strip any trailing array operator and retrieve the subscript
774 size_t open = name->find_last_of('[');
775 size_t close = name->find_last_of(']');
776 if (open != std::string::npos && close == name->length() - 1)
777 {
778 subscript = atoi(name->c_str() + open + 1);
779 name->erase(open);
780 }
781
782 return subscript;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000783}
784
Jamie Madill4a3c2342015-10-08 12:58:45 -0400785} // namespace gl
786
Geoff Langa8406172015-07-21 16:53:39 -0400787namespace egl
788{
789static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 1,
790 "Unexpected EGL cube map enum value.");
791static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 2,
792 "Unexpected EGL cube map enum value.");
793static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 3,
794 "Unexpected EGL cube map enum value.");
795static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 4,
796 "Unexpected EGL cube map enum value.");
797static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 5,
798 "Unexpected EGL cube map enum value.");
799
800bool IsCubeMapTextureTarget(EGLenum target)
801{
802 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
803}
804
805size_t CubeMapTextureTargetToLayerIndex(EGLenum target)
806{
807 ASSERT(IsCubeMapTextureTarget(target));
808 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
809}
810
811EGLenum LayerIndexToCubeMapTextureTarget(size_t index)
812{
813 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
814 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
815}
816
817bool IsTextureTarget(EGLenum target)
818{
819 switch (target)
820 {
821 case EGL_GL_TEXTURE_2D_KHR:
822 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
823 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
824 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
825 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
826 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
827 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
828 case EGL_GL_TEXTURE_3D_KHR:
829 return true;
830
831 default:
832 return false;
833 }
834}
835
836bool IsRenderbufferTarget(EGLenum target)
837{
838 return target == EGL_GL_RENDERBUFFER_KHR;
839}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400840} // namespace egl
Geoff Langa8406172015-07-21 16:53:39 -0400841
842namespace egl_gl
843{
844GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget)
845{
846 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
847 return gl::LayerIndexToCubeMapTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
848}
849
850GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget)
851{
852 switch (eglTarget)
853 {
854 case EGL_GL_TEXTURE_2D_KHR:
855 return GL_TEXTURE_2D;
856
857 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
858 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
859 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
860 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
861 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
862 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
863 return EGLCubeMapTargetToGLCubeMapTarget(eglTarget);
864
865 case EGL_GL_TEXTURE_3D_KHR:
866 return GL_TEXTURE_3D;
867
868 default:
869 UNREACHABLE();
870 return GL_NONE;
871 }
872}
873
874GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer)
875{
876 return static_cast<GLuint>(reinterpret_cast<uintptr_t>(buffer));
877}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400878} // namespace egl_gl
Geoff Langa8406172015-07-21 16:53:39 -0400879
Geoff Langc5a2a172017-01-13 15:55:07 -0500880namespace gl_egl
881{
882EGLenum GLComponentTypeToEGLColorComponentType(GLenum glComponentType)
883{
884 switch (glComponentType)
885 {
886 case GL_FLOAT:
887 return EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT;
888
889 case GL_UNSIGNED_NORMALIZED:
890 return EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
891
892 default:
893 UNREACHABLE();
894 return EGL_NONE;
895 }
896}
897} // namespace gl_egl
898
Austin Kinross922a9fb2014-10-21 14:26:33 -0700899#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000900std::string getTempPath()
901{
Shannon Woodsfb839472014-06-16 13:21:41 -0400902#ifdef ANGLE_PLATFORM_WINDOWS
Austin Kinross922a9fb2014-10-21 14:26:33 -0700903 char path[MAX_PATH];
904 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
905 if (pathLen == 0)
906 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000907 UNREACHABLE();
908 return std::string();
Austin Kinross922a9fb2014-10-21 14:26:33 -0700909 }
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000910
Austin Kinross922a9fb2014-10-21 14:26:33 -0700911 UINT unique = GetTempFileNameA(path, "sh", 0, path);
912 if (unique == 0)
913 {
914 UNREACHABLE();
915 return std::string();
916 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000917
Austin Kinross922a9fb2014-10-21 14:26:33 -0700918 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500919#else
920 UNIMPLEMENTED();
921 return "";
922#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000923}
924
925void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000926{
927 FILE* file = fopen(path, "w");
928 if (!file)
929 {
930 UNREACHABLE();
931 return;
932 }
933
934 fwrite(content, sizeof(char), size, file);
935 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000936}
Austin Kinross922a9fb2014-10-21 14:26:33 -0700937#endif // !ANGLE_ENABLE_WINDOWS_STORE
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700938
Cooper Partin1edac3b2014-11-20 13:49:27 -0800939#if defined (ANGLE_PLATFORM_WINDOWS)
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700940
Cooper Partin1edac3b2014-11-20 13:49:27 -0800941// Causes the thread to relinquish the remainder of its time slice to any
942// other thread that is ready to run.If there are no other threads ready
943// to run, the function returns immediately, and the thread continues execution.
944void ScheduleYield()
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700945{
Geoff Lange5f735f2015-09-17 13:26:59 -0400946 Sleep(0);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700947}
948
Kenneth Russellb23deb22014-11-21 14:53:56 -0800949#endif