blob: fdd04cbb38f4d1f0f6e695a6f7595ab9cdf84dc1 [file] [log] [blame]
daniel@transgaming.com91ed1492010-10-29 03:11:43 +00001//
2// Copyright (c) 2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/util.h"
daniel@transgaming.com91ed1492010-10-29 03:11:43 +00008
Zhenyao Mof1d723c2013-09-23 14:57:07 -04009#include <limits>
10
Olli Etuaho99bd5f42016-11-07 12:44:29 +000011#include "common/utilities.h"
Zhenyao Mocc4ec642013-09-23 14:57:10 -040012#include "compiler/preprocessor/numeric_lex.h"
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070013#include "compiler/translator/SymbolTable.h"
Zhenyao Mof1d723c2013-09-23 14:57:07 -040014
Olli Etuahof541f522015-10-13 12:21:01 +030015bool atoi_clamp(const char *str, unsigned int *value)
Zhenyao Mof1d723c2013-09-23 14:57:07 -040016{
Zhenyao Mocc4ec642013-09-23 14:57:10 -040017 bool success = pp::numeric_lex_int(str, value);
18 if (!success)
Olli Etuahof541f522015-10-13 12:21:01 +030019 *value = std::numeric_limits<unsigned int>::max();
Zhenyao Mocc4ec642013-09-23 14:57:10 -040020 return success;
Zhenyao Mof1d723c2013-09-23 14:57:07 -040021}
22
Jamie Madill033dae62014-06-18 12:56:28 -040023namespace sh
24{
25
Jiawei Shao8e4b3552017-08-30 14:20:58 +080026namespace
27{
28
29bool IsInterpolationIn(TQualifier qualifier)
30{
31 switch (qualifier)
32 {
33 case EvqSmoothIn:
34 case EvqFlatIn:
35 case EvqCentroidIn:
36 return true;
37 default:
38 return false;
39 }
40}
41
42} // anonymous namespace
43
Olli Etuaho99bd5f42016-11-07 12:44:29 +000044float NumericLexFloat32OutOfRangeToInfinity(const std::string &str)
45{
46 // Parses a decimal string using scientific notation into a floating point number.
47 // Out-of-range values are converted to infinity. Values that are too small to be
48 // represented are converted to zero.
49
50 // The mantissa in decimal scientific notation. The magnitude of the mantissa integer does not
51 // matter.
52 unsigned int decimalMantissa = 0;
53 size_t i = 0;
54 bool decimalPointSeen = false;
55 bool nonZeroSeenInMantissa = false;
56
57 // The exponent offset reflects the position of the decimal point.
58 int exponentOffset = -1;
59 while (i < str.length())
60 {
61 const char c = str[i];
62 if (c == 'e' || c == 'E')
63 {
64 break;
65 }
66 if (c == '.')
67 {
68 decimalPointSeen = true;
69 ++i;
70 continue;
71 }
72
73 unsigned int digit = static_cast<unsigned int>(c - '0');
74 ASSERT(digit < 10u);
75 if (digit != 0u)
76 {
77 nonZeroSeenInMantissa = true;
78 }
79 if (nonZeroSeenInMantissa)
80 {
81 // Add bits to the mantissa until space runs out in 32-bit int. This should be
82 // enough precision to make the resulting binary mantissa accurate to 1 ULP.
83 if (decimalMantissa <= (std::numeric_limits<unsigned int>::max() - 9u) / 10u)
84 {
85 decimalMantissa = decimalMantissa * 10u + digit;
86 }
87 if (!decimalPointSeen)
88 {
89 ++exponentOffset;
90 }
91 }
92 else if (decimalPointSeen)
93 {
94 --exponentOffset;
95 }
96 ++i;
97 }
98 if (decimalMantissa == 0)
99 {
100 return 0.0f;
101 }
102 int exponent = 0;
103 if (i < str.length())
104 {
105 ASSERT(str[i] == 'e' || str[i] == 'E');
106 ++i;
107 bool exponentOutOfRange = false;
108 bool negativeExponent = false;
109 if (str[i] == '-')
110 {
111 negativeExponent = true;
112 ++i;
113 }
114 else if (str[i] == '+')
115 {
116 ++i;
117 }
118 while (i < str.length())
119 {
120 const char c = str[i];
121 unsigned int digit = static_cast<unsigned int>(c - '0');
122 ASSERT(digit < 10u);
123 if (exponent <= (std::numeric_limits<int>::max() - 9) / 10)
124 {
125 exponent = exponent * 10 + digit;
126 }
127 else
128 {
129 exponentOutOfRange = true;
130 }
131 ++i;
132 }
133 if (negativeExponent)
134 {
135 exponent = -exponent;
136 }
137 if (exponentOutOfRange)
138 {
139 if (negativeExponent)
140 {
141 return 0.0f;
142 }
143 else
144 {
145 return std::numeric_limits<float>::infinity();
146 }
147 }
148 }
149 // Do the calculation in 64-bit to avoid overflow.
150 long long exponentLong =
151 static_cast<long long>(exponent) + static_cast<long long>(exponentOffset);
152 if (exponentLong > std::numeric_limits<float>::max_exponent10)
153 {
154 return std::numeric_limits<float>::infinity();
155 }
156 else if (exponentLong < std::numeric_limits<float>::min_exponent10)
157 {
158 return 0.0f;
159 }
160 // The exponent is in range, so we need to actually evaluate the float.
161 exponent = static_cast<int>(exponentLong);
162 double value = decimalMantissa;
163
164 // Calculate the exponent offset to normalize the mantissa.
165 int normalizationExponentOffset = 0;
166 while (decimalMantissa >= 10u)
167 {
168 --normalizationExponentOffset;
169 decimalMantissa /= 10u;
170 }
171 // Apply the exponent.
172 value *= std::pow(10.0, static_cast<double>(exponent + normalizationExponentOffset));
173 if (value > static_cast<double>(std::numeric_limits<float>::max()))
174 {
175 return std::numeric_limits<float>::infinity();
176 }
177 if (value < static_cast<double>(std::numeric_limits<float>::min()))
178 {
179 return 0.0f;
180 }
181 return static_cast<float>(value);
182}
183
184bool strtof_clamp(const std::string &str, float *value)
185{
186 // Try the standard float parsing path first.
187 bool success = pp::numeric_lex_float(str, value);
188
189 // If the standard path doesn't succeed, take the path that can handle the following corner
190 // cases:
191 // 1. The decimal mantissa is very small but the exponent is very large, putting the resulting
192 // number inside the float range.
193 // 2. The decimal mantissa is very large but the exponent is very small, putting the resulting
194 // number inside the float range.
195 // 3. The value is out-of-range and should be evaluated as infinity.
196 // 4. The value is too small and should be evaluated as zero.
197 // See ESSL 3.00.6 section 4.1.4 for the relevant specification.
198 if (!success)
199 *value = NumericLexFloat32OutOfRangeToInfinity(str);
200 return !gl::isInf(*value);
201}
202
Jamie Madill033dae62014-06-18 12:56:28 -0400203GLenum GLVariableType(const TType &type)
204{
205 if (type.getBasicType() == EbtFloat)
206 {
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300207 if (type.isVector())
Jamie Madill033dae62014-06-18 12:56:28 -0400208 {
209 switch (type.getNominalSize())
210 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500211 case 2:
212 return GL_FLOAT_VEC2;
213 case 3:
214 return GL_FLOAT_VEC3;
215 case 4:
216 return GL_FLOAT_VEC4;
217 default:
218 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400219 }
220 }
221 else if (type.isMatrix())
222 {
223 switch (type.getCols())
224 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500225 case 2:
226 switch (type.getRows())
227 {
228 case 2:
229 return GL_FLOAT_MAT2;
230 case 3:
231 return GL_FLOAT_MAT2x3;
232 case 4:
233 return GL_FLOAT_MAT2x4;
234 default:
235 UNREACHABLE();
236 }
Jamie Madill033dae62014-06-18 12:56:28 -0400237
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500238 case 3:
239 switch (type.getRows())
240 {
241 case 2:
242 return GL_FLOAT_MAT3x2;
243 case 3:
244 return GL_FLOAT_MAT3;
245 case 4:
246 return GL_FLOAT_MAT3x4;
247 default:
248 UNREACHABLE();
249 }
Jamie Madill033dae62014-06-18 12:56:28 -0400250
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500251 case 4:
252 switch (type.getRows())
253 {
254 case 2:
255 return GL_FLOAT_MAT4x2;
256 case 3:
257 return GL_FLOAT_MAT4x3;
258 case 4:
259 return GL_FLOAT_MAT4;
260 default:
261 UNREACHABLE();
262 }
Jamie Madill033dae62014-06-18 12:56:28 -0400263
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500264 default:
265 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400266 }
267 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500268 else
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300269 {
270 return GL_FLOAT;
271 }
Jamie Madill033dae62014-06-18 12:56:28 -0400272 }
273 else if (type.getBasicType() == EbtInt)
274 {
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300275 if (type.isVector())
Jamie Madill033dae62014-06-18 12:56:28 -0400276 {
277 switch (type.getNominalSize())
278 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500279 case 2:
280 return GL_INT_VEC2;
281 case 3:
282 return GL_INT_VEC3;
283 case 4:
284 return GL_INT_VEC4;
285 default:
286 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400287 }
288 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500289 else
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300290 {
291 ASSERT(!type.isMatrix());
292 return GL_INT;
293 }
Jamie Madill033dae62014-06-18 12:56:28 -0400294 }
295 else if (type.getBasicType() == EbtUInt)
296 {
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300297 if (type.isVector())
Jamie Madill033dae62014-06-18 12:56:28 -0400298 {
299 switch (type.getNominalSize())
300 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500301 case 2:
302 return GL_UNSIGNED_INT_VEC2;
303 case 3:
304 return GL_UNSIGNED_INT_VEC3;
305 case 4:
306 return GL_UNSIGNED_INT_VEC4;
307 default:
308 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400309 }
310 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500311 else
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300312 {
313 ASSERT(!type.isMatrix());
314 return GL_UNSIGNED_INT;
315 }
Jamie Madill033dae62014-06-18 12:56:28 -0400316 }
317 else if (type.getBasicType() == EbtBool)
318 {
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300319 if (type.isVector())
Jamie Madill033dae62014-06-18 12:56:28 -0400320 {
321 switch (type.getNominalSize())
322 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500323 case 2:
324 return GL_BOOL_VEC2;
325 case 3:
326 return GL_BOOL_VEC3;
327 case 4:
328 return GL_BOOL_VEC4;
329 default:
330 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400331 }
332 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500333 else
Olli Etuaho37d96cc2017-07-11 14:14:03 +0300334 {
335 ASSERT(!type.isMatrix());
336 return GL_BOOL;
337 }
Jamie Madill033dae62014-06-18 12:56:28 -0400338 }
339
340 switch (type.getBasicType())
341 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500342 case EbtSampler2D:
343 return GL_SAMPLER_2D;
344 case EbtSampler3D:
345 return GL_SAMPLER_3D;
346 case EbtSamplerCube:
347 return GL_SAMPLER_CUBE;
348 case EbtSamplerExternalOES:
349 return GL_SAMPLER_EXTERNAL_OES;
Andrei Volykhina5527072017-03-22 16:46:30 +0300350 case EbtSamplerExternal2DY2YEXT:
351 return GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500352 case EbtSampler2DRect:
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400353 return GL_SAMPLER_2D_RECT_ANGLE;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500354 case EbtSampler2DArray:
355 return GL_SAMPLER_2D_ARRAY;
JiangYizhou40219322016-12-09 09:50:51 +0800356 case EbtSampler2DMS:
357 return GL_SAMPLER_2D_MULTISAMPLE;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500358 case EbtISampler2D:
359 return GL_INT_SAMPLER_2D;
360 case EbtISampler3D:
361 return GL_INT_SAMPLER_3D;
362 case EbtISamplerCube:
363 return GL_INT_SAMPLER_CUBE;
364 case EbtISampler2DArray:
365 return GL_INT_SAMPLER_2D_ARRAY;
JiangYizhou40219322016-12-09 09:50:51 +0800366 case EbtISampler2DMS:
367 return GL_INT_SAMPLER_2D_MULTISAMPLE;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500368 case EbtUSampler2D:
369 return GL_UNSIGNED_INT_SAMPLER_2D;
370 case EbtUSampler3D:
371 return GL_UNSIGNED_INT_SAMPLER_3D;
372 case EbtUSamplerCube:
373 return GL_UNSIGNED_INT_SAMPLER_CUBE;
374 case EbtUSampler2DArray:
375 return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
JiangYizhou40219322016-12-09 09:50:51 +0800376 case EbtUSampler2DMS:
377 return GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500378 case EbtSampler2DShadow:
379 return GL_SAMPLER_2D_SHADOW;
380 case EbtSamplerCubeShadow:
381 return GL_SAMPLER_CUBE_SHADOW;
382 case EbtSampler2DArrayShadow:
383 return GL_SAMPLER_2D_ARRAY_SHADOW;
384 case EbtImage2D:
385 return GL_IMAGE_2D;
386 case EbtIImage2D:
387 return GL_INT_IMAGE_2D;
388 case EbtUImage2D:
389 return GL_UNSIGNED_INT_IMAGE_2D;
390 case EbtImage2DArray:
391 return GL_IMAGE_2D_ARRAY;
392 case EbtIImage2DArray:
393 return GL_INT_IMAGE_2D_ARRAY;
394 case EbtUImage2DArray:
395 return GL_UNSIGNED_INT_IMAGE_2D_ARRAY;
396 case EbtImage3D:
397 return GL_IMAGE_3D;
398 case EbtIImage3D:
399 return GL_INT_IMAGE_3D;
400 case EbtUImage3D:
401 return GL_UNSIGNED_INT_IMAGE_3D;
402 case EbtImageCube:
403 return GL_IMAGE_CUBE;
404 case EbtIImageCube:
405 return GL_INT_IMAGE_CUBE;
406 case EbtUImageCube:
407 return GL_UNSIGNED_INT_IMAGE_CUBE;
jchen104cdac9e2017-05-08 11:01:20 +0800408 case EbtAtomicCounter:
409 return GL_UNSIGNED_INT_ATOMIC_COUNTER;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500410 default:
411 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400412 }
413
414 return GL_NONE;
415}
416
417GLenum GLVariablePrecision(const TType &type)
418{
419 if (type.getBasicType() == EbtFloat)
420 {
421 switch (type.getPrecision())
422 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500423 case EbpHigh:
424 return GL_HIGH_FLOAT;
425 case EbpMedium:
426 return GL_MEDIUM_FLOAT;
427 case EbpLow:
428 return GL_LOW_FLOAT;
429 case EbpUndefined:
430 // Should be defined as the default precision by the parser
431 default:
432 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400433 }
434 }
435 else if (type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt)
436 {
437 switch (type.getPrecision())
438 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500439 case EbpHigh:
440 return GL_HIGH_INT;
441 case EbpMedium:
442 return GL_MEDIUM_INT;
443 case EbpLow:
444 return GL_LOW_INT;
445 case EbpUndefined:
446 // Should be defined as the default precision by the parser
447 default:
448 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400449 }
450 }
451
452 // Other types (boolean, sampler) don't have a precision
453 return GL_NONE;
454}
455
456TString ArrayString(const TType &type)
457{
Olli Etuaho96f6adf2017-08-16 11:18:54 +0300458 TStringStream arrayString;
459 const TVector<unsigned int> &arraySizes = type.getArraySizes();
460 for (auto arraySizeIter = arraySizes.rbegin(); arraySizeIter != arraySizes.rend();
461 ++arraySizeIter)
Jamie Madill033dae62014-06-18 12:56:28 -0400462 {
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800463 arrayString << "[";
464 if (*arraySizeIter > 0)
465 {
466 arrayString << (*arraySizeIter);
467 }
468 arrayString << "]";
Jamie Madill033dae62014-06-18 12:56:28 -0400469 }
Olli Etuaho96f6adf2017-08-16 11:18:54 +0300470 return arrayString.str();
Jamie Madill033dae62014-06-18 12:56:28 -0400471}
472
Jamie Madill6276b922017-09-25 02:35:57 -0400473TString GetTypeName(const TType &type, ShHashFunction64 hashFunction, NameMap *nameMap)
474{
475 if (type.getBasicType() == EbtStruct)
476 return HashName(TName(type.getStruct()->name()), hashFunction, nameMap);
477 else
478 return type.getBuiltInTypeNameString();
479}
480
Jamie Madill033dae62014-06-18 12:56:28 -0400481bool IsVaryingOut(TQualifier qualifier)
482{
483 switch (qualifier)
484 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500485 case EvqVaryingOut:
486 case EvqSmoothOut:
487 case EvqFlatOut:
488 case EvqCentroidOut:
489 case EvqVertexOut:
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800490 case EvqGeometryOut:
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500491 return true;
Jamie Madill033dae62014-06-18 12:56:28 -0400492
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500493 default:
494 break;
Jamie Madill033dae62014-06-18 12:56:28 -0400495 }
496
497 return false;
498}
499
500bool IsVaryingIn(TQualifier qualifier)
501{
502 switch (qualifier)
503 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500504 case EvqVaryingIn:
505 case EvqSmoothIn:
506 case EvqFlatIn:
507 case EvqCentroidIn:
508 case EvqFragmentIn:
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800509 case EvqGeometryIn:
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500510 return true;
Jamie Madill033dae62014-06-18 12:56:28 -0400511
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500512 default:
513 break;
Jamie Madill033dae62014-06-18 12:56:28 -0400514 }
515
516 return false;
517}
518
519bool IsVarying(TQualifier qualifier)
520{
521 return IsVaryingIn(qualifier) || IsVaryingOut(qualifier);
522}
523
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800524bool IsGeometryShaderInput(GLenum shaderType, TQualifier qualifier)
525{
526 return (qualifier == EvqGeometryIn) ||
527 ((shaderType == GL_GEOMETRY_SHADER_OES) && IsInterpolationIn(qualifier));
528}
529
Jamie Madillf2575982014-06-25 16:04:54 -0400530InterpolationType GetInterpolationType(TQualifier qualifier)
Jamie Madill033dae62014-06-18 12:56:28 -0400531{
532 switch (qualifier)
533 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500534 case EvqFlatIn:
535 case EvqFlatOut:
536 return INTERPOLATION_FLAT;
Jamie Madill033dae62014-06-18 12:56:28 -0400537
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500538 case EvqSmoothIn:
539 case EvqSmoothOut:
540 case EvqVertexOut:
541 case EvqFragmentIn:
542 case EvqVaryingIn:
543 case EvqVaryingOut:
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800544 case EvqGeometryIn:
545 case EvqGeometryOut:
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500546 return INTERPOLATION_SMOOTH;
Jamie Madill033dae62014-06-18 12:56:28 -0400547
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500548 case EvqCentroidIn:
549 case EvqCentroidOut:
550 return INTERPOLATION_CENTROID;
Jamie Madill033dae62014-06-18 12:56:28 -0400551
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500552 default:
553 UNREACHABLE();
554 return INTERPOLATION_SMOOTH;
Jamie Madill033dae62014-06-18 12:56:28 -0400555 }
556}
557
Corentin Wallez509e4562016-08-25 14:55:44 -0400558TType GetShaderVariableBasicType(const sh::ShaderVariable &var)
Zhenyao Mo72111912016-07-20 17:45:56 -0700559{
Corentin Wallez509e4562016-08-25 14:55:44 -0400560 switch (var.type)
Zhenyao Mo72111912016-07-20 17:45:56 -0700561 {
Qin Jiajia7835b522016-10-08 11:20:17 +0800562 case GL_BOOL:
563 return TType(EbtBool);
564 case GL_BOOL_VEC2:
565 return TType(EbtBool, 2);
566 case GL_BOOL_VEC3:
567 return TType(EbtBool, 3);
568 case GL_BOOL_VEC4:
569 return TType(EbtBool, 4);
Zhenyao Mo72111912016-07-20 17:45:56 -0700570 case GL_FLOAT:
571 return TType(EbtFloat);
572 case GL_FLOAT_VEC2:
573 return TType(EbtFloat, 2);
574 case GL_FLOAT_VEC3:
575 return TType(EbtFloat, 3);
576 case GL_FLOAT_VEC4:
577 return TType(EbtFloat, 4);
578 case GL_FLOAT_MAT2:
579 return TType(EbtFloat, 2, 2);
580 case GL_FLOAT_MAT3:
581 return TType(EbtFloat, 3, 3);
582 case GL_FLOAT_MAT4:
583 return TType(EbtFloat, 4, 4);
584 case GL_FLOAT_MAT2x3:
585 return TType(EbtFloat, 2, 3);
586 case GL_FLOAT_MAT2x4:
587 return TType(EbtFloat, 2, 4);
588 case GL_FLOAT_MAT3x2:
589 return TType(EbtFloat, 3, 2);
590 case GL_FLOAT_MAT3x4:
591 return TType(EbtFloat, 3, 4);
592 case GL_FLOAT_MAT4x2:
593 return TType(EbtFloat, 4, 2);
594 case GL_FLOAT_MAT4x3:
595 return TType(EbtFloat, 4, 3);
596 case GL_INT:
597 return TType(EbtInt);
598 case GL_INT_VEC2:
599 return TType(EbtInt, 2);
600 case GL_INT_VEC3:
601 return TType(EbtInt, 3);
602 case GL_INT_VEC4:
603 return TType(EbtInt, 4);
604 case GL_UNSIGNED_INT:
605 return TType(EbtUInt);
606 case GL_UNSIGNED_INT_VEC2:
607 return TType(EbtUInt, 2);
608 case GL_UNSIGNED_INT_VEC3:
609 return TType(EbtUInt, 3);
610 case GL_UNSIGNED_INT_VEC4:
611 return TType(EbtUInt, 4);
612 default:
613 UNREACHABLE();
614 return TType();
615 }
616}
617
Martin Radev70866b82016-07-22 15:27:42 +0300618// GLSL ES 1.0.17 4.6.1 The Invariant Qualifier
619bool CanBeInvariantESSL1(TQualifier qualifier)
620{
621 return IsVaryingIn(qualifier) || IsVaryingOut(qualifier) ||
622 IsBuiltinOutputVariable(qualifier) ||
623 (IsBuiltinFragmentInputVariable(qualifier) && qualifier != EvqFrontFacing);
Jamie Madill033dae62014-06-18 12:56:28 -0400624}
Martin Radev70866b82016-07-22 15:27:42 +0300625
626// GLSL ES 3.00 Revision 6, 4.6.1 The Invariant Qualifier
627// GLSL ES 3.10 Revision 4, 4.8.1 The Invariant Qualifier
628bool CanBeInvariantESSL3OrGreater(TQualifier qualifier)
629{
630 return IsVaryingOut(qualifier) || qualifier == EvqFragmentOut ||
631 IsBuiltinOutputVariable(qualifier);
632}
633
634bool IsBuiltinOutputVariable(TQualifier qualifier)
635{
636 switch (qualifier)
637 {
638 case EvqPosition:
639 case EvqPointSize:
640 case EvqFragDepth:
641 case EvqFragDepthEXT:
642 case EvqFragColor:
643 case EvqSecondaryFragColorEXT:
644 case EvqFragData:
645 case EvqSecondaryFragDataEXT:
646 return true;
647 default:
648 break;
649 }
650 return false;
651}
652
653bool IsBuiltinFragmentInputVariable(TQualifier qualifier)
654{
655 switch (qualifier)
656 {
657 case EvqFragCoord:
658 case EvqPointCoord:
659 case EvqFrontFacing:
660 return true;
661 default:
662 break;
663 }
664 return false;
665}
Martin Radeve469de82017-07-04 11:58:35 +0300666
667bool IsOutputESSL(ShShaderOutput output)
668{
669 return output == SH_ESSL_OUTPUT;
670}
671
672bool IsOutputGLSL(ShShaderOutput output)
673{
674 switch (output)
675 {
676 case SH_GLSL_130_OUTPUT:
677 case SH_GLSL_140_OUTPUT:
678 case SH_GLSL_150_CORE_OUTPUT:
679 case SH_GLSL_330_CORE_OUTPUT:
680 case SH_GLSL_400_CORE_OUTPUT:
681 case SH_GLSL_410_CORE_OUTPUT:
682 case SH_GLSL_420_CORE_OUTPUT:
683 case SH_GLSL_430_CORE_OUTPUT:
684 case SH_GLSL_440_CORE_OUTPUT:
685 case SH_GLSL_450_CORE_OUTPUT:
686 case SH_GLSL_COMPATIBILITY_OUTPUT:
687 return true;
688 default:
689 break;
690 }
691 return false;
692}
693bool IsOutputHLSL(ShShaderOutput output)
694{
695 switch (output)
696 {
697 case SH_HLSL_3_0_OUTPUT:
698 case SH_HLSL_4_1_OUTPUT:
699 case SH_HLSL_4_0_FL9_3_OUTPUT:
700 return true;
701 default:
702 break;
703 }
704 return false;
705}
706bool IsOutputVulkan(ShShaderOutput output)
707{
708 return output == SH_GLSL_VULKAN_OUTPUT;
709}
710
Martin Radev70866b82016-07-22 15:27:42 +0300711} // namespace sh