blob: 435ee9e08a3318c83e1a98263127b19363cc2bc8 [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:
Nicolas Capense6050882013-07-08 10:43:10 -0400148 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000149 case GL_UNSIGNED_INT:
150 case GL_UNSIGNED_INT_VEC2:
151 case GL_UNSIGNED_INT_VEC3:
152 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400153 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000154 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400155 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000156 }
157
158 return GL_NONE;
159}
160
Jamie Madillf2575982014-06-25 16:04:54 -0400161size_t VariableComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000162{
163 switch(type)
164 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000165 case GL_BOOL: return sizeof(GLint);
166 case GL_FLOAT: return sizeof(GLfloat);
167 case GL_INT: return sizeof(GLint);
168 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000169 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000170 }
171
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000172 return 0;
173}
174
Jamie Madillf2575982014-06-25 16:04:54 -0400175size_t VariableInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000176{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000177 // Expanded to 4-element vectors
Jamie Madillf2575982014-06-25 16:04:54 -0400178 return VariableComponentSize(VariableComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000179}
180
Jamie Madillf2575982014-06-25 16:04:54 -0400181size_t VariableExternalSize(GLenum type)
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000182{
Jamie Madillf2575982014-06-25 16:04:54 -0400183 return VariableComponentSize(VariableComponentType(type)) * VariableComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000184}
185
Jamie Madillf2575982014-06-25 16:04:54 -0400186GLenum VariableBoolVectorType(GLenum type)
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000187{
188 switch (type)
189 {
190 case GL_FLOAT:
191 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000192 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000193 return GL_BOOL;
194 case GL_FLOAT_VEC2:
195 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000196 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000197 return GL_BOOL_VEC2;
198 case GL_FLOAT_VEC3:
199 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000200 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000201 return GL_BOOL_VEC3;
202 case GL_FLOAT_VEC4:
203 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000204 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000205 return GL_BOOL_VEC4;
206
207 default:
208 UNREACHABLE();
209 return GL_NONE;
210 }
211}
212
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000213int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000214{
215 switch (type)
216 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000217 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400218 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000219 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000220 case GL_BOOL:
221 case GL_FLOAT:
222 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000223 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000224 case GL_BOOL_VEC2:
225 case GL_FLOAT_VEC2:
226 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000227 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000228 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000229 case GL_FLOAT_VEC3:
230 case GL_INT_VEC3:
231 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000232 case GL_BOOL_VEC4:
233 case GL_FLOAT_VEC4:
234 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000235 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000236 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400237 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000238 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400239 case GL_SAMPLER_2D_ARRAY:
Jamie Madillaa72d782014-07-02 15:31:19 -0400240 case GL_SAMPLER_EXTERNAL_OES:
241 case GL_SAMPLER_2D_RECT_ARB:
JiangYizhou40219322016-12-09 09:50:51 +0800242 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400243 case GL_INT_SAMPLER_2D:
244 case GL_INT_SAMPLER_3D:
245 case GL_INT_SAMPLER_CUBE:
246 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800247 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400248 case GL_UNSIGNED_INT_SAMPLER_2D:
249 case GL_UNSIGNED_INT_SAMPLER_3D:
250 case GL_UNSIGNED_INT_SAMPLER_CUBE:
251 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800252 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400253 case GL_SAMPLER_2D_SHADOW:
254 case GL_SAMPLER_CUBE_SHADOW:
255 case GL_SAMPLER_2D_ARRAY_SHADOW:
Martin Radev2cc85b32016-08-05 16:22:53 +0300256 case GL_IMAGE_2D:
257 case GL_INT_IMAGE_2D:
258 case GL_UNSIGNED_INT_IMAGE_2D:
259 case GL_IMAGE_2D_ARRAY:
260 case GL_INT_IMAGE_2D_ARRAY:
261 case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
262 case GL_IMAGE_3D:
263 case GL_INT_IMAGE_3D:
264 case GL_UNSIGNED_INT_IMAGE_3D:
265 case GL_IMAGE_CUBE:
266 case GL_INT_IMAGE_CUBE:
267 case GL_UNSIGNED_INT_IMAGE_CUBE:
268 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000269 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000270 case GL_FLOAT_MAT3x2:
271 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000272 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000273 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000274 case GL_FLOAT_MAT2x3:
275 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000276 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000277 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000278 case GL_FLOAT_MAT2x4:
279 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000280 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000281 default:
282 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000283 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000284
285 return 0;
286}
287
288int VariableColumnCount(GLenum type)
289{
290 switch (type)
291 {
292 case GL_NONE:
Jamie Madill66192b32013-09-09 15:41:37 -0400293 case GL_STRUCT_ANGLEX:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000294 return 0;
295 case GL_BOOL:
296 case GL_FLOAT:
297 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000298 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000299 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400300 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000301 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400302 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800303 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400304 case GL_INT_SAMPLER_2D:
305 case GL_INT_SAMPLER_3D:
306 case GL_INT_SAMPLER_CUBE:
307 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800308 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madillaa72d782014-07-02 15:31:19 -0400309 case GL_SAMPLER_EXTERNAL_OES:
310 case GL_SAMPLER_2D_RECT_ARB:
Nicolas Capense6050882013-07-08 10:43:10 -0400311 case GL_UNSIGNED_INT_SAMPLER_2D:
312 case GL_UNSIGNED_INT_SAMPLER_3D:
313 case GL_UNSIGNED_INT_SAMPLER_CUBE:
314 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800315 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400316 case GL_SAMPLER_2D_SHADOW:
317 case GL_SAMPLER_CUBE_SHADOW:
318 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000319 return 1;
320 case GL_BOOL_VEC2:
321 case GL_FLOAT_VEC2:
322 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000323 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000324 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000325 case GL_FLOAT_MAT2x3:
326 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000327 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000328 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000329 case GL_FLOAT_VEC3:
330 case GL_INT_VEC3:
331 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000332 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000333 case GL_FLOAT_MAT3x2:
334 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000335 return 3;
336 case GL_BOOL_VEC4:
337 case GL_FLOAT_VEC4:
338 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000339 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000340 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000341 case GL_FLOAT_MAT4x2:
342 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000343 return 4;
344 default:
345 UNREACHABLE();
346 }
347
348 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000349}
350
Geoff Lang2ec386b2014-12-03 14:44:38 -0500351bool IsSamplerType(GLenum type)
Nicolas Capense6050882013-07-08 10:43:10 -0400352{
353 switch (type)
354 {
355 case GL_SAMPLER_2D:
356 case GL_SAMPLER_3D:
357 case GL_SAMPLER_CUBE:
358 case GL_SAMPLER_2D_ARRAY:
Ian Ewellbda75592016-04-18 17:25:54 -0400359 case GL_SAMPLER_EXTERNAL_OES:
JiangYizhou40219322016-12-09 09:50:51 +0800360 case GL_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400361 case GL_INT_SAMPLER_2D:
362 case GL_INT_SAMPLER_3D:
363 case GL_INT_SAMPLER_CUBE:
364 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800365 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capense6050882013-07-08 10:43:10 -0400366 case GL_UNSIGNED_INT_SAMPLER_2D:
367 case GL_UNSIGNED_INT_SAMPLER_3D:
368 case GL_UNSIGNED_INT_SAMPLER_CUBE:
369 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800370 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400371 case GL_SAMPLER_2D_SHADOW:
372 case GL_SAMPLER_CUBE_SHADOW:
373 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400374 return true;
375 }
376
377 return false;
378}
379
Geoff Langf51bc792015-05-04 14:57:03 -0400380GLenum SamplerTypeToTextureType(GLenum samplerType)
381{
382 switch (samplerType)
383 {
384 case GL_SAMPLER_2D:
385 case GL_INT_SAMPLER_2D:
386 case GL_UNSIGNED_INT_SAMPLER_2D:
387 case GL_SAMPLER_2D_SHADOW:
388 return GL_TEXTURE_2D;
389
Ian Ewellbda75592016-04-18 17:25:54 -0400390 case GL_SAMPLER_EXTERNAL_OES:
391 return GL_TEXTURE_EXTERNAL_OES;
392
Geoff Langf51bc792015-05-04 14:57:03 -0400393 case GL_SAMPLER_CUBE:
394 case GL_INT_SAMPLER_CUBE:
395 case GL_UNSIGNED_INT_SAMPLER_CUBE:
396 case GL_SAMPLER_CUBE_SHADOW:
397 return GL_TEXTURE_CUBE_MAP;
398
399 case GL_SAMPLER_2D_ARRAY:
400 case GL_INT_SAMPLER_2D_ARRAY:
401 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
402 case GL_SAMPLER_2D_ARRAY_SHADOW:
403 return GL_TEXTURE_2D_ARRAY;
404
405 case GL_SAMPLER_3D:
406 case GL_INT_SAMPLER_3D:
407 case GL_UNSIGNED_INT_SAMPLER_3D:
408 return GL_TEXTURE_3D;
409
JiangYizhou40219322016-12-09 09:50:51 +0800410 case GL_SAMPLER_2D_MULTISAMPLE:
411 case GL_INT_SAMPLER_2D_MULTISAMPLE:
412 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
413 return GL_TEXTURE_2D_MULTISAMPLE;
414
Geoff Langf51bc792015-05-04 14:57:03 -0400415 default:
416 UNREACHABLE();
417 return 0;
418 }
419}
420
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000421bool IsMatrixType(GLenum type)
422{
423 return VariableRowCount(type) > 1;
424}
425
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000426GLenum TransposeMatrixType(GLenum type)
427{
428 if (!IsMatrixType(type))
429 {
430 return type;
431 }
432
433 switch (type)
434 {
435 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
436 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
437 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
438 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
439 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
440 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
441 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
442 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
443 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
444 default: UNREACHABLE(); return GL_NONE;
445 }
446}
447
Jamie Madill8c6befc2013-06-20 11:55:55 -0400448int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
449{
450 ASSERT(IsMatrixType(type));
451 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
452}
453
454int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
455{
456 ASSERT(IsMatrixType(type));
457 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
458}
459
Jamie Madillf2575982014-06-25 16:04:54 -0400460int VariableRegisterCount(GLenum type)
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000461{
462 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
463}
464
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000465int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
466{
467 ASSERT(allocationSize <= bitsSize);
468
469 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
470
471 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
472 {
473 if ((*bits & mask) == 0)
474 {
475 *bits |= mask;
476 return i;
477 }
478
479 mask <<= 1;
480 }
481
482 return -1;
483}
484
Geoff Langd4475812015-03-18 10:53:05 -0400485static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1, "Unexpected GL cube map enum value.");
486static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2, "Unexpected GL cube map enum value.");
487static_assert(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3, "Unexpected GL cube map enum value.");
488static_assert(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4, "Unexpected GL cube map enum value.");
489static_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 -0500490
491bool IsCubeMapTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000492{
Geoff Lang691e58c2014-12-19 17:03:25 -0500493 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
494}
495
496size_t CubeMapTextureTargetToLayerIndex(GLenum target)
497{
498 ASSERT(IsCubeMapTextureTarget(target));
499 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
500}
501
502GLenum LayerIndexToCubeMapTextureTarget(size_t index)
503{
504 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
505 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000506}
507
Geoff Lang3edfe032015-09-04 16:38:24 -0400508IndexRange ComputeIndexRange(GLenum indexType,
509 const GLvoid *indices,
510 size_t count,
511 bool primitiveRestartEnabled)
Geoff Lang831b1952015-05-05 11:02:27 -0400512{
513 switch (indexType)
514 {
Geoff Lang3edfe032015-09-04 16:38:24 -0400515 case GL_UNSIGNED_BYTE:
516 return ComputeTypedIndexRange(static_cast<const GLubyte *>(indices), count,
517 primitiveRestartEnabled,
518 GetPrimitiveRestartIndex(indexType));
519 case GL_UNSIGNED_SHORT:
520 return ComputeTypedIndexRange(static_cast<const GLushort *>(indices), count,
521 primitiveRestartEnabled,
522 GetPrimitiveRestartIndex(indexType));
523 case GL_UNSIGNED_INT:
524 return ComputeTypedIndexRange(static_cast<const GLuint *>(indices), count,
525 primitiveRestartEnabled,
526 GetPrimitiveRestartIndex(indexType));
527 default:
528 UNREACHABLE();
529 return IndexRange();
530 }
531}
532
533GLuint GetPrimitiveRestartIndex(GLenum indexType)
534{
535 switch (indexType)
536 {
537 case GL_UNSIGNED_BYTE:
538 return 0xFF;
539 case GL_UNSIGNED_SHORT:
540 return 0xFFFF;
541 case GL_UNSIGNED_INT:
542 return 0xFFFFFFFF;
543 default:
544 UNREACHABLE();
545 return 0;
Geoff Lang831b1952015-05-05 11:02:27 -0400546 }
547}
548
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000549bool IsTriangleMode(GLenum drawMode)
550{
551 switch (drawMode)
552 {
553 case GL_TRIANGLES:
554 case GL_TRIANGLE_FAN:
555 case GL_TRIANGLE_STRIP:
556 return true;
557 case GL_POINTS:
558 case GL_LINES:
559 case GL_LINE_LOOP:
560 case GL_LINE_STRIP:
561 return false;
562 default: UNREACHABLE();
563 }
564
565 return false;
566}
567
Jamie Madill865d1452014-07-02 15:31:20 -0400568// [OpenGL ES SL 3.00.4] Section 11 p. 120
569// Vertex Outs/Fragment Ins packing priorities
570int VariableSortOrder(GLenum type)
571{
572 switch (type)
573 {
574 // 1. Arrays of mat4 and mat4
575 // Non-square matrices of type matCxR consume the same space as a square
576 // matrix of type matN where N is the greater of C and R
577 case GL_FLOAT_MAT4:
578 case GL_FLOAT_MAT2x4:
579 case GL_FLOAT_MAT3x4:
580 case GL_FLOAT_MAT4x2:
581 case GL_FLOAT_MAT4x3:
582 return 0;
583
584 // 2. Arrays of mat2 and mat2 (since they occupy full rows)
585 case GL_FLOAT_MAT2:
586 return 1;
587
588 // 3. Arrays of vec4 and vec4
589 case GL_FLOAT_VEC4:
590 case GL_INT_VEC4:
591 case GL_BOOL_VEC4:
592 case GL_UNSIGNED_INT_VEC4:
593 return 2;
594
595 // 4. Arrays of mat3 and mat3
596 case GL_FLOAT_MAT3:
597 case GL_FLOAT_MAT2x3:
598 case GL_FLOAT_MAT3x2:
599 return 3;
600
601 // 5. Arrays of vec3 and vec3
602 case GL_FLOAT_VEC3:
603 case GL_INT_VEC3:
604 case GL_BOOL_VEC3:
605 case GL_UNSIGNED_INT_VEC3:
606 return 4;
607
608 // 6. Arrays of vec2 and vec2
609 case GL_FLOAT_VEC2:
610 case GL_INT_VEC2:
611 case GL_BOOL_VEC2:
612 case GL_UNSIGNED_INT_VEC2:
613 return 5;
614
615 // 7. Single component types
616 case GL_FLOAT:
617 case GL_INT:
618 case GL_BOOL:
619 case GL_UNSIGNED_INT:
620 case GL_SAMPLER_2D:
621 case GL_SAMPLER_CUBE:
622 case GL_SAMPLER_EXTERNAL_OES:
623 case GL_SAMPLER_2D_RECT_ARB:
624 case GL_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800625 case GL_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400626 case GL_SAMPLER_3D:
627 case GL_INT_SAMPLER_2D:
628 case GL_INT_SAMPLER_3D:
629 case GL_INT_SAMPLER_CUBE:
630 case GL_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800631 case GL_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400632 case GL_UNSIGNED_INT_SAMPLER_2D:
633 case GL_UNSIGNED_INT_SAMPLER_3D:
634 case GL_UNSIGNED_INT_SAMPLER_CUBE:
635 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
JiangYizhou40219322016-12-09 09:50:51 +0800636 case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
Jamie Madill865d1452014-07-02 15:31:20 -0400637 case GL_SAMPLER_2D_SHADOW:
638 case GL_SAMPLER_2D_ARRAY_SHADOW:
639 case GL_SAMPLER_CUBE_SHADOW:
640 return 6;
641
642 default:
643 UNREACHABLE();
644 return 0;
645 }
646}
647
Geoff Langcfaeaa92015-04-14 13:41:02 -0400648std::string ParseUniformName(const std::string &name, size_t *outSubscript)
649{
650 // Strip any trailing array operator and retrieve the subscript
651 size_t open = name.find_last_of('[');
652 size_t close = name.find_last_of(']');
653 bool hasIndex = (open != std::string::npos) && (close == name.length() - 1);
654 if (!hasIndex)
655 {
656 if (outSubscript)
657 {
658 *outSubscript = GL_INVALID_INDEX;
659 }
660 return name;
661 }
662
663 if (outSubscript)
664 {
665 int index = atoi(name.substr(open + 1).c_str());
666 if (index >= 0)
667 {
668 *outSubscript = index;
669 }
670 else
671 {
672 *outSubscript = GL_INVALID_INDEX;
673 }
674 }
675
676 return name.substr(0, open);
677}
678
Geoff Langc1984ed2016-10-07 12:41:00 -0400679template <>
680GLuint ConvertToGLuint(GLfloat param)
681{
682 return uiround<GLuint>(param);
683}
684
685template <>
686GLint ConvertToGLint(GLfloat param)
687{
688 return iround<GLint>(param);
689}
690
691template <>
692GLint ConvertFromGLfloat(GLfloat param)
693{
694 return iround<GLint>(param);
695}
696template <>
697GLuint ConvertFromGLfloat(GLfloat param)
698{
699 return uiround<GLuint>(param);
700}
701
Jamie Madill4a3c2342015-10-08 12:58:45 -0400702unsigned int ParseAndStripArrayIndex(std::string *name)
703{
704 unsigned int subscript = GL_INVALID_INDEX;
705
706 // Strip any trailing array operator and retrieve the subscript
707 size_t open = name->find_last_of('[');
708 size_t close = name->find_last_of(']');
709 if (open != std::string::npos && close == name->length() - 1)
710 {
711 subscript = atoi(name->c_str() + open + 1);
712 name->erase(open);
713 }
714
715 return subscript;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000716}
717
Jamie Madill4a3c2342015-10-08 12:58:45 -0400718} // namespace gl
719
Geoff Langa8406172015-07-21 16:53:39 -0400720namespace egl
721{
722static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 1,
723 "Unexpected EGL cube map enum value.");
724static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 2,
725 "Unexpected EGL cube map enum value.");
726static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 3,
727 "Unexpected EGL cube map enum value.");
728static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 4,
729 "Unexpected EGL cube map enum value.");
730static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 5,
731 "Unexpected EGL cube map enum value.");
732
733bool IsCubeMapTextureTarget(EGLenum target)
734{
735 return (target >= FirstCubeMapTextureTarget && target <= LastCubeMapTextureTarget);
736}
737
738size_t CubeMapTextureTargetToLayerIndex(EGLenum target)
739{
740 ASSERT(IsCubeMapTextureTarget(target));
741 return target - static_cast<size_t>(FirstCubeMapTextureTarget);
742}
743
744EGLenum LayerIndexToCubeMapTextureTarget(size_t index)
745{
746 ASSERT(index <= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
747 return FirstCubeMapTextureTarget + static_cast<GLenum>(index);
748}
749
750bool IsTextureTarget(EGLenum target)
751{
752 switch (target)
753 {
754 case EGL_GL_TEXTURE_2D_KHR:
755 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
756 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
757 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
758 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
759 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
760 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
761 case EGL_GL_TEXTURE_3D_KHR:
762 return true;
763
764 default:
765 return false;
766 }
767}
768
769bool IsRenderbufferTarget(EGLenum target)
770{
771 return target == EGL_GL_RENDERBUFFER_KHR;
772}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400773} // namespace egl
Geoff Langa8406172015-07-21 16:53:39 -0400774
775namespace egl_gl
776{
777GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget)
778{
779 ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
780 return gl::LayerIndexToCubeMapTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
781}
782
783GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget)
784{
785 switch (eglTarget)
786 {
787 case EGL_GL_TEXTURE_2D_KHR:
788 return GL_TEXTURE_2D;
789
790 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
791 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
792 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
793 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
794 case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
795 case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
796 return EGLCubeMapTargetToGLCubeMapTarget(eglTarget);
797
798 case EGL_GL_TEXTURE_3D_KHR:
799 return GL_TEXTURE_3D;
800
801 default:
802 UNREACHABLE();
803 return GL_NONE;
804 }
805}
806
807GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer)
808{
809 return static_cast<GLuint>(reinterpret_cast<uintptr_t>(buffer));
810}
Jamie Madill8b9b7922016-05-19 13:13:37 -0400811} // namespace egl_gl
Geoff Langa8406172015-07-21 16:53:39 -0400812
Geoff Langc5a2a172017-01-13 15:55:07 -0500813namespace gl_egl
814{
815EGLenum GLComponentTypeToEGLColorComponentType(GLenum glComponentType)
816{
817 switch (glComponentType)
818 {
819 case GL_FLOAT:
820 return EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT;
821
822 case GL_UNSIGNED_NORMALIZED:
823 return EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
824
825 default:
826 UNREACHABLE();
827 return EGL_NONE;
828 }
829}
830} // namespace gl_egl
831
Austin Kinross922a9fb2014-10-21 14:26:33 -0700832#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000833std::string getTempPath()
834{
Shannon Woodsfb839472014-06-16 13:21:41 -0400835#ifdef ANGLE_PLATFORM_WINDOWS
Austin Kinross922a9fb2014-10-21 14:26:33 -0700836 char path[MAX_PATH];
837 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
838 if (pathLen == 0)
839 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000840 UNREACHABLE();
841 return std::string();
Austin Kinross922a9fb2014-10-21 14:26:33 -0700842 }
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000843
Austin Kinross922a9fb2014-10-21 14:26:33 -0700844 UINT unique = GetTempFileNameA(path, "sh", 0, path);
845 if (unique == 0)
846 {
847 UNREACHABLE();
848 return std::string();
849 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000850
Austin Kinross922a9fb2014-10-21 14:26:33 -0700851 return path;
Geoff Lang83217792014-01-16 09:52:38 -0500852#else
853 UNIMPLEMENTED();
854 return "";
855#endif
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000856}
857
858void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000859{
860 FILE* file = fopen(path, "w");
861 if (!file)
862 {
863 UNREACHABLE();
864 return;
865 }
866
867 fwrite(content, sizeof(char), size, file);
868 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000869}
Austin Kinross922a9fb2014-10-21 14:26:33 -0700870#endif // !ANGLE_ENABLE_WINDOWS_STORE
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700871
Cooper Partin1edac3b2014-11-20 13:49:27 -0800872#if defined (ANGLE_PLATFORM_WINDOWS)
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700873
Cooper Partin1edac3b2014-11-20 13:49:27 -0800874// Causes the thread to relinquish the remainder of its time slice to any
875// other thread that is ready to run.If there are no other threads ready
876// to run, the function returns immediately, and the thread continues execution.
877void ScheduleYield()
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700878{
Geoff Lange5f735f2015-09-17 13:26:59 -0400879 Sleep(0);
Cooper Partin88d3b8c2014-10-08 10:41:56 -0700880}
881
Kenneth Russellb23deb22014-11-21 14:53:56 -0800882#endif