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