blob: f0aea9d489f1f2affe50d2d2f9503e15cb13a9cc [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// utilities.cpp: Conversion functions and other utility routines.
8
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +00009#include "common/utilities.h"
10#include "common/mathutil.h"
11
12#include <set>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000014namespace gl
15{
16
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +000017int UniformComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000018{
19 switch (type)
20 {
21 case GL_BOOL:
22 case GL_FLOAT:
23 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000024 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -040025 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000026 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -040027 case GL_SAMPLER_2D_ARRAY:
28 case GL_INT_SAMPLER_2D:
29 case GL_INT_SAMPLER_3D:
30 case GL_INT_SAMPLER_CUBE:
31 case GL_INT_SAMPLER_2D_ARRAY:
32 case GL_UNSIGNED_INT_SAMPLER_2D:
33 case GL_UNSIGNED_INT_SAMPLER_3D:
34 case GL_UNSIGNED_INT_SAMPLER_CUBE:
35 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -040036 case GL_SAMPLER_2D_SHADOW:
37 case GL_SAMPLER_CUBE_SHADOW:
38 case GL_SAMPLER_2D_ARRAY_SHADOW:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000039 case GL_UNSIGNED_INT:
Nicolas Capense6050882013-07-08 10:43:10 -040040 return 1;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000041 case GL_BOOL_VEC2:
42 case GL_FLOAT_VEC2:
43 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000044 case GL_UNSIGNED_INT_VEC2:
Nicolas Capense6050882013-07-08 10:43:10 -040045 return 2;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000046 case GL_INT_VEC3:
47 case GL_FLOAT_VEC3:
48 case GL_BOOL_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000049 case GL_UNSIGNED_INT_VEC3:
Nicolas Capense6050882013-07-08 10:43:10 -040050 return 3;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000051 case GL_BOOL_VEC4:
52 case GL_FLOAT_VEC4:
53 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +000054 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000055 case GL_FLOAT_MAT2:
Nicolas Capense6050882013-07-08 10:43:10 -040056 return 4;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000057 case GL_FLOAT_MAT2x3:
58 case GL_FLOAT_MAT3x2:
Nicolas Capense6050882013-07-08 10:43:10 -040059 return 6;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000060 case GL_FLOAT_MAT2x4:
61 case GL_FLOAT_MAT4x2:
Nicolas Capense6050882013-07-08 10:43:10 -040062 return 8;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000063 case GL_FLOAT_MAT3:
Nicolas Capense6050882013-07-08 10:43:10 -040064 return 9;
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000065 case GL_FLOAT_MAT3x4:
66 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040067 return 12;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000068 case GL_FLOAT_MAT4:
Nicolas Capense6050882013-07-08 10:43:10 -040069 return 16;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000070 default:
Nicolas Capense6050882013-07-08 10:43:10 -040071 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000072 }
73
74 return 0;
75}
76
77GLenum UniformComponentType(GLenum type)
78{
79 switch(type)
80 {
81 case GL_BOOL:
82 case GL_BOOL_VEC2:
83 case GL_BOOL_VEC3:
84 case GL_BOOL_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -040085 return GL_BOOL;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000086 case GL_FLOAT:
87 case GL_FLOAT_VEC2:
88 case GL_FLOAT_VEC3:
89 case GL_FLOAT_VEC4:
90 case GL_FLOAT_MAT2:
91 case GL_FLOAT_MAT3:
92 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.come6ca6702013-04-13 03:40:44 +000093 case GL_FLOAT_MAT2x3:
94 case GL_FLOAT_MAT3x2:
95 case GL_FLOAT_MAT2x4:
96 case GL_FLOAT_MAT4x2:
97 case GL_FLOAT_MAT3x4:
98 case GL_FLOAT_MAT4x3:
Nicolas Capense6050882013-07-08 10:43:10 -040099 return GL_FLOAT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000100 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000101 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400102 case GL_SAMPLER_3D:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000103 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400104 case GL_SAMPLER_2D_ARRAY:
105 case GL_INT_SAMPLER_2D:
106 case GL_INT_SAMPLER_3D:
107 case GL_INT_SAMPLER_CUBE:
108 case GL_INT_SAMPLER_2D_ARRAY:
109 case GL_UNSIGNED_INT_SAMPLER_2D:
110 case GL_UNSIGNED_INT_SAMPLER_3D:
111 case GL_UNSIGNED_INT_SAMPLER_CUBE:
112 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400113 case GL_SAMPLER_2D_SHADOW:
114 case GL_SAMPLER_CUBE_SHADOW:
115 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000116 case GL_INT_VEC2:
117 case GL_INT_VEC3:
118 case GL_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400119 return GL_INT;
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000120 case GL_UNSIGNED_INT:
121 case GL_UNSIGNED_INT_VEC2:
122 case GL_UNSIGNED_INT_VEC3:
123 case GL_UNSIGNED_INT_VEC4:
Nicolas Capense6050882013-07-08 10:43:10 -0400124 return GL_UNSIGNED_INT;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000125 default:
Nicolas Capense6050882013-07-08 10:43:10 -0400126 UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000127 }
128
129 return GL_NONE;
130}
131
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000132size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000133{
134 switch(type)
135 {
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000136 case GL_BOOL: return sizeof(GLint);
137 case GL_FLOAT: return sizeof(GLfloat);
138 case GL_INT: return sizeof(GLint);
139 case GL_UNSIGNED_INT: return sizeof(GLuint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000140 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000141 }
142
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000143 return 0;
144}
145
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000146size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000147{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000148 // Expanded to 4-element vectors
149 return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000150}
151
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000152size_t UniformExternalSize(GLenum type)
153{
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000154 return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000155}
156
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000157GLenum UniformBoolVectorType(GLenum type)
158{
159 switch (type)
160 {
161 case GL_FLOAT:
162 case GL_INT:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000163 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000164 return GL_BOOL;
165 case GL_FLOAT_VEC2:
166 case GL_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000167 case GL_UNSIGNED_INT_VEC2:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000168 return GL_BOOL_VEC2;
169 case GL_FLOAT_VEC3:
170 case GL_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000171 case GL_UNSIGNED_INT_VEC3:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000172 return GL_BOOL_VEC3;
173 case GL_FLOAT_VEC4:
174 case GL_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com44ce5b12013-04-13 03:40:30 +0000175 case GL_UNSIGNED_INT_VEC4:
shannon.woods%transgaming.com@gtempaccount.com8a19eed2013-04-13 03:40:22 +0000176 return GL_BOOL_VEC4;
177
178 default:
179 UNREACHABLE();
180 return GL_NONE;
181 }
182}
183
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000184int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000185{
186 switch (type)
187 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000188 case GL_NONE:
189 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000190 case GL_BOOL:
191 case GL_FLOAT:
192 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000193 case GL_UNSIGNED_INT:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000194 case GL_BOOL_VEC2:
195 case GL_FLOAT_VEC2:
196 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000197 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000198 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000199 case GL_FLOAT_VEC3:
200 case GL_INT_VEC3:
201 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000202 case GL_BOOL_VEC4:
203 case GL_FLOAT_VEC4:
204 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000205 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000206 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400207 case GL_SAMPLER_3D:
daniel@transgaming.comda8d3802012-12-20 21:12:55 +0000208 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400209 case GL_SAMPLER_2D_ARRAY:
210 case GL_INT_SAMPLER_2D:
211 case GL_INT_SAMPLER_3D:
212 case GL_INT_SAMPLER_CUBE:
213 case GL_INT_SAMPLER_2D_ARRAY:
214 case GL_UNSIGNED_INT_SAMPLER_2D:
215 case GL_UNSIGNED_INT_SAMPLER_3D:
216 case GL_UNSIGNED_INT_SAMPLER_CUBE:
217 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400218 case GL_SAMPLER_2D_SHADOW:
219 case GL_SAMPLER_CUBE_SHADOW:
220 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000221 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000222 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000223 case GL_FLOAT_MAT3x2:
224 case GL_FLOAT_MAT4x2:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000225 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000226 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000227 case GL_FLOAT_MAT2x3:
228 case GL_FLOAT_MAT4x3:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000229 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000230 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000231 case GL_FLOAT_MAT2x4:
232 case GL_FLOAT_MAT3x4:
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000233 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000234 default:
235 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000236 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000237
238 return 0;
239}
240
241int VariableColumnCount(GLenum type)
242{
243 switch (type)
244 {
245 case GL_NONE:
246 return 0;
247 case GL_BOOL:
248 case GL_FLOAT:
249 case GL_INT:
shannonwoods@chromium.org6b709912013-05-30 00:20:04 +0000250 case GL_UNSIGNED_INT:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000251 case GL_SAMPLER_2D:
Nicolas Capense6050882013-07-08 10:43:10 -0400252 case GL_SAMPLER_3D:
shannon.woods@transgaming.com2494c972013-02-28 23:10:03 +0000253 case GL_SAMPLER_CUBE:
Nicolas Capense6050882013-07-08 10:43:10 -0400254 case GL_SAMPLER_2D_ARRAY:
255 case GL_INT_SAMPLER_2D:
256 case GL_INT_SAMPLER_3D:
257 case GL_INT_SAMPLER_CUBE:
258 case GL_INT_SAMPLER_2D_ARRAY:
259 case GL_UNSIGNED_INT_SAMPLER_2D:
260 case GL_UNSIGNED_INT_SAMPLER_3D:
261 case GL_UNSIGNED_INT_SAMPLER_CUBE:
262 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400263 case GL_SAMPLER_2D_SHADOW:
264 case GL_SAMPLER_CUBE_SHADOW:
265 case GL_SAMPLER_2D_ARRAY_SHADOW:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000266 return 1;
267 case GL_BOOL_VEC2:
268 case GL_FLOAT_VEC2:
269 case GL_INT_VEC2:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000270 case GL_UNSIGNED_INT_VEC2:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000271 case GL_FLOAT_MAT2:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000272 case GL_FLOAT_MAT2x3:
273 case GL_FLOAT_MAT2x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000274 return 2;
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000275 case GL_BOOL_VEC3:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000276 case GL_FLOAT_VEC3:
277 case GL_INT_VEC3:
278 case GL_UNSIGNED_INT_VEC3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000279 case GL_FLOAT_MAT3:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000280 case GL_FLOAT_MAT3x2:
281 case GL_FLOAT_MAT3x4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000282 return 3;
283 case GL_BOOL_VEC4:
284 case GL_FLOAT_VEC4:
285 case GL_INT_VEC4:
shannonwoods@chromium.org8c788e82013-05-30 00:20:21 +0000286 case GL_UNSIGNED_INT_VEC4:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000287 case GL_FLOAT_MAT4:
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000288 case GL_FLOAT_MAT4x2:
289 case GL_FLOAT_MAT4x3:
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000290 return 4;
291 default:
292 UNREACHABLE();
293 }
294
295 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000296}
297
Nicolas Capense6050882013-07-08 10:43:10 -0400298bool IsSampler(GLenum type)
299{
300 switch (type)
301 {
302 case GL_SAMPLER_2D:
303 case GL_SAMPLER_3D:
304 case GL_SAMPLER_CUBE:
305 case GL_SAMPLER_2D_ARRAY:
306 case GL_INT_SAMPLER_2D:
307 case GL_INT_SAMPLER_3D:
308 case GL_INT_SAMPLER_CUBE:
309 case GL_INT_SAMPLER_2D_ARRAY:
310 case GL_UNSIGNED_INT_SAMPLER_2D:
311 case GL_UNSIGNED_INT_SAMPLER_3D:
312 case GL_UNSIGNED_INT_SAMPLER_CUBE:
313 case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
Nicolas Capenscb127d32013-07-15 17:26:18 -0400314 case GL_SAMPLER_2D_SHADOW:
315 case GL_SAMPLER_CUBE_SHADOW:
316 case GL_SAMPLER_2D_ARRAY_SHADOW:
Nicolas Capense6050882013-07-08 10:43:10 -0400317 return true;
318 }
319
320 return false;
321}
322
shannon.woods%transgaming.com@gtempaccount.com02e11f32013-04-13 03:40:50 +0000323bool IsMatrixType(GLenum type)
324{
325 return VariableRowCount(type) > 1;
326}
327
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000328GLenum TransposeMatrixType(GLenum type)
329{
330 if (!IsMatrixType(type))
331 {
332 return type;
333 }
334
335 switch (type)
336 {
337 case GL_FLOAT_MAT2: return GL_FLOAT_MAT2;
338 case GL_FLOAT_MAT3: return GL_FLOAT_MAT3;
339 case GL_FLOAT_MAT4: return GL_FLOAT_MAT4;
340 case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
341 case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
342 case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
343 case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
344 case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
345 case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
346 default: UNREACHABLE(); return GL_NONE;
347 }
348}
349
Jamie Madill8c6befc2013-06-20 11:55:55 -0400350int MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
351{
352 ASSERT(IsMatrixType(type));
353 return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
354}
355
356int MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
357{
358 ASSERT(IsMatrixType(type));
359 return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
360}
361
shannonwoods@chromium.org9bd22fa2013-05-30 00:18:47 +0000362int AttributeRegisterCount(GLenum type)
363{
364 return IsMatrixType(type) ? VariableColumnCount(type) : 1;
365}
366
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000367int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
368{
369 ASSERT(allocationSize <= bitsSize);
370
371 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
372
373 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
374 {
375 if ((*bits & mask) == 0)
376 {
377 *bits |= mask;
378 return i;
379 }
380
381 mask <<= 1;
382 }
383
384 return -1;
385}
386
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000387bool IsStencilTexture(GLenum format)
388{
389 if (format == GL_DEPTH_STENCIL_OES ||
390 format == GL_DEPTH24_STENCIL8_OES)
391 {
392 return true;
393 }
394
395 return false;
396}
397
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000398void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
399{
400 int upsampleCount = 0;
401
402 if (isCompressed)
403 {
404 // Don't expand the size of full textures that are at least 4x4
405 // already.
406 if (isImage || *requestWidth < 4 || *requestHeight < 4)
407 {
408 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
409 {
410 *requestWidth <<= 1;
411 *requestHeight <<= 1;
412 upsampleCount++;
413 }
414 }
415 }
416 *levelOffset = upsampleCount;
417}
418
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000419// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000420int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000421{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000422 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000423 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000424 case GL_ALPHA8_EXT: return sizeof(unsigned char);
425 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
426 case GL_ALPHA32F_EXT: return sizeof(float);
427 case GL_LUMINANCE32F_EXT: return sizeof(float);
428 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
429 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
430 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
431 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
432 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
433 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
434 case GL_RGB565: return sizeof(unsigned short);
435 case GL_RGB32F_EXT: return sizeof(float) * 3;
436 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
437 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
438 case GL_RGBA4: return sizeof(unsigned short);
439 case GL_RGB5_A1: return sizeof(unsigned short);
440 case GL_RGBA32F_EXT: return sizeof(float) * 4;
441 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
442 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +0000443 case GL_SRGB8_ALPHA8: return sizeof(unsigned char) * 4;
444 case GL_RGB10_A2: return sizeof(unsigned char) * 4;
445 case GL_RG8: return sizeof(unsigned char) * 2;
446 case GL_R8: return sizeof(unsigned char);
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000447 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
448 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +0000449 default:
450 UNIMPLEMENTED(); // TODO: Remaining ES3 formats
451 UNREACHABLE();
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000452 }
453
454 return 0;
455}
456
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000457bool IsCubemapTextureTarget(GLenum target)
458{
459 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
460}
461
Geoff Lang0fe19492013-07-25 17:04:31 -0400462bool IsInternalTextureTarget(GLenum target, GLuint clientVersion)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000463{
Geoff Lang0fe19492013-07-25 17:04:31 -0400464 if (clientVersion == 2)
465 {
466 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
467 }
468 else if (clientVersion == 3)
469 {
470 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) ||
471 target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
472 }
473 else
474 {
475 UNREACHABLE();
476 return false;
477 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000478}
479
daniel@transgaming.com97c852b2012-12-20 20:56:23 +0000480bool IsTriangleMode(GLenum drawMode)
481{
482 switch (drawMode)
483 {
484 case GL_TRIANGLES:
485 case GL_TRIANGLE_FAN:
486 case GL_TRIANGLE_STRIP:
487 return true;
488 case GL_POINTS:
489 case GL_LINES:
490 case GL_LINE_LOOP:
491 case GL_LINE_STRIP:
492 return false;
493 default: UNREACHABLE();
494 }
495
496 return false;
497}
498
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000499}
500
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000501std::string getTempPath()
502{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000503 char path[MAX_PATH];
504 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
505 if (pathLen == 0)
506 {
507 UNREACHABLE();
508 return std::string();
509 }
510
511 UINT unique = GetTempFileNameA(path, "sh", 0, path);
512 if (unique == 0)
513 {
514 UNREACHABLE();
515 return std::string();
516 }
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +0000517
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000518 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000519}
520
521void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000522{
523 FILE* file = fopen(path, "w");
524 if (!file)
525 {
526 UNREACHABLE();
527 return;
528 }
529
530 fwrite(content, sizeof(char), size, file);
531 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000532}