blob: 3ba0223a21f6b247361137c616edad401fb6055a [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"
Olli Etuaho01d0ad02017-01-22 14:51:23 -080017
Dmitry Skiba01971112015-07-10 14:54:00 -040018#include "compiler/translator/Cache.h"
Olli Etuaho01d0ad02017-01-22 14:51:23 -080019#include "compiler/translator/IntermNode.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
apatrick@chromium.org8187fa82010-06-15 22:09:28 +000021#include <stdio.h>
kbr@chromium.org476541f2011-10-27 21:14:51 +000022#include <algorithm>
23
Jamie Madill45bcc782016-11-07 13:58:48 -050024namespace sh
25{
26
Jamie Madillbfa91f42014-06-05 15:45:18 -040027int TSymbolTable::uniqueIdCounter = 0;
Nicolas Capensbd10cf52013-06-20 09:51:51 -040028
Olli Etuaho476197f2016-10-11 13:59:08 +010029TSymbol::TSymbol(const TString *n) : uniqueId(TSymbolTable::nextUniqueId()), name(n)
30{
31}
32
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034// Functions have buried pointers to delete.
35//
36TFunction::~TFunction()
37{
Olli Etuaho476197f2016-10-11 13:59:08 +010038 clearParameters();
39}
40
41void TFunction::clearParameters()
42{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000043 for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)
44 delete (*i).type;
Olli Etuaho476197f2016-10-11 13:59:08 +010045 parameters.clear();
46 mangledName = nullptr;
47}
48
49void TFunction::swapParameters(const TFunction &parametersSource)
50{
51 clearParameters();
52 for (auto parameter : parametersSource.parameters)
53 {
54 addParameter(parameter);
55 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000056}
57
Dmitry Skiba58832202015-07-06 16:11:13 -070058const TString *TFunction::buildMangledName() const
59{
Cooper Partin149e6e62015-08-07 16:18:18 -070060 std::string newName = mangleName(getName()).c_str();
Dmitry Skiba58832202015-07-06 16:11:13 -070061
62 for (const auto &p : parameters)
63 {
Cooper Partin149e6e62015-08-07 16:18:18 -070064 newName += p.type->getMangledName().c_str();
Dmitry Skiba58832202015-07-06 16:11:13 -070065 }
66
Cooper Partin149e6e62015-08-07 16:18:18 -070067 return NewPoolTString(newName.c_str());
Dmitry Skiba58832202015-07-06 16:11:13 -070068}
69
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070//
71// Symbol table levels are a map of pointers to symbols that have to be deleted.
72//
73TSymbolTableLevel::~TSymbolTableLevel()
74{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000075 for (tLevel::iterator it = level.begin(); it != level.end(); ++it)
76 delete (*it).second;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077}
78
Nicolas Capensadfffe42014-06-17 02:13:36 -040079bool TSymbolTableLevel::insert(TSymbol *symbol)
Jamie Madillbfa91f42014-06-05 15:45:18 -040080{
Jamie Madillbfa91f42014-06-05 15:45:18 -040081 // returning true means symbol was added to the table
Nicolas Capensadfffe42014-06-17 02:13:36 -040082 tInsertResult result = level.insert(tLevelPair(symbol->getMangledName(), symbol));
Jamie Madillbfa91f42014-06-05 15:45:18 -040083
84 return result.second;
85}
86
Olli Etuahob2983c92015-03-18 14:02:46 +020087bool TSymbolTableLevel::insertUnmangled(TFunction *function)
88{
Olli Etuahob2983c92015-03-18 14:02:46 +020089 // returning true means symbol was added to the table
90 tInsertResult result = level.insert(tLevelPair(function->getName(), function));
91
92 return result.second;
93}
94
Jamie Madillbfa91f42014-06-05 15:45:18 -040095TSymbol *TSymbolTableLevel::find(const TString &name) const
96{
97 tLevel::const_iterator it = level.find(name);
98 if (it == level.end())
99 return 0;
100 else
101 return (*it).second;
102}
103
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500104TSymbol *TSymbolTable::find(const TString &name,
105 int shaderVersion,
106 bool *builtIn,
107 bool *sameScope) const
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000108{
109 int level = currentLevel();
110 TSymbol *symbol;
111
112 do
113 {
Martin Radeve93d24e2016-07-28 12:06:05 +0300114 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
115 level--;
116 if (level == ESSL3_BUILTINS && shaderVersion < 300)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700117 level--;
118 if (level == ESSL1_BUILTINS && shaderVersion != 100)
119 level--;
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000120
121 symbol = table[level]->find(name);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500122 } while (symbol == 0 && --level >= 0);
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000123
124 if (builtIn)
125 *builtIn = (level <= LAST_BUILTIN_LEVEL);
126 if (sameScope)
127 *sameScope = (level == currentLevel());
128
129 return symbol;
130}
131
Zhenyao Mod7490962016-11-09 15:49:51 -0800132TSymbol *TSymbolTable::findGlobal(const TString &name) const
133{
134 ASSERT(table.size() > GLOBAL_LEVEL);
135 return table[GLOBAL_LEVEL]->find(name);
136}
137
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500138TSymbol *TSymbolTable::findBuiltIn(const TString &name, int shaderVersion) const
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000139{
140 for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--)
141 {
Martin Radeve93d24e2016-07-28 12:06:05 +0300142 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
143 level--;
144 if (level == ESSL3_BUILTINS && shaderVersion < 300)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700145 level--;
146 if (level == ESSL1_BUILTINS && shaderVersion != 100)
147 level--;
shannonwoods@chromium.org96e7ba12013-05-30 00:02:41 +0000148
149 TSymbol *symbol = table[level]->find(name);
150
151 if (symbol)
152 return symbol;
153 }
154
155 return 0;
156}
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400157
Olli Etuaho01d0ad02017-01-22 14:51:23 -0800158TFunction *TSymbolTable::findBuiltInOp(TIntermAggregate *callNode, int shaderVersion) const
159{
160 ASSERT(!callNode->isConstructor());
Olli Etuaho1ecd14b2017-01-26 13:54:15 -0800161 ASSERT(!callNode->isFunctionCall());
Olli Etuaho01d0ad02017-01-22 14:51:23 -0800162 TString opString = GetOperatorString(callNode->getOp());
163 // The return type doesn't affect the mangled name of the function, which is used to look it up.
164 TType dummyReturnType;
165 TFunction call(&opString, &dummyReturnType, callNode->getOp());
166 TIntermSequence *sequence = callNode->getSequence();
167 for (auto *child : *sequence)
168 {
169 TType *paramType = child->getAsTyped()->getTypePointer();
170 TConstParameter p(paramType);
171 call.addParameter(p);
172 }
173
174 TSymbol *sym = findBuiltIn(call.getMangledName(), shaderVersion);
175 ASSERT(sym != nullptr && sym->isFunction());
176
177 TFunction *builtInFunc = static_cast<TFunction *>(sym);
178 ASSERT(builtInFunc->getParamCount() == sequence->size());
179 return builtInFunc;
180}
181
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400182TSymbolTable::~TSymbolTable()
183{
184 while (table.size() > 0)
185 pop();
186}
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700187
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500188bool IsGenType(const TType *type)
189{
190 if (type)
191 {
192 TBasicType basicType = type->getBasicType();
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500193 return basicType == EbtGenType || basicType == EbtGenIType || basicType == EbtGenUType ||
194 basicType == EbtGenBType;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500195 }
196
197 return false;
198}
199
200bool IsVecType(const TType *type)
201{
202 if (type)
203 {
204 TBasicType basicType = type->getBasicType();
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500205 return basicType == EbtVec || basicType == EbtIVec || basicType == EbtUVec ||
206 basicType == EbtBVec;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500207 }
208
209 return false;
210}
211
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700212const TType *SpecificType(const TType *type, int size)
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500213{
214 ASSERT(size >= 1 && size <= 4);
215
216 if (!type)
217 {
218 return nullptr;
219 }
220
221 ASSERT(!IsVecType(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 EbtGenType:
Olli Etuaho9250cb22017-01-21 10:51:27 +0000226 return TCache::getType(EbtFloat, type->getQualifier(),
227 static_cast<unsigned char>(size));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500228 case EbtGenIType:
Olli Etuaho9250cb22017-01-21 10:51:27 +0000229 return TCache::getType(EbtInt, type->getQualifier(), static_cast<unsigned char>(size));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500230 case EbtGenUType:
Olli Etuaho9250cb22017-01-21 10:51:27 +0000231 return TCache::getType(EbtUInt, type->getQualifier(), static_cast<unsigned char>(size));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500232 case EbtGenBType:
Olli Etuaho9250cb22017-01-21 10:51:27 +0000233 return TCache::getType(EbtBool, type->getQualifier(), static_cast<unsigned char>(size));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500234 default:
235 return type;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500236 }
237}
238
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700239const TType *VectorType(const TType *type, int size)
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500240{
241 ASSERT(size >= 2 && size <= 4);
242
243 if (!type)
244 {
245 return nullptr;
246 }
247
248 ASSERT(!IsGenType(type));
249
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500250 switch (type->getBasicType())
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500251 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500252 case EbtVec:
253 return TCache::getType(EbtFloat, static_cast<unsigned char>(size));
254 case EbtIVec:
255 return TCache::getType(EbtInt, static_cast<unsigned char>(size));
256 case EbtUVec:
257 return TCache::getType(EbtUInt, static_cast<unsigned char>(size));
258 case EbtBVec:
259 return TCache::getType(EbtBool, static_cast<unsigned char>(size));
260 default:
261 return type;
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500262 }
263}
264
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500265void TSymbolTable::insertBuiltIn(ESymbolLevel level,
266 TOperator op,
267 const char *ext,
268 const TType *rvalue,
269 const char *name,
270 const TType *ptype1,
271 const TType *ptype2,
272 const TType *ptype3,
273 const TType *ptype4,
274 const TType *ptype5)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700275{
276 if (ptype1->getBasicType() == EbtGSampler2D)
277 {
Martin Radevda6254b2016-12-14 17:00:36 +0200278 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700279 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500280 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
281 TCache::getType(EbtSampler2D), ptype2, ptype3, ptype4, ptype5);
282 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
283 TCache::getType(EbtISampler2D), ptype2, ptype3, ptype4, ptype5);
284 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
285 TCache::getType(EbtUSampler2D), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700286 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500287 else if (ptype1->getBasicType() == EbtGSampler3D)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700288 {
Martin Radevda6254b2016-12-14 17:00:36 +0200289 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700290 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500291 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
292 TCache::getType(EbtSampler3D), ptype2, ptype3, ptype4, ptype5);
293 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
294 TCache::getType(EbtISampler3D), ptype2, ptype3, ptype4, ptype5);
295 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
296 TCache::getType(EbtUSampler3D), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700297 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500298 else if (ptype1->getBasicType() == EbtGSamplerCube)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700299 {
Martin Radevda6254b2016-12-14 17:00:36 +0200300 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700301 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500302 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
303 TCache::getType(EbtSamplerCube), ptype2, ptype3, ptype4, ptype5);
304 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
305 TCache::getType(EbtISamplerCube), ptype2, ptype3, ptype4, ptype5);
306 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
307 TCache::getType(EbtUSamplerCube), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700308 }
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500309 else if (ptype1->getBasicType() == EbtGSampler2DArray)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700310 {
Martin Radevda6254b2016-12-14 17:00:36 +0200311 insertUnmangledBuiltInName(name, level);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700312 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500313 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
314 TCache::getType(EbtSampler2DArray), ptype2, ptype3, ptype4, ptype5);
315 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
316 TCache::getType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5);
317 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
318 TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700319 }
JiangYizhou40219322016-12-09 09:50:51 +0800320 else if (ptype1->getBasicType() == EbtGSampler2DMS)
321 {
322 insertUnmangledBuiltInName(name, level);
323 bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
324 insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
325 TCache::getType(EbtSampler2DMS), ptype2, ptype3, ptype4, ptype5);
326 insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
327 TCache::getType(EbtISampler2DMS), ptype2, ptype3, ptype4, ptype5);
328 insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
329 TCache::getType(EbtUSampler2DMS), ptype2, ptype3, ptype4, ptype5);
330 }
Martin Radev2cc85b32016-08-05 16:22:53 +0300331 else if (IsGImage(ptype1->getBasicType()))
332 {
Martin Radevda6254b2016-12-14 17:00:36 +0200333 insertUnmangledBuiltInName(name, level);
Martin Radev2cc85b32016-08-05 16:22:53 +0300334
335 const TType *floatType = TCache::getType(EbtFloat, 4);
336 const TType *intType = TCache::getType(EbtInt, 4);
337 const TType *unsignedType = TCache::getType(EbtUInt, 4);
338
339 const TType *floatImage =
340 TCache::getType(convertGImageToFloatImage(ptype1->getBasicType()));
341 const TType *intImage = TCache::getType(convertGImageToIntImage(ptype1->getBasicType()));
342 const TType *unsignedImage =
343 TCache::getType(convertGImageToUnsignedImage(ptype1->getBasicType()));
344
345 // GLSL ES 3.10, Revision 4, 8.12 Image Functions
346 if (rvalue->getBasicType() == EbtGVec4)
347 {
348 // imageLoad
349 insertBuiltIn(level, floatType, name, floatImage, ptype2, ptype3, ptype4, ptype5);
350 insertBuiltIn(level, intType, name, intImage, ptype2, ptype3, ptype4, ptype5);
351 insertBuiltIn(level, unsignedType, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
352 }
353 else if (rvalue->getBasicType() == EbtVoid)
354 {
355 // imageStore
356 insertBuiltIn(level, rvalue, name, floatImage, ptype2, floatType, ptype4, ptype5);
357 insertBuiltIn(level, rvalue, name, intImage, ptype2, intType, ptype4, ptype5);
358 insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, unsignedType, ptype4, ptype5);
359 }
360 else
361 {
362 // imageSize
363 insertBuiltIn(level, rvalue, name, floatImage, ptype2, ptype3, ptype4, ptype5);
364 insertBuiltIn(level, rvalue, name, intImage, ptype2, ptype3, ptype4, ptype5);
365 insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
366 }
367 }
Olli Etuaho9250cb22017-01-21 10:51:27 +0000368 else if (IsGenType(rvalue) || IsGenType(ptype1) || IsGenType(ptype2) || IsGenType(ptype3) ||
369 IsGenType(ptype4))
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500370 {
Olli Etuaho9250cb22017-01-21 10:51:27 +0000371 ASSERT(!ptype5);
Martin Radevda6254b2016-12-14 17:00:36 +0200372 insertUnmangledBuiltInName(name, level);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500373 insertBuiltIn(level, op, ext, SpecificType(rvalue, 1), name, SpecificType(ptype1, 1),
Olli Etuaho9250cb22017-01-21 10:51:27 +0000374 SpecificType(ptype2, 1), SpecificType(ptype3, 1), SpecificType(ptype4, 1));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500375 insertBuiltIn(level, op, ext, SpecificType(rvalue, 2), name, SpecificType(ptype1, 2),
Olli Etuaho9250cb22017-01-21 10:51:27 +0000376 SpecificType(ptype2, 2), SpecificType(ptype3, 2), SpecificType(ptype4, 2));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500377 insertBuiltIn(level, op, ext, SpecificType(rvalue, 3), name, SpecificType(ptype1, 3),
Olli Etuaho9250cb22017-01-21 10:51:27 +0000378 SpecificType(ptype2, 3), SpecificType(ptype3, 3), SpecificType(ptype4, 3));
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500379 insertBuiltIn(level, op, ext, SpecificType(rvalue, 4), name, SpecificType(ptype1, 4),
Olli Etuaho9250cb22017-01-21 10:51:27 +0000380 SpecificType(ptype2, 4), SpecificType(ptype3, 4), SpecificType(ptype4, 4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500381 }
382 else if (IsVecType(rvalue) || IsVecType(ptype1) || IsVecType(ptype2) || IsVecType(ptype3))
383 {
384 ASSERT(!ptype4 && !ptype5);
Martin Radevda6254b2016-12-14 17:00:36 +0200385 insertUnmangledBuiltInName(name, level);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500386 insertBuiltIn(level, op, ext, VectorType(rvalue, 2), name, VectorType(ptype1, 2),
387 VectorType(ptype2, 2), VectorType(ptype3, 2));
388 insertBuiltIn(level, op, ext, VectorType(rvalue, 3), name, VectorType(ptype1, 3),
389 VectorType(ptype2, 3), VectorType(ptype3, 3));
390 insertBuiltIn(level, op, ext, VectorType(rvalue, 4), name, VectorType(ptype1, 4),
391 VectorType(ptype2, 4), VectorType(ptype3, 4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500392 }
393 else
394 {
Dmitry Skiba7f17a502015-06-22 15:08:39 -0700395 TFunction *function = new TFunction(NewPoolTString(name), rvalue, op, ext);
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700396
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700397 function->addParameter(TConstParameter(ptype1));
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700398
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500399 if (ptype2)
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700400 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700401 function->addParameter(TConstParameter(ptype2));
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700402 }
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700403
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500404 if (ptype3)
405 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700406 function->addParameter(TConstParameter(ptype3));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500407 }
408
409 if (ptype4)
410 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700411 function->addParameter(TConstParameter(ptype4));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500412 }
413
414 if (ptype5)
415 {
Dmitry Skibaefa3d8e2015-06-22 14:52:10 -0700416 function->addParameter(TConstParameter(ptype5));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500417 }
418
Martin Radevda6254b2016-12-14 17:00:36 +0200419 ASSERT(hasUnmangledBuiltInAtLevel(name, level));
Nicolas Capensf3cc4ae2015-02-23 13:51:25 -0500420 insert(level, function);
421 }
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700422}
423
Olli Etuaho492cfab2017-01-20 21:18:29 +0000424void TSymbolTable::insertBuiltInOp(ESymbolLevel level,
425 TOperator op,
426 const TType *rvalue,
427 const TType *ptype1,
428 const TType *ptype2,
429 const TType *ptype3,
430 const TType *ptype4,
431 const TType *ptype5)
432{
433 const char *name = GetOperatorString(op);
434 ASSERT(strlen(name) > 0);
435 insertUnmangledBuiltInName(name, level);
436 insertBuiltIn(level, op, "", rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5);
437}
438
439void TSymbolTable::insertBuiltInOp(ESymbolLevel level,
440 TOperator op,
441 const char *ext,
442 const TType *rvalue,
443 const TType *ptype1,
444 const TType *ptype2,
445 const TType *ptype3,
446 const TType *ptype4,
447 const TType *ptype5)
448{
449 const char *name = GetOperatorString(op);
450 insertUnmangledBuiltInName(name, level);
451 insertBuiltIn(level, op, ext, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5);
452}
453
Martin Radevd7c5b0a2016-07-27 14:04:43 +0300454void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level,
455 TOperator op,
456 const TType *rvalue,
457 const char *name)
458{
459 insertUnmangledBuiltInName(name, level);
460 insert(level, new TFunction(NewPoolTString(name), rvalue, op));
461}
462
Zhenyao Moe740add2014-07-18 17:01:01 -0700463TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700464{
465 if (!SupportsPrecision(type))
466 return EbpUndefined;
467
468 // unsigned integers use the same precision as signed
469 TBasicType baseType = (type == EbtUInt) ? EbtInt : type;
470
471 int level = static_cast<int>(precisionStack.size()) - 1;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500472 assert(level >= 0); // Just to be safe. Should not happen.
Olli Etuaho183d7e22015-11-20 15:59:09 +0200473 // If we dont find anything we return this. Some types don't have predefined default precision.
Zhenyao Mo9eedea02014-05-12 16:02:35 -0700474 TPrecision prec = EbpUndefined;
475 while (level >= 0)
476 {
477 PrecisionStackLevel::iterator it = precisionStack[level]->find(baseType);
478 if (it != precisionStack[level]->end())
479 {
480 prec = (*it).second;
481 break;
482 }
483 level--;
484 }
485 return prec;
486}
Jamie Madill45bcc782016-11-07 13:58:48 -0500487
Martin Radevda6254b2016-12-14 17:00:36 +0200488void TSymbolTable::insertUnmangledBuiltInName(const char *name, ESymbolLevel level)
489{
490 ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size()));
491 table[level]->insertUnmangledBuiltInName(std::string(name));
492}
493
494bool TSymbolTable::hasUnmangledBuiltInAtLevel(const char *name, ESymbolLevel level)
495{
496 ASSERT(level >= 0 && level < static_cast<ESymbolLevel>(table.size()));
497 return table[level]->hasUnmangledBuiltIn(std::string(name));
498}
499
500bool TSymbolTable::hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion)
501{
502 ASSERT(static_cast<ESymbolLevel>(table.size()) > LAST_BUILTIN_LEVEL);
503
504 for (int level = LAST_BUILTIN_LEVEL; level >= 0; --level)
505 {
506 if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
507 {
508 --level;
509 }
510 if (level == ESSL3_BUILTINS && shaderVersion < 300)
511 {
512 --level;
513 }
514 if (level == ESSL1_BUILTINS && shaderVersion != 100)
515 {
516 --level;
517 }
518
519 if (table[level]->hasUnmangledBuiltIn(name))
520 {
521 return true;
522 }
523 }
524 return false;
525}
526
Jamie Madill45bcc782016-11-07 13:58:48 -0500527} // namespace sh