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 QtPrecise, 28 QtInterpolation, 29 QtLayout, 30 QtStorage, 31 QtPrecision, 32 QtMemory 33 }; 34 35 class TQualifierWrapperBase : angle::NonCopyable 36 { 37 public: 38 POOL_ALLOCATOR_NEW_DELETE TQualifierWrapperBase(const TSourceLoc & line)39 TQualifierWrapperBase(const TSourceLoc &line) : mLine(line) {} ~TQualifierWrapperBase()40 virtual ~TQualifierWrapperBase() {} 41 virtual TQualifierType getType() const = 0; 42 virtual ImmutableString getQualifierString() const = 0; 43 virtual unsigned int getRank() const = 0; getLine()44 const TSourceLoc &getLine() const { return mLine; } 45 46 private: 47 TSourceLoc mLine; 48 }; 49 50 class TInvariantQualifierWrapper final : public TQualifierWrapperBase 51 { 52 public: TInvariantQualifierWrapper(const TSourceLoc & line)53 TInvariantQualifierWrapper(const TSourceLoc &line) : TQualifierWrapperBase(line) {} ~TInvariantQualifierWrapper()54 ~TInvariantQualifierWrapper() override {} 55 getType()56 TQualifierType getType() const override { return QtInvariant; } getQualifierString()57 ImmutableString getQualifierString() const override { return ImmutableString("invariant"); } 58 unsigned int getRank() const override; 59 }; 60 61 class TPreciseQualifierWrapper final : public TQualifierWrapperBase 62 { 63 public: TPreciseQualifierWrapper(const TSourceLoc & line)64 TPreciseQualifierWrapper(const TSourceLoc &line) : TQualifierWrapperBase(line) {} ~TPreciseQualifierWrapper()65 ~TPreciseQualifierWrapper() override {} 66 getType()67 TQualifierType getType() const override { return QtPrecise; } getQualifierString()68 ImmutableString getQualifierString() const override { return ImmutableString("precise"); } 69 unsigned int getRank() const override; 70 }; 71 72 class TInterpolationQualifierWrapper final : public TQualifierWrapperBase 73 { 74 public: TInterpolationQualifierWrapper(TQualifier interpolationQualifier,const TSourceLoc & line)75 TInterpolationQualifierWrapper(TQualifier interpolationQualifier, const TSourceLoc &line) 76 : TQualifierWrapperBase(line), mInterpolationQualifier(interpolationQualifier) 77 {} ~TInterpolationQualifierWrapper()78 ~TInterpolationQualifierWrapper() override {} 79 getType()80 TQualifierType getType() const override { return QtInterpolation; } getQualifierString()81 ImmutableString getQualifierString() const override 82 { 83 return ImmutableString(sh::getQualifierString(mInterpolationQualifier)); 84 } getQualifier()85 TQualifier getQualifier() const { return mInterpolationQualifier; } 86 unsigned int getRank() const override; 87 88 private: 89 TQualifier mInterpolationQualifier; 90 }; 91 92 class TLayoutQualifierWrapper final : public TQualifierWrapperBase 93 { 94 public: TLayoutQualifierWrapper(TLayoutQualifier layoutQualifier,const TSourceLoc & line)95 TLayoutQualifierWrapper(TLayoutQualifier layoutQualifier, const TSourceLoc &line) 96 : TQualifierWrapperBase(line), mLayoutQualifier(layoutQualifier) 97 {} ~TLayoutQualifierWrapper()98 ~TLayoutQualifierWrapper() override {} 99 getType()100 TQualifierType getType() const override { return QtLayout; } getQualifierString()101 ImmutableString getQualifierString() const override { return ImmutableString("layout"); } getQualifier()102 const TLayoutQualifier &getQualifier() const { return mLayoutQualifier; } 103 unsigned int getRank() const override; 104 105 private: 106 TLayoutQualifier mLayoutQualifier; 107 }; 108 109 class TStorageQualifierWrapper final : public TQualifierWrapperBase 110 { 111 public: TStorageQualifierWrapper(TQualifier storageQualifier,const TSourceLoc & line)112 TStorageQualifierWrapper(TQualifier storageQualifier, const TSourceLoc &line) 113 : TQualifierWrapperBase(line), mStorageQualifier(storageQualifier) 114 {} ~TStorageQualifierWrapper()115 ~TStorageQualifierWrapper() override {} 116 getType()117 TQualifierType getType() const override { return QtStorage; } getQualifierString()118 ImmutableString getQualifierString() const override 119 { 120 return ImmutableString(sh::getQualifierString(mStorageQualifier)); 121 } getQualifier()122 TQualifier getQualifier() const { return mStorageQualifier; } 123 unsigned int getRank() const override; 124 125 private: 126 TQualifier mStorageQualifier; 127 }; 128 129 class TPrecisionQualifierWrapper final : public TQualifierWrapperBase 130 { 131 public: TPrecisionQualifierWrapper(TPrecision precisionQualifier,const TSourceLoc & line)132 TPrecisionQualifierWrapper(TPrecision precisionQualifier, const TSourceLoc &line) 133 : TQualifierWrapperBase(line), mPrecisionQualifier(precisionQualifier) 134 {} ~TPrecisionQualifierWrapper()135 ~TPrecisionQualifierWrapper() override {} 136 getType()137 TQualifierType getType() const override { return QtPrecision; } getQualifierString()138 ImmutableString getQualifierString() const override 139 { 140 return ImmutableString(sh::getPrecisionString(mPrecisionQualifier)); 141 } getQualifier()142 TPrecision getQualifier() const { return mPrecisionQualifier; } 143 unsigned int getRank() const override; 144 145 private: 146 TPrecision mPrecisionQualifier; 147 }; 148 149 class TMemoryQualifierWrapper final : public TQualifierWrapperBase 150 { 151 public: TMemoryQualifierWrapper(TQualifier memoryQualifier,const TSourceLoc & line)152 TMemoryQualifierWrapper(TQualifier memoryQualifier, const TSourceLoc &line) 153 : TQualifierWrapperBase(line), mMemoryQualifier(memoryQualifier) 154 {} ~TMemoryQualifierWrapper()155 ~TMemoryQualifierWrapper() override {} 156 getType()157 TQualifierType getType() const override { return QtMemory; } getQualifierString()158 ImmutableString getQualifierString() const override 159 { 160 return ImmutableString(sh::getQualifierString(mMemoryQualifier)); 161 } getQualifier()162 TQualifier getQualifier() const { return mMemoryQualifier; } 163 unsigned int getRank() const override; 164 165 private: 166 TQualifier mMemoryQualifier; 167 }; 168 169 // TTypeQualifier tightly covers type_qualifier from the grammar 170 struct TTypeQualifier 171 { 172 // initializes all of the qualifiers and sets the scope 173 TTypeQualifier(TQualifier scope, const TSourceLoc &loc); 174 175 TLayoutQualifier layoutQualifier; 176 TMemoryQualifier memoryQualifier; 177 TPrecision precision; 178 TQualifier qualifier; 179 bool invariant; 180 bool precise; 181 TSourceLoc line; 182 }; 183 184 // TTypeQualifierBuilder contains all of the qualifiers when type_qualifier gets parsed. 185 // It is to be used to validate the qualifier sequence and build a TTypeQualifier from it. 186 class TTypeQualifierBuilder : angle::NonCopyable 187 { 188 public: 189 using QualifierSequence = TVector<const TQualifierWrapperBase *>; 190 191 public: 192 POOL_ALLOCATOR_NEW_DELETE 193 TTypeQualifierBuilder(const TStorageQualifierWrapper *scope, int shaderVersion); 194 // Adds the passed qualifier to the end of the sequence. 195 void appendQualifier(const TQualifierWrapperBase *qualifier); 196 // Checks for the order of qualification and repeating qualifiers. 197 bool checkSequenceIsValid(TDiagnostics *diagnostics) const; 198 // Goes over the qualifier sequence and parses it to form a type qualifier for a function 199 // parameter. 200 // The returned object is initialized even if the parsing fails. 201 TTypeQualifier getParameterTypeQualifier(TDiagnostics *diagnostics) const; 202 // Goes over the qualifier sequence and parses it to form a type qualifier for a variable. 203 // The returned object is initialized even if the parsing fails. 204 TTypeQualifier getVariableTypeQualifier(TDiagnostics *diagnostics) const; 205 206 private: 207 QualifierSequence mQualifiers; 208 int mShaderVersion; 209 }; 210 211 } // namespace sh 212 213 #endif // COMPILER_TRANSLATOR_QUALIFIER_TYPES_H_ 214