xref: /aosp_15_r20/external/angle/src/compiler/translator/SymbolTable.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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