1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_TRANSLATOR_SYMBOLTABLE_H_
8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_TRANSLATOR_SYMBOLTABLE_H_
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker //
11*8975f5c5SAndroid Build Coastguard Worker // Symbol table for parsing. Has these design characteristics:
12*8975f5c5SAndroid Build Coastguard Worker //
13*8975f5c5SAndroid Build Coastguard Worker // * Same symbol table can be used to compile many shaders, to preserve
14*8975f5c5SAndroid Build Coastguard Worker // effort of creating and loading with the large numbers of built-in
15*8975f5c5SAndroid Build Coastguard Worker // symbols.
16*8975f5c5SAndroid Build Coastguard Worker //
17*8975f5c5SAndroid Build Coastguard Worker // * Name mangling will be used to give each function a unique name
18*8975f5c5SAndroid Build Coastguard Worker // so that symbol table lookups are never ambiguous. This allows
19*8975f5c5SAndroid Build Coastguard Worker // a simpler symbol table structure.
20*8975f5c5SAndroid Build Coastguard Worker //
21*8975f5c5SAndroid Build Coastguard Worker // * Pushing and popping of scope, so symbol table will really be a stack
22*8975f5c5SAndroid Build Coastguard Worker // of symbol tables. Searched from the top, with new inserts going into
23*8975f5c5SAndroid Build Coastguard Worker // the top.
24*8975f5c5SAndroid Build Coastguard Worker //
25*8975f5c5SAndroid Build Coastguard Worker // * Constants: Compile time constant symbols will keep their values
26*8975f5c5SAndroid Build Coastguard Worker // in the symbol table. The parser can substitute constants at parse
27*8975f5c5SAndroid Build Coastguard Worker // time, including doing constant folding and constant propagation.
28*8975f5c5SAndroid Build Coastguard Worker //
29*8975f5c5SAndroid Build Coastguard Worker // * No temporaries: Temporaries made from operations (+, --, .xy, etc.)
30*8975f5c5SAndroid Build Coastguard Worker // are tracked in the intermediate representation, not the symbol table.
31*8975f5c5SAndroid Build Coastguard Worker //
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker #include <limits>
34*8975f5c5SAndroid Build Coastguard Worker #include <memory>
35*8975f5c5SAndroid Build Coastguard Worker #include <set>
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
38*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ExtensionBehavior.h"
39*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableString.h"
40*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/InfoSink.h"
41*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/IntermNode.h"
42*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Symbol.h"
43*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/SymbolTable_autogen.h"
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker enum class Shader : uint8_t
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker ALL,
48*8975f5c5SAndroid Build Coastguard Worker FRAGMENT, // GL_FRAGMENT_SHADER
49*8975f5c5SAndroid Build Coastguard Worker VERTEX, // GL_VERTEX_SHADER
50*8975f5c5SAndroid Build Coastguard Worker COMPUTE, // GL_COMPUTE_SHADER
51*8975f5c5SAndroid Build Coastguard Worker GEOMETRY, // GL_GEOMETRY_SHADER
52*8975f5c5SAndroid Build Coastguard Worker GEOMETRY_EXT, // GL_GEOMETRY_SHADER_EXT
53*8975f5c5SAndroid Build Coastguard Worker TESS_CONTROL_EXT, // GL_TESS_CONTROL_SHADER_EXT
54*8975f5c5SAndroid Build Coastguard Worker TESS_EVALUATION_EXT, // GL_TESS_EVALUATION_SHADER_EXT
55*8975f5c5SAndroid Build Coastguard Worker NOT_COMPUTE
56*8975f5c5SAndroid Build Coastguard Worker };
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker namespace sh
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker struct UnmangledBuiltIn
62*8975f5c5SAndroid Build Coastguard Worker {
UnmangledBuiltInUnmangledBuiltIn63*8975f5c5SAndroid Build Coastguard Worker constexpr UnmangledBuiltIn(TExtension extension) : extension(extension) {}
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker TExtension extension;
66*8975f5c5SAndroid Build Coastguard Worker };
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker using VarPointer = TSymbol *(TSymbolTableBase::*);
69*8975f5c5SAndroid Build Coastguard Worker using ValidateExtension = int ShBuiltInResources::*;
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker constexpr uint16_t kESSL1Only = 100;
72*8975f5c5SAndroid Build Coastguard Worker // Some built-ins from backend shader languages are made available internally to ESSL for use in
73*8975f5c5SAndroid Build Coastguard Worker // tree transformations. This (invalid) shader version is used to select those built-ins. This
74*8975f5c5SAndroid Build Coastguard Worker // value needs to be larger than all other shader versions.
75*8975f5c5SAndroid Build Coastguard Worker constexpr uint16_t kESSLInternalBackendBuiltIns = 0x3FFF;
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker // The version assigned to |kESSLInternalBackendBuiltIns| should be good until OpenGL 20.0!
78*8975f5c5SAndroid Build Coastguard Worker static_assert(kESSLInternalBackendBuiltIns > 2000,
79*8975f5c5SAndroid Build Coastguard Worker "Accidentally exposing internal backend built-ins in OpenGL");
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker static_assert(offsetof(ShBuiltInResources, OES_standard_derivatives) != 0,
82*8975f5c5SAndroid Build Coastguard Worker "Update SymbolTable extension logic");
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker #define EXT_INDEX(Ext) (offsetof(ShBuiltInResources, Ext) / sizeof(int))
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker class SymbolRule
87*8975f5c5SAndroid Build Coastguard Worker {
88*8975f5c5SAndroid Build Coastguard Worker public:
89*8975f5c5SAndroid Build Coastguard Worker const TSymbol *get(ShShaderSpec shaderSpec,
90*8975f5c5SAndroid Build Coastguard Worker int shaderVersion,
91*8975f5c5SAndroid Build Coastguard Worker sh::GLenum shaderType,
92*8975f5c5SAndroid Build Coastguard Worker const ShBuiltInResources &resources,
93*8975f5c5SAndroid Build Coastguard Worker const TSymbolTableBase &symbolTable) const;
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker template <int version, Shader shaders, size_t extensionIndex, typename T>
96*8975f5c5SAndroid Build Coastguard Worker constexpr static SymbolRule Get(T value);
97*8975f5c5SAndroid Build Coastguard Worker
98*8975f5c5SAndroid Build Coastguard Worker private:
99*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolRule(int version, Shader shaders, size_t extensionIndex, const TSymbol *symbol);
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolRule(int version,
102*8975f5c5SAndroid Build Coastguard Worker Shader shaders,
103*8975f5c5SAndroid Build Coastguard Worker size_t extensionIndex,
104*8975f5c5SAndroid Build Coastguard Worker VarPointer resourceVar);
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker union SymbolOrVar
107*8975f5c5SAndroid Build Coastguard Worker {
SymbolOrVar(const TSymbol * symbolIn)108*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolOrVar(const TSymbol *symbolIn) : symbol(symbolIn) {}
SymbolOrVar(VarPointer varIn)109*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolOrVar(VarPointer varIn) : var(varIn) {}
110*8975f5c5SAndroid Build Coastguard Worker
111*8975f5c5SAndroid Build Coastguard Worker const TSymbol *symbol;
112*8975f5c5SAndroid Build Coastguard Worker VarPointer var;
113*8975f5c5SAndroid Build Coastguard Worker };
114*8975f5c5SAndroid Build Coastguard Worker
115*8975f5c5SAndroid Build Coastguard Worker uint16_t mIsVar : 1;
116*8975f5c5SAndroid Build Coastguard Worker uint16_t mVersion : 14;
117*8975f5c5SAndroid Build Coastguard Worker uint8_t mShaders;
118*8975f5c5SAndroid Build Coastguard Worker uint8_t mExtensionIndex;
119*8975f5c5SAndroid Build Coastguard Worker SymbolOrVar mSymbolOrVar;
120*8975f5c5SAndroid Build Coastguard Worker };
121*8975f5c5SAndroid Build Coastguard Worker
SymbolRule(int version,Shader shaders,size_t extensionIndex,const TSymbol * symbol)122*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolRule::SymbolRule(int version,
123*8975f5c5SAndroid Build Coastguard Worker Shader shaders,
124*8975f5c5SAndroid Build Coastguard Worker size_t extensionIndex,
125*8975f5c5SAndroid Build Coastguard Worker const TSymbol *symbol)
126*8975f5c5SAndroid Build Coastguard Worker : mIsVar(0u),
127*8975f5c5SAndroid Build Coastguard Worker mVersion(static_cast<uint16_t>(version)),
128*8975f5c5SAndroid Build Coastguard Worker mShaders(static_cast<uint8_t>(shaders)),
129*8975f5c5SAndroid Build Coastguard Worker mExtensionIndex(extensionIndex),
130*8975f5c5SAndroid Build Coastguard Worker mSymbolOrVar(symbol)
131*8975f5c5SAndroid Build Coastguard Worker {}
132*8975f5c5SAndroid Build Coastguard Worker
SymbolRule(int version,Shader shaders,size_t extensionIndex,VarPointer resourceVar)133*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolRule::SymbolRule(int version,
134*8975f5c5SAndroid Build Coastguard Worker Shader shaders,
135*8975f5c5SAndroid Build Coastguard Worker size_t extensionIndex,
136*8975f5c5SAndroid Build Coastguard Worker VarPointer resourceVar)
137*8975f5c5SAndroid Build Coastguard Worker : mIsVar(1u),
138*8975f5c5SAndroid Build Coastguard Worker mVersion(static_cast<uint16_t>(version)),
139*8975f5c5SAndroid Build Coastguard Worker mShaders(static_cast<uint8_t>(shaders)),
140*8975f5c5SAndroid Build Coastguard Worker mExtensionIndex(extensionIndex),
141*8975f5c5SAndroid Build Coastguard Worker mSymbolOrVar(resourceVar)
142*8975f5c5SAndroid Build Coastguard Worker {}
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker template <int version, Shader shaders, size_t extensionIndex, typename T>
145*8975f5c5SAndroid Build Coastguard Worker // static
Get(T value)146*8975f5c5SAndroid Build Coastguard Worker constexpr SymbolRule SymbolRule::Get(T value)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker static_assert(version < 0x4000u, "version OOR");
149*8975f5c5SAndroid Build Coastguard Worker static_assert(static_cast<uint8_t>(shaders) < 0xFFu, "shaders OOR");
150*8975f5c5SAndroid Build Coastguard Worker static_assert(static_cast<uint8_t>(extensionIndex) < 0xFF, "extensionIndex OOR");
151*8975f5c5SAndroid Build Coastguard Worker return SymbolRule(version, shaders, extensionIndex, value);
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker
154*8975f5c5SAndroid Build Coastguard Worker const TSymbol *FindMangledBuiltIn(ShShaderSpec shaderSpec,
155*8975f5c5SAndroid Build Coastguard Worker int shaderVersion,
156*8975f5c5SAndroid Build Coastguard Worker sh::GLenum shaderType,
157*8975f5c5SAndroid Build Coastguard Worker const ShBuiltInResources &resources,
158*8975f5c5SAndroid Build Coastguard Worker const TSymbolTableBase &symbolTable,
159*8975f5c5SAndroid Build Coastguard Worker const SymbolRule *rules,
160*8975f5c5SAndroid Build Coastguard Worker uint16_t startIndex,
161*8975f5c5SAndroid Build Coastguard Worker uint16_t endIndex);
162*8975f5c5SAndroid Build Coastguard Worker
163*8975f5c5SAndroid Build Coastguard Worker class UnmangledEntry
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker public:
166*8975f5c5SAndroid Build Coastguard Worker template <size_t ESSLExtCount>
167*8975f5c5SAndroid Build Coastguard Worker constexpr UnmangledEntry(const char *name,
168*8975f5c5SAndroid Build Coastguard Worker const std::array<TExtension, ESSLExtCount> &esslExtensions,
169*8975f5c5SAndroid Build Coastguard Worker int esslVersion,
170*8975f5c5SAndroid Build Coastguard Worker Shader shaderType);
171*8975f5c5SAndroid Build Coastguard Worker
172*8975f5c5SAndroid Build Coastguard Worker bool matches(const ImmutableString &name,
173*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec shaderSpec,
174*8975f5c5SAndroid Build Coastguard Worker int shaderVersion,
175*8975f5c5SAndroid Build Coastguard Worker sh::GLenum shaderType,
176*8975f5c5SAndroid Build Coastguard Worker const TExtensionBehavior &extensions) const;
177*8975f5c5SAndroid Build Coastguard Worker
178*8975f5c5SAndroid Build Coastguard Worker private:
179*8975f5c5SAndroid Build Coastguard Worker const char *mName;
180*8975f5c5SAndroid Build Coastguard Worker std::array<TExtension, 2u> mESSLExtensions;
181*8975f5c5SAndroid Build Coastguard Worker uint8_t mShaderType;
182*8975f5c5SAndroid Build Coastguard Worker uint16_t mESSLVersion;
183*8975f5c5SAndroid Build Coastguard Worker };
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker template <size_t ESSLExtCount>
UnmangledEntry(const char * name,const std::array<TExtension,ESSLExtCount> & esslExtensions,int esslVersion,Shader shaderType)186*8975f5c5SAndroid Build Coastguard Worker constexpr UnmangledEntry::UnmangledEntry(const char *name,
187*8975f5c5SAndroid Build Coastguard Worker const std::array<TExtension, ESSLExtCount> &esslExtensions,
188*8975f5c5SAndroid Build Coastguard Worker int esslVersion,
189*8975f5c5SAndroid Build Coastguard Worker Shader shaderType)
190*8975f5c5SAndroid Build Coastguard Worker : mName(name),
191*8975f5c5SAndroid Build Coastguard Worker mESSLExtensions{(ESSLExtCount >= 1) ? esslExtensions[0] : TExtension::UNDEFINED,
192*8975f5c5SAndroid Build Coastguard Worker (ESSLExtCount >= 2) ? esslExtensions[1] : TExtension::UNDEFINED},
193*8975f5c5SAndroid Build Coastguard Worker mShaderType(static_cast<uint8_t>(shaderType)),
194*8975f5c5SAndroid Build Coastguard Worker mESSLVersion(esslVersion < 0 ? std::numeric_limits<uint16_t>::max()
195*8975f5c5SAndroid Build Coastguard Worker : static_cast<uint16_t>(esslVersion))
196*8975f5c5SAndroid Build Coastguard Worker {}
197*8975f5c5SAndroid Build Coastguard Worker
198*8975f5c5SAndroid Build Coastguard Worker class TSymbolTable : angle::NonCopyable, TSymbolTableBase
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker public:
201*8975f5c5SAndroid Build Coastguard Worker TSymbolTable();
202*8975f5c5SAndroid Build Coastguard Worker // To start using the symbol table after construction:
203*8975f5c5SAndroid Build Coastguard Worker // * initializeBuiltIns() needs to be called.
204*8975f5c5SAndroid Build Coastguard Worker // * push() needs to be called to push the global level.
205*8975f5c5SAndroid Build Coastguard Worker
206*8975f5c5SAndroid Build Coastguard Worker ~TSymbolTable();
207*8975f5c5SAndroid Build Coastguard Worker
208*8975f5c5SAndroid Build Coastguard Worker bool isEmpty() const;
209*8975f5c5SAndroid Build Coastguard Worker bool atGlobalLevel() const;
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker void push();
212*8975f5c5SAndroid Build Coastguard Worker void pop();
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker // Declare a non-function symbol at the current scope. Return true in case the declaration was
215*8975f5c5SAndroid Build Coastguard Worker // successful, and false if the declaration failed due to redefinition.
216*8975f5c5SAndroid Build Coastguard Worker bool declare(TSymbol *symbol);
217*8975f5c5SAndroid Build Coastguard Worker
218*8975f5c5SAndroid Build Coastguard Worker // Only used to declare internal variables.
219*8975f5c5SAndroid Build Coastguard Worker bool declareInternal(TSymbol *symbol);
220*8975f5c5SAndroid Build Coastguard Worker
221*8975f5c5SAndroid Build Coastguard Worker // Functions are always declared at global scope.
222*8975f5c5SAndroid Build Coastguard Worker void declareUserDefinedFunction(TFunction *function, bool insertUnmangledName);
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker // These return the TFunction pointer to keep using to refer to this function.
225*8975f5c5SAndroid Build Coastguard Worker const TFunction *markFunctionHasPrototypeDeclaration(const ImmutableString &mangledName,
226*8975f5c5SAndroid Build Coastguard Worker bool *hadPrototypeDeclarationOut) const;
227*8975f5c5SAndroid Build Coastguard Worker const TFunction *setFunctionParameterNamesFromDefinition(const TFunction *function,
228*8975f5c5SAndroid Build Coastguard Worker bool *wasDefinedOut) const;
229*8975f5c5SAndroid Build Coastguard Worker
230*8975f5c5SAndroid Build Coastguard Worker // Return false if the gl_in array size has already been initialized with a mismatching value.
231*8975f5c5SAndroid Build Coastguard Worker bool setGlInArraySize(unsigned int inputArraySize);
232*8975f5c5SAndroid Build Coastguard Worker TVariable *getGlInVariableWithArraySize() const;
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard Worker const TVariable *gl_FragData() const;
235*8975f5c5SAndroid Build Coastguard Worker const TVariable *gl_SecondaryFragDataEXT() const;
236*8975f5c5SAndroid Build Coastguard Worker
237*8975f5c5SAndroid Build Coastguard Worker void markStaticRead(const TVariable &variable);
238*8975f5c5SAndroid Build Coastguard Worker void markStaticWrite(const TVariable &variable);
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker // Note: Should not call this for constant variables.
241*8975f5c5SAndroid Build Coastguard Worker bool isStaticallyUsed(const TVariable &variable) const;
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker // find() is guaranteed not to retain a reference to the ImmutableString, so an ImmutableString
244*8975f5c5SAndroid Build Coastguard Worker // with a reference to a short-lived char * is fine to pass here.
245*8975f5c5SAndroid Build Coastguard Worker const TSymbol *find(const ImmutableString &name, int shaderVersion) const;
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker const TSymbol *findUserDefined(const ImmutableString &name) const;
248*8975f5c5SAndroid Build Coastguard Worker
249*8975f5c5SAndroid Build Coastguard Worker TFunction *findUserDefinedFunction(const ImmutableString &name) const;
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker const TSymbol *findGlobal(const ImmutableString &name) const;
252*8975f5c5SAndroid Build Coastguard Worker
253*8975f5c5SAndroid Build Coastguard Worker const TSymbol *findBuiltIn(const ImmutableString &name, int shaderVersion) const;
254*8975f5c5SAndroid Build Coastguard Worker
255*8975f5c5SAndroid Build Coastguard Worker void setDefaultPrecision(TBasicType type, TPrecision prec);
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker // Searches down the precisionStack for a precision qualifier
258*8975f5c5SAndroid Build Coastguard Worker // for the specified TBasicType
259*8975f5c5SAndroid Build Coastguard Worker TPrecision getDefaultPrecision(TBasicType type) const;
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker // This records invariant varyings declared through "invariant varying_name;".
262*8975f5c5SAndroid Build Coastguard Worker void addInvariantVarying(const TVariable &variable);
263*8975f5c5SAndroid Build Coastguard Worker
264*8975f5c5SAndroid Build Coastguard Worker // If this returns false, the varying could still be invariant if it is set as invariant during
265*8975f5c5SAndroid Build Coastguard Worker // the varying variable declaration - this piece of information is stored in the variable's
266*8975f5c5SAndroid Build Coastguard Worker // type, not here.
267*8975f5c5SAndroid Build Coastguard Worker bool isVaryingInvariant(const TVariable &variable) const;
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Worker void setGlobalInvariant(bool invariant);
270*8975f5c5SAndroid Build Coastguard Worker
nextUniqueId()271*8975f5c5SAndroid Build Coastguard Worker const TSymbolUniqueId nextUniqueId() { return TSymbolUniqueId(this); }
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker // Gets the built-in accessible by a shader with the specified version, if any.
274*8975f5c5SAndroid Build Coastguard Worker bool isUnmangledBuiltInName(const ImmutableString &name,
275*8975f5c5SAndroid Build Coastguard Worker int shaderVersion,
276*8975f5c5SAndroid Build Coastguard Worker const TExtensionBehavior &extensions) const;
277*8975f5c5SAndroid Build Coastguard Worker
278*8975f5c5SAndroid Build Coastguard Worker void initializeBuiltIns(sh::GLenum type,
279*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec spec,
280*8975f5c5SAndroid Build Coastguard Worker const ShBuiltInResources &resources);
281*8975f5c5SAndroid Build Coastguard Worker void clearCompilationResults();
282*8975f5c5SAndroid Build Coastguard Worker
getShaderSpec()283*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec getShaderSpec() const { return mShaderSpec; }
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker private:
286*8975f5c5SAndroid Build Coastguard Worker friend class TSymbolUniqueId;
287*8975f5c5SAndroid Build Coastguard Worker
288*8975f5c5SAndroid Build Coastguard Worker struct VariableMetadata
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker VariableMetadata();
291*8975f5c5SAndroid Build Coastguard Worker bool staticRead;
292*8975f5c5SAndroid Build Coastguard Worker bool staticWrite;
293*8975f5c5SAndroid Build Coastguard Worker bool invariant;
294*8975f5c5SAndroid Build Coastguard Worker };
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker int nextUniqueIdValue();
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker class TSymbolTableLevel;
299*8975f5c5SAndroid Build Coastguard Worker
300*8975f5c5SAndroid Build Coastguard Worker void initSamplerDefaultPrecision(TBasicType samplerType);
301*8975f5c5SAndroid Build Coastguard Worker
302*8975f5c5SAndroid Build Coastguard Worker void initializeBuiltInVariables(sh::GLenum shaderType,
303*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec spec,
304*8975f5c5SAndroid Build Coastguard Worker const ShBuiltInResources &resources);
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker VariableMetadata *getOrCreateVariableMetadata(const TVariable &variable);
307*8975f5c5SAndroid Build Coastguard Worker
308*8975f5c5SAndroid Build Coastguard Worker std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
309*8975f5c5SAndroid Build Coastguard Worker
310*8975f5c5SAndroid Build Coastguard Worker // There's one precision stack level for predefined precisions and then one level for each scope
311*8975f5c5SAndroid Build Coastguard Worker // in table.
312*8975f5c5SAndroid Build Coastguard Worker typedef TMap<TBasicType, TPrecision> PrecisionStackLevel;
313*8975f5c5SAndroid Build Coastguard Worker std::vector<std::unique_ptr<PrecisionStackLevel>> mPrecisionStack;
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Worker bool mGlobalInvariant;
316*8975f5c5SAndroid Build Coastguard Worker
317*8975f5c5SAndroid Build Coastguard Worker int mUniqueIdCounter;
318*8975f5c5SAndroid Build Coastguard Worker
319*8975f5c5SAndroid Build Coastguard Worker static constexpr int kFirstUserDefinedSymbolId = 3000;
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker sh::GLenum mShaderType;
322*8975f5c5SAndroid Build Coastguard Worker ShShaderSpec mShaderSpec;
323*8975f5c5SAndroid Build Coastguard Worker ShBuiltInResources mResources;
324*8975f5c5SAndroid Build Coastguard Worker
325*8975f5c5SAndroid Build Coastguard Worker // Indexed by unique id. Map instead of vector since the variables are fairly sparse.
326*8975f5c5SAndroid Build Coastguard Worker std::map<int, VariableMetadata> mVariableMetadata;
327*8975f5c5SAndroid Build Coastguard Worker
328*8975f5c5SAndroid Build Coastguard Worker // Store gl_in variable with its array size once the array size can be determined. The array
329*8975f5c5SAndroid Build Coastguard Worker // size can also be checked against latter input primitive type declaration.
330*8975f5c5SAndroid Build Coastguard Worker TVariable *mGlInVariableWithArraySize;
331*8975f5c5SAndroid Build Coastguard Worker friend struct SymbolIdChecker;
332*8975f5c5SAndroid Build Coastguard Worker };
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker } // namespace sh
335*8975f5c5SAndroid Build Coastguard Worker
336*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_TRANSLATOR_SYMBOLTABLE_H_
337