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.
7 #include "compiler/translator/util.h"
11 #include "compiler/preprocessor/numeric_lex.h"
12 #include "compiler/translator/SymbolTable.h"
13 #include "common/utilities.h"
15 bool atof_clamp(const char *str, float *value)
17 bool success = pp::numeric_lex_float(str, value);
19 *value = std::numeric_limits<float>::max();
23 bool atoi_clamp(const char *str, int *value)
25 bool success = pp::numeric_lex_int(str, value);
27 *value = std::numeric_limits<int>::max();
34 GLenum GLVariableType(const TType &type)
36 if (type.getBasicType() == EbtFloat)
42 else if (type.isVector())
44 switch (type.getNominalSize())
46 case 2: return GL_FLOAT_VEC2;
47 case 3: return GL_FLOAT_VEC3;
48 case 4: return GL_FLOAT_VEC4;
49 default: UNREACHABLE();
52 else if (type.isMatrix())
54 switch (type.getCols())
57 switch (type.getRows())
59 case 2: return GL_FLOAT_MAT2;
60 case 3: return GL_FLOAT_MAT2x3;
61 case 4: return GL_FLOAT_MAT2x4;
62 default: UNREACHABLE();
66 switch (type.getRows())
68 case 2: return GL_FLOAT_MAT3x2;
69 case 3: return GL_FLOAT_MAT3;
70 case 4: return GL_FLOAT_MAT3x4;
71 default: UNREACHABLE();
75 switch (type.getRows())
77 case 2: return GL_FLOAT_MAT4x2;
78 case 3: return GL_FLOAT_MAT4x3;
79 case 4: return GL_FLOAT_MAT4;
80 default: UNREACHABLE();
83 default: UNREACHABLE();
88 else if (type.getBasicType() == EbtInt)
94 else if (type.isVector())
96 switch (type.getNominalSize())
98 case 2: return GL_INT_VEC2;
99 case 3: return GL_INT_VEC3;
100 case 4: return GL_INT_VEC4;
101 default: UNREACHABLE();
106 else if (type.getBasicType() == EbtUInt)
110 return GL_UNSIGNED_INT;
112 else if (type.isVector())
114 switch (type.getNominalSize())
116 case 2: return GL_UNSIGNED_INT_VEC2;
117 case 3: return GL_UNSIGNED_INT_VEC3;
118 case 4: return GL_UNSIGNED_INT_VEC4;
119 default: UNREACHABLE();
124 else if (type.getBasicType() == EbtBool)
130 else if (type.isVector())
132 switch (type.getNominalSize())
134 case 2: return GL_BOOL_VEC2;
135 case 3: return GL_BOOL_VEC3;
136 case 4: return GL_BOOL_VEC4;
137 default: UNREACHABLE();
143 switch (type.getBasicType())
145 case EbtSampler2D: return GL_SAMPLER_2D;
146 case EbtSampler3D: return GL_SAMPLER_3D;
147 case EbtSamplerCube: return GL_SAMPLER_CUBE;
148 case EbtSamplerExternalOES: return GL_SAMPLER_EXTERNAL_OES;
149 case EbtSampler2DRect: return GL_SAMPLER_2D_RECT_ARB;
150 case EbtSampler2DArray: return GL_SAMPLER_2D_ARRAY;
151 case EbtISampler2D: return GL_INT_SAMPLER_2D;
152 case EbtISampler3D: return GL_INT_SAMPLER_3D;
153 case EbtISamplerCube: return GL_INT_SAMPLER_CUBE;
154 case EbtISampler2DArray: return GL_INT_SAMPLER_2D_ARRAY;
155 case EbtUSampler2D: return GL_UNSIGNED_INT_SAMPLER_2D;
156 case EbtUSampler3D: return GL_UNSIGNED_INT_SAMPLER_3D;
157 case EbtUSamplerCube: return GL_UNSIGNED_INT_SAMPLER_CUBE;
158 case EbtUSampler2DArray: return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
159 case EbtSampler2DShadow: return GL_SAMPLER_2D_SHADOW;
160 case EbtSamplerCubeShadow: return GL_SAMPLER_CUBE_SHADOW;
161 case EbtSampler2DArrayShadow: return GL_SAMPLER_2D_ARRAY_SHADOW;
162 default: UNREACHABLE();
168 GLenum GLVariablePrecision(const TType &type)
170 if (type.getBasicType() == EbtFloat)
172 switch (type.getPrecision())
175 return GL_HIGH_FLOAT;
177 return GL_MEDIUM_FLOAT;
181 // Should be defined as the default precision by the parser
186 else if (type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt)
188 switch (type.getPrecision())
193 return GL_MEDIUM_INT;
197 // Should be defined as the default precision by the parser
203 // Other types (boolean, sampler) don't have a precision
207 TString ArrayString(const TType &type)
214 return "[" + str(type.getArraySize()) + "]";
217 bool IsVaryingOut(TQualifier qualifier)
222 case EvqInvariantVaryingOut:
235 bool IsVaryingIn(TQualifier qualifier)
240 case EvqInvariantVaryingIn:
253 bool IsVarying(TQualifier qualifier)
255 return IsVaryingIn(qualifier) || IsVaryingOut(qualifier);
258 InterpolationType GetInterpolationType(TQualifier qualifier)
264 return INTERPOLATION_FLAT;
272 case EvqInvariantVaryingIn:
273 case EvqInvariantVaryingOut:
274 return INTERPOLATION_SMOOTH;
278 return INTERPOLATION_CENTROID;
280 default: UNREACHABLE();
281 return INTERPOLATION_SMOOTH;
285 GetVariableTraverser::GetVariableTraverser(const TSymbolTable &symbolTable)
286 : mSymbolTable(symbolTable)
290 template void GetVariableTraverser::setTypeSpecificInfo(
291 const TType &type, const TString& name, InterfaceBlockField *variable);
292 template void GetVariableTraverser::setTypeSpecificInfo(
293 const TType &type, const TString& name, ShaderVariable *variable);
294 template void GetVariableTraverser::setTypeSpecificInfo(
295 const TType &type, const TString& name, Uniform *variable);
298 void GetVariableTraverser::setTypeSpecificInfo(
299 const TType &type, const TString& name, Varying *variable)
302 switch (type.getQualifier())
304 case EvqInvariantVaryingIn:
305 case EvqInvariantVaryingOut:
306 variable->isInvariant = true;
310 if (mSymbolTable.isVaryingInvariant(name))
312 variable->isInvariant = true;
319 variable->interpolation = GetInterpolationType(type.getQualifier());
322 template <typename VarT>
323 void GetVariableTraverser::traverse(const TType &type,
325 std::vector<VarT> *output)
327 const TStructure *structure = type.getStruct();
330 variable.name = name.c_str();
331 variable.arraySize = static_cast<unsigned int>(type.getArraySize());
335 variable.type = GLVariableType(type);
336 variable.precision = GLVariablePrecision(type);
340 // Note: this enum value is not exposed outside ANGLE
341 variable.type = GL_STRUCT_ANGLEX;
342 variable.structName = structure->name().c_str();
344 const TFieldList &fields = structure->fields();
346 for (size_t fieldIndex = 0; fieldIndex < fields.size(); fieldIndex++)
348 TField *field = fields[fieldIndex];
349 traverse(*field->type(), field->name(), &variable.fields);
352 setTypeSpecificInfo(type, name, &variable);
353 visitVariable(&variable);
356 output->push_back(variable);
359 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<InterfaceBlockField> *);
360 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<ShaderVariable> *);
361 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<Uniform> *);
362 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<Varying> *);