• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #ifndef COMPILER_TRANSLATOR_QUALIFIER_TYPES_H_
8 #define COMPILER_TRANSLATOR_QUALIFIER_TYPES_H_
9 
10 #include "common/angleutils.h"
11 #include "compiler/translator/BaseTypes.h"
12 #include "compiler/translator/ImmutableString.h"
13 #include "compiler/translator/Types.h"
14 
15 namespace sh
16 {
17 class TDiagnostics;
18 
19 TLayoutQualifier JoinLayoutQualifiers(TLayoutQualifier leftQualifier,
20                                       TLayoutQualifier rightQualifier,
21                                       const TSourceLoc &rightQualifierLocation,
22                                       TDiagnostics *diagnostics);
23 
24 enum TQualifierType
25 {
26     QtInvariant,
27     QtInterpolation,
28     QtLayout,
29     QtStorage,
30     QtPrecision,
31     QtMemory
32 };
33 
34 class TQualifierWrapperBase : angle::NonCopyable
35 {
36   public:
37     POOL_ALLOCATOR_NEW_DELETE
TQualifierWrapperBase(const TSourceLoc & line)38     TQualifierWrapperBase(const TSourceLoc &line) : mLine(line) {}
~TQualifierWrapperBase()39     virtual ~TQualifierWrapperBase() {}
40     virtual TQualifierType getType() const             = 0;
41     virtual ImmutableString getQualifierString() const = 0;
42     virtual unsigned int getRank() const               = 0;
getLine()43     const TSourceLoc &getLine() const { return mLine; }
44 
45   private:
46     TSourceLoc mLine;
47 };
48 
49 class TInvariantQualifierWrapper final : public TQualifierWrapperBase
50 {
51   public:
TInvariantQualifierWrapper(const TSourceLoc & line)52     TInvariantQualifierWrapper(const TSourceLoc &line) : TQualifierWrapperBase(line) {}
~TInvariantQualifierWrapper()53     ~TInvariantQualifierWrapper() {}
54 
getType()55     TQualifierType getType() const override { return QtInvariant; }
getQualifierString()56     ImmutableString getQualifierString() const override { return ImmutableString("invariant"); }
57     unsigned int getRank() const override;
58 };
59 
60 class TInterpolationQualifierWrapper final : public TQualifierWrapperBase
61 {
62   public:
TInterpolationQualifierWrapper(TQualifier interpolationQualifier,const TSourceLoc & line)63     TInterpolationQualifierWrapper(TQualifier interpolationQualifier, const TSourceLoc &line)
64         : TQualifierWrapperBase(line), mInterpolationQualifier(interpolationQualifier)
65     {}
~TInterpolationQualifierWrapper()66     ~TInterpolationQualifierWrapper() {}
67 
getType()68     TQualifierType getType() const override { return QtInterpolation; }
getQualifierString()69     ImmutableString getQualifierString() const override
70     {
71         return ImmutableString(sh::getQualifierString(mInterpolationQualifier));
72     }
getQualifier()73     TQualifier getQualifier() const { return mInterpolationQualifier; }
74     unsigned int getRank() const override;
75 
76   private:
77     TQualifier mInterpolationQualifier;
78 };
79 
80 class TLayoutQualifierWrapper final : public TQualifierWrapperBase
81 {
82   public:
TLayoutQualifierWrapper(TLayoutQualifier layoutQualifier,const TSourceLoc & line)83     TLayoutQualifierWrapper(TLayoutQualifier layoutQualifier, const TSourceLoc &line)
84         : TQualifierWrapperBase(line), mLayoutQualifier(layoutQualifier)
85     {}
~TLayoutQualifierWrapper()86     ~TLayoutQualifierWrapper() {}
87 
getType()88     TQualifierType getType() const override { return QtLayout; }
getQualifierString()89     ImmutableString getQualifierString() const override { return ImmutableString("layout"); }
getQualifier()90     const TLayoutQualifier &getQualifier() const { return mLayoutQualifier; }
91     unsigned int getRank() const override;
92 
93   private:
94     TLayoutQualifier mLayoutQualifier;
95 };
96 
97 class TStorageQualifierWrapper final : public TQualifierWrapperBase
98 {
99   public:
TStorageQualifierWrapper(TQualifier storageQualifier,const TSourceLoc & line)100     TStorageQualifierWrapper(TQualifier storageQualifier, const TSourceLoc &line)
101         : TQualifierWrapperBase(line), mStorageQualifier(storageQualifier)
102     {}
~TStorageQualifierWrapper()103     ~TStorageQualifierWrapper() {}
104 
getType()105     TQualifierType getType() const override { return QtStorage; }
getQualifierString()106     ImmutableString getQualifierString() const override
107     {
108         return ImmutableString(sh::getQualifierString(mStorageQualifier));
109     }
getQualifier()110     TQualifier getQualifier() const { return mStorageQualifier; }
111     unsigned int getRank() const override;
112 
113   private:
114     TQualifier mStorageQualifier;
115 };
116 
117 class TPrecisionQualifierWrapper final : public TQualifierWrapperBase
118 {
119   public:
TPrecisionQualifierWrapper(TPrecision precisionQualifier,const TSourceLoc & line)120     TPrecisionQualifierWrapper(TPrecision precisionQualifier, const TSourceLoc &line)
121         : TQualifierWrapperBase(line), mPrecisionQualifier(precisionQualifier)
122     {}
~TPrecisionQualifierWrapper()123     ~TPrecisionQualifierWrapper() {}
124 
getType()125     TQualifierType getType() const override { return QtPrecision; }
getQualifierString()126     ImmutableString getQualifierString() const override
127     {
128         return ImmutableString(sh::getPrecisionString(mPrecisionQualifier));
129     }
getQualifier()130     TPrecision getQualifier() const { return mPrecisionQualifier; }
131     unsigned int getRank() const override;
132 
133   private:
134     TPrecision mPrecisionQualifier;
135 };
136 
137 class TMemoryQualifierWrapper final : public TQualifierWrapperBase
138 {
139   public:
TMemoryQualifierWrapper(TQualifier memoryQualifier,const TSourceLoc & line)140     TMemoryQualifierWrapper(TQualifier memoryQualifier, const TSourceLoc &line)
141         : TQualifierWrapperBase(line), mMemoryQualifier(memoryQualifier)
142     {}
~TMemoryQualifierWrapper()143     ~TMemoryQualifierWrapper() {}
144 
getType()145     TQualifierType getType() const override { return QtMemory; }
getQualifierString()146     ImmutableString getQualifierString() const override
147     {
148         return ImmutableString(sh::getQualifierString(mMemoryQualifier));
149     }
getQualifier()150     TQualifier getQualifier() const { return mMemoryQualifier; }
151     unsigned int getRank() const override;
152 
153   private:
154     TQualifier mMemoryQualifier;
155 };
156 
157 // TTypeQualifier tightly covers type_qualifier from the grammar
158 struct TTypeQualifier
159 {
160     // initializes all of the qualifiers and sets the scope
161     TTypeQualifier(TQualifier scope, const TSourceLoc &loc);
162 
163     TLayoutQualifier layoutQualifier;
164     TMemoryQualifier memoryQualifier;
165     TPrecision precision;
166     TQualifier qualifier;
167     bool invariant;
168     TSourceLoc line;
169 };
170 
171 // TTypeQualifierBuilder contains all of the qualifiers when type_qualifier gets parsed.
172 // It is to be used to validate the qualifier sequence and build a TTypeQualifier from it.
173 class TTypeQualifierBuilder : angle::NonCopyable
174 {
175   public:
176     using QualifierSequence = TVector<const TQualifierWrapperBase *>;
177 
178   public:
179     POOL_ALLOCATOR_NEW_DELETE
180     TTypeQualifierBuilder(const TStorageQualifierWrapper *scope, int shaderVersion);
181     // Adds the passed qualifier to the end of the sequence.
182     void appendQualifier(const TQualifierWrapperBase *qualifier);
183     // Checks for the order of qualification and repeating qualifiers.
184     bool checkSequenceIsValid(TDiagnostics *diagnostics) const;
185     // Goes over the qualifier sequence and parses it to form a type qualifier for a function
186     // parameter.
187     // The returned object is initialized even if the parsing fails.
188     TTypeQualifier getParameterTypeQualifier(TDiagnostics *diagnostics) const;
189     // Goes over the qualifier sequence and parses it to form a type qualifier for a variable.
190     // The returned object is initialized even if the parsing fails.
191     TTypeQualifier getVariableTypeQualifier(TDiagnostics *diagnostics) const;
192 
193   private:
194     QualifierSequence mQualifiers;
195     int mShaderVersion;
196 };
197 
198 }  // namespace sh
199 
200 #endif  // COMPILER_TRANSLATOR_QUALIFIER_TYPES_H_
201