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