blob: b28eda169695fedd4411e6a5373a6725be9f89c4 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +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//
8// Symbol table for parsing. Most functionaliy and main ideas
9// are documented in the header file.
10//
11
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +000012#if defined(_MSC_VER)
Jamie Madilld7b1ab52016-12-12 14:42:19 -050013#pragma warning(disable : 4718)
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +000014#endif
15
Geoff Lang17732822013-08-29 13:46:49 -040016#include "compiler/translator/SymbolTable.h"
Dmitry Skiba01971112015-07-10 14:54:00 -040017#include "compiler/translator/Cache.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018
apatrick@chromium.org8187fa82010-06-15 22:09:28 +000019#include <stdio.h>
kbr@chromium.org476541f2011-10-27 21:14:51 +000020#include <algorithm>
21
Jamie Madill45bcc782016-11-07 13:58:48 -050022namespace sh
23{
24
Jamie Madillbfa91f42014-06-05 15:45:18 -040025int TSymbolTable::uniqueIdCounter = 0;
Nicolas Capensbd10cf52013-06-20 09:51:51 -040026
Olli Etuaho476197f2016-10-11 13:59:08 +010027TSymbol::TSymbol(const TString *n) : uniqueId(TSymbolTable::nextUniqueId()), name(n)
28{
29}
30
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032// Functions have buried pointers to delete.
33//
34TFunction::~TFunction()
35{
Olli Etuaho476197f2016-10-11 13:59:08 +010036 clearParameters();
37}
38
39void TFunction::clearParameters()
40{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000041 for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)
42 delete (*i).type;
Olli Etuaho476197f2016-10-11 13:59:08 +010043 parameters.clear();
44 mangledName = nullptr;
45}
46
47void TFunction::swapParameters(const TFunction &parametersSource)
48{
49 clearParameters();
50 for (auto parameter : parametersSource.parameters)
51 {
52 addParameter(parameter);
53 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054}
55
Dmitry Skiba58832202015-07-06 16:11:13 -070056const TString *TFunction::buildMangledName() const
57{
Cooper Partin149e6e62015-08-07 16:18:18 -070058 std::string newName = mangleName(getName()).c_str();
Dmitry Skiba58832202015-07-06 16:11:13 -070059
60 for (const auto &p : parameters)
61 {
Cooper Partin149e6e62015-08-07 16:18:18 -070062 newName += p.type->getMangledName().c_str();
Dmitry Skiba58832202015-07-06 16:11:13 -070063 }
64
Cooper Partin149e6e62015-08-07 16:18:18 -070065 return NewPoolTString(newName.c_str());
Dmitry Skiba58832202015-07-06 16:11:13 -070066}
67
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068//
69// Symbol table levels are a map of pointers to symbols that have to be deleted.
70//
71TSymbolTableLevel::~TSymbolTableLevel()
72{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000073 for (tLevel::iterator it = level.begin(); it != level.end(); ++it)
74 delete (*it).second;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075}
76
Nicolas Capensadfffe42014-06-17 02:13:36 -040077bool TSymbolTableLevel::insert(TSymbol *symbol)
Jamie Madillbfa91f42014-06-05 15:45:18 -040078{
Jamie Madillbfa91f42014-06-05 15:45:18 -040079 // returning true means symbol was added to the table
Nicolas Capensadfffe42014-06-17 02:13:36 -040080 tInsertResult result = level.insert(tLevelPair(symbol->getMangledName(), symbol));
Jamie Madillbfa91f42014-06-05 15:45:18 -040081
82 return result.second;
83}
84
Olli Etuahob2983c92015-03-18 14:02:46 +020085bool TSymbolTableLevel::insertUnmangled(TFunction *function)
86{
Olli Etuahob2983c92015-03-18 14:02:46 +020087 // returning true means symbol was added to the table
88 tInsertResult result = level.insert(tLevelPair(function->getName(), function));
89
90 return result.second;
91}
92
Jamie Madillbfa91f42014-06-05 15:45:18 -040093TSymbol *TSymbolTableLevel::find(const TString &name) const
94{
95 tLevel::const_iterator it = level.find(name);
96 if (it == level.end())
97 return 0;
98 else
99 return (*it).second;
100}
101
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500102TSymbol *TSymbolTable::find(const TString &name,
103 int shaderVersion,
104 bool *builtIn,
105 bool *sameScope) const
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000106{
107 int level = currentLevel();
108 TSymbol *symbol;
109
110 do
111 {
Martin Radeve93d24e2016-07-28 12:06:05 +0300112 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
113 level--;
114 if (level == ESSL3_BUILTINS && shaderVersion < 300)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700115 level--;
116 if (level == ESSL1_BUILTINS && shaderVersion != 100)
117 level--;
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000118
119 symbol = table[level]->find(name);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500120 } while (symbol == 0 && --level >= 0);
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000121
122 if (builtIn)
123 *builtIn = (level <= LAST_BUILTIN_LEVEL);
124 if (sameScope)
125 *sameScope = (level == currentLevel());
126
127 return symbol;
128}
129
Zhenyao Mod7490962016-11-09 15:49:51 -0800130TSymbol *TSymbolTable::findGlobal(const TString &name) const
131{
132 ASSERT(table.size() > GLOBAL_LEVEL);
133 return table[GLOBAL_LEVEL]->find(name);
134}
135
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500136TSymbol *TSymbolTable::findBuiltIn(const TString &name, int shaderVersion) const
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000137{
138 for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--)
139 {
Martin Radeve93d24e2016-07-28 12:06:05 +0300140 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
141 level--;
142 if (level == ESSL3_BUILTINS && shaderVersion < 300)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700143 level--;
144 if (level == ESSL1_BUILTINS && shaderVersion != 100)
145 level--;
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000146
147 TSymbol *symbol = table[level]->find(name);
148
149 if (symbol)
150 return symbol;
151 }
152
153 return 0;
154}
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400155
156TSymbolTable::~TSymbolTable()
157{
158 while (table.size() > 0)
159 pop();
160}
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700161
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500162bool IsGenType(const TType *type)
163{
164 if (type)
165 {
166 TBasicType basicType = type->getBasicType();
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500167 return basicType == EbtGenType || basicType == EbtGenIType || basicType == EbtGenUType ||
168 basicType == EbtGenBType;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500169 }
170
171 return false;
172}
173
174bool IsVecType(const TType *type)
175{
176 if (type)
177 {
178 TBasicType basicType = type->getBasicType();
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500179 return basicType == EbtVec || basicType == EbtIVec || basicType == EbtUVec ||
180 basicType == EbtBVec;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500181 }
182
183 return false;
184}
185
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700186const TType *SpecificType(const TType *type, int size)
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500187{
188 ASSERT(size >= 1 && size <= 4);
189
190 if (!type)
191 {
192 return nullptr;
193 }
194
195 ASSERT(!IsVecType(type));
196
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500197 switch (type->getBasicType())
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500198 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500199 case EbtGenType:
200 return TCache::getType(EbtFloat, static_cast<unsigned char>(size));
201 case EbtGenIType:
202 return TCache::getType(EbtInt, static_cast<unsigned char>(size));
203 case EbtGenUType:
204 return TCache::getType(EbtUInt, static_cast<unsigned char>(size));
205 case EbtGenBType:
206 return TCache::getType(EbtBool, static_cast<unsigned char>(size));
207 default:
208 return type;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500209 }
210}
211
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700212const TType *VectorType(const TType *type, int size)
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500213{
214 ASSERT(size >= 2 && size <= 4);
215
216 if (!type)
217 {
218 return nullptr;
219 }
220
221 ASSERT(!IsGenType(type));
222
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500223 switch (type->getBasicType())
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500224 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500225 case EbtVec:
226 return TCache::getType(EbtFloat, static_cast<unsigned char>(size));
227 case EbtIVec:
228 return TCache::getType(EbtInt, static_cast<unsigned char>(size));
229 case EbtUVec:
230 return TCache::getType(EbtUInt, static_cast<unsigned char>(size));
231 case EbtBVec:
232 return TCache::getType(EbtBool, static_cast<unsigned char>(size));
233 default:
234 return type;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500235 }
236}
237
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500238void TSymbolTable::insertBuiltIn(ESymbolLevel level,
239 TOperator op,
240 const char *ext,
241 const TType *rvalue,
242 const char *name,
243 const TType *ptype1,
244 const TType *ptype2,
245 const TType *ptype3,
246 const TType *ptype4,
247 const TType *ptype5)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700248{
249 if (ptype1->getBasicType() == EbtGSampler2D)
250 {
Martin Radevda6254b2016-12-14 17:00:36 +0200251 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700252 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500253 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
254 TCache::getType(EbtSampler2D), ptype2, ptype3, ptype4, ptype5);
255 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
256 TCache::getType(EbtISampler2D), ptype2, ptype3, ptype4, ptype5);
257 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
258 TCache::getType(EbtUSampler2D), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700259 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500260 else if (ptype1->getBasicType() == EbtGSampler3D)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700261 {
Martin Radevda6254b2016-12-14 17:00:36 +0200262 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700263 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500264 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
265 TCache::getType(EbtSampler3D), ptype2, ptype3, ptype4, ptype5);
266 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
267 TCache::getType(EbtISampler3D), ptype2, ptype3, ptype4, ptype5);
268 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
269 TCache::getType(EbtUSampler3D), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700270 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500271 else if (ptype1->getBasicType() == EbtGSamplerCube)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700272 {
Martin Radevda6254b2016-12-14 17:00:36 +0200273 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700274 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500275 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
276 TCache::getType(EbtSamplerCube), ptype2, ptype3, ptype4, ptype5);
277 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
278 TCache::getType(EbtISamplerCube), ptype2, ptype3, ptype4, ptype5);
279 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
280 TCache::getType(EbtUSamplerCube), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700281 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500282 else if (ptype1->getBasicType() == EbtGSampler2DArray)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700283 {
Martin Radevda6254b2016-12-14 17:00:36 +0200284 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700285 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500286 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
287 TCache::getType(EbtSampler2DArray), ptype2, ptype3, ptype4, ptype5);
288 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
289 TCache::getType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5);
290 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
291 TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700292 }
JiangYizhou40219322016-12-09 09:50:51 +0800293 else if (ptype1->getBasicType() == EbtGSampler2DMS)
294 {
295 insertUnmangledBuiltInName(name, level);
296 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
297 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
298 TCache::getType(EbtSampler2DMS), ptype2, ptype3, ptype4, ptype5);
299 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
300 TCache::getType(EbtISampler2DMS), ptype2, ptype3, ptype4, ptype5);
301 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
302 TCache::getType(EbtUSampler2DMS), ptype2, ptype3, ptype4, ptype5);
303 }
Martin Radev2cc85b32016-08-05 16:22:53 +0300304 else if (IsGImage(ptype1->getBasicType()))
305 {
Martin Radevda6254b2016-12-14 17:00:36 +0200306 insertUnmangledBuiltInName(name, level);
Martin Radev2cc85b32016-08-05 16:22:53 +0300307
308 const TType *floatType = TCache::getType(EbtFloat, 4);
309 const TType *intType = TCache::getType(EbtInt, 4);
310 const TType *unsignedType = TCache::getType(EbtUInt, 4);
311
312 const TType *floatImage =
313 TCache::getType(convertGImageToFloatImage(ptype1->getBasicType()));
314 const TType *intImage = TCache::getType(convertGImageToIntImage(ptype1->getBasicType()));
315 const TType *unsignedImage =
316 TCache::getType(convertGImageToUnsignedImage(ptype1->getBasicType()));
317
318 // GLSL ES 3.10, Revision 4, 8.12 Image Functions
319 if (rvalue->getBasicType() == EbtGVec4)
320 {
321 // imageLoad
322 insertBuiltIn(level, floatType, name, floatImage, ptype2, ptype3, ptype4, ptype5);
323 insertBuiltIn(level, intType, name, intImage, ptype2, ptype3, ptype4, ptype5);
324 insertBuiltIn(level, unsignedType, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
325 }
326 else if (rvalue->getBasicType() == EbtVoid)
327 {
328 // imageStore
329 insertBuiltIn(level, rvalue, name, floatImage, ptype2, floatType, ptype4, ptype5);
330 insertBuiltIn(level, rvalue, name, intImage, ptype2, intType, ptype4, ptype5);
331 insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, unsignedType, ptype4, ptype5);
332 }
333 else
334 {
335 // imageSize
336 insertBuiltIn(level, rvalue, name, floatImage, ptype2, ptype3, ptype4, ptype5);
337 insertBuiltIn(level, rvalue, name, intImage, ptype2, ptype3, ptype4, ptype5);
338 insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
339 }
340 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500341 else if (IsGenType(rvalue) || IsGenType(ptype1) || IsGenType(ptype2) || IsGenType(ptype3))
342 {
343 ASSERT(!ptype4 && !ptype5);
Martin Radevda6254b2016-12-14 17:00:36 +0200344 insertUnmangledBuiltInName(name, level);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500345 insertBuiltIn(level, op, ext, SpecificType(rvalue, 1), name, SpecificType(ptype1, 1),
346 SpecificType(ptype2, 1), SpecificType(ptype3, 1));
347 insertBuiltIn(level, op, ext, SpecificType(rvalue, 2), name, SpecificType(ptype1, 2),
348 SpecificType(ptype2, 2), SpecificType(ptype3, 2));
349 insertBuiltIn(level, op, ext, SpecificType(rvalue, 3), name, SpecificType(ptype1, 3),
350 SpecificType(ptype2, 3), SpecificType(ptype3, 3));
351 insertBuiltIn(level, op, ext, SpecificType(rvalue, 4), name, SpecificType(ptype1, 4),
352 SpecificType(ptype2, 4), SpecificType(ptype3, 4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500353 }
354 else if (IsVecType(rvalue) || IsVecType(ptype1) || IsVecType(ptype2) || IsVecType(ptype3))
355 {
356 ASSERT(!ptype4 && !ptype5);
Martin Radevda6254b2016-12-14 17:00:36 +0200357 insertUnmangledBuiltInName(name, level);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500358 insertBuiltIn(level, op, ext, VectorType(rvalue, 2), name, VectorType(ptype1, 2),
359 VectorType(ptype2, 2), VectorType(ptype3, 2));
360 insertBuiltIn(level, op, ext, VectorType(rvalue, 3), name, VectorType(ptype1, 3),
361 VectorType(ptype2, 3), VectorType(ptype3, 3));
362 insertBuiltIn(level, op, ext, VectorType(rvalue, 4), name, VectorType(ptype1, 4),
363 VectorType(ptype2, 4), VectorType(ptype3, 4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500364 }
365 else
366 {
Dmitry Skiba7f17a502015-06-22 15:08:39 -0700367 TFunction *function = new TFunction(NewPoolTString(name), rvalue, op, ext);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700368
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700369 function->addParameter(TConstParameter(ptype1));
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700370
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500371 if (ptype2)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700372 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700373 function->addParameter(TConstParameter(ptype2));
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700374 }
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700375
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500376 if (ptype3)
377 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700378 function->addParameter(TConstParameter(ptype3));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500379 }
380
381 if (ptype4)
382 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700383 function->addParameter(TConstParameter(ptype4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500384 }
385
386 if (ptype5)
387 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700388 function->addParameter(TConstParameter(ptype5));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500389 }
390
Martin Radevda6254b2016-12-14 17:00:36 +0200391 ASSERT(hasUnmangledBuiltInAtLevel(name, level));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500392 insert(level, function);
393 }
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700394}
395
Martin Radevd7c5b0a2016-07-27 14:04:43 +0300396void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level,
397 TOperator op,
398 const TType *rvalue,
399 const char *name)
400{
401 insertUnmangledBuiltInName(name, level);
402 insert(level, new TFunction(NewPoolTString(name), rvalue, op));
403}
404
Zhenyao Moe740add2014-07-18 17:01:01 -0700405TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700406{
407 if (!SupportsPrecision(type))
408 return EbpUndefined;
409
410 // unsigned integers use the same precision as signed
411 TBasicType baseType = (type == EbtUInt) ? EbtInt : type;
412
413 int level = static_cast<int>(precisionStack.size()) - 1;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500414 assert(level >= 0); // Just to be safe. Should not happen.
Olli Etuaho183d7e22015-11-20 15:59:09 +0200415 // If we dont find anything we return this. Some types don't have predefined default precision.
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700416 TPrecision prec = EbpUndefined;
417 while (level >= 0)
418 {
419 PrecisionStackLevel::iterator it = precisionStack[level]->find(baseType);
420 if (it != precisionStack[level]->end())
421 {
422 prec = (*it).second;
423 break;
424 }
425 level--;
426 }
427 return prec;
428}
Jamie Madill45bcc782016-11-07 13:58:48 -0500429
Martin Radevda6254b2016-12-14 17:00:36 +0200430void TSymbolTable::insertUnmangledBuiltInName(const char *name, ESymbolLevel level)
431{
432 ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size()));
433 table[level]->insertUnmangledBuiltInName(std::string(name));
434}
435
436bool TSymbolTable::hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level)
437{
438 ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size()));
439 return table[level]->hasUnmangledBuiltIn(std::string(name));
440}
441
442bool TSymbolTable::hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion)
443{
444 ASSERT(static_cast<ESymbolLevel>(table.size()) > LAST_BUILTIN_LEVEL);
445
446 for (int level = LAST_BUILTIN_LEVEL; level >= 0; --level)
447 {
448 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
449 {
450 --level;
451 }
452 if (level == ESSL3_BUILTINS && shaderVersion < 300)
453 {
454 --level;
455 }
456 if (level == ESSL1_BUILTINS && shaderVersion != 100)
457 {
458 --level;
459 }
460
461 if (table[level]->hasUnmangledBuiltIn(name))
462 {
463 return true;
464 }
465 }
466 return false;
467}
468
Jamie Madill45bcc782016-11-07 13:58:48 -0500469} // namespace sh