1 // 2 // Copyright (c) 2002-2014 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 #if defined(_MSC_VER) 8 #pragma warning(disable: 4718) 9 #endif 10 11 #include "compiler/translator/Types.h" 12 13 #include <algorithm> 14 #include <climits> 15 16 const char* getBasicString(TBasicType t) 17 { 18 switch (t) 19 { 20 case EbtVoid: return "void"; break; 21 case EbtFloat: return "float"; break; 22 case EbtInt: return "int"; break; 23 case EbtUInt: return "uint"; break; 24 case EbtBool: return "bool"; break; 25 case EbtSampler2D: return "sampler2D"; break; 26 case EbtSampler3D: return "sampler3D"; break; 27 case EbtSamplerCube: return "samplerCube"; break; 28 case EbtSamplerExternalOES: return "samplerExternalOES"; break; 29 case EbtSampler2DRect: return "sampler2DRect"; break; 30 case EbtSampler2DArray: return "sampler2DArray"; break; 31 case EbtISampler2D: return "isampler2D"; break; 32 case EbtISampler3D: return "isampler3D"; break; 33 case EbtISamplerCube: return "isamplerCube"; break; 34 case EbtISampler2DArray: return "isampler2DArray"; break; 35 case EbtUSampler2D: return "usampler2D"; break; 36 case EbtUSampler3D: return "usampler3D"; break; 37 case EbtUSamplerCube: return "usamplerCube"; break; 38 case EbtUSampler2DArray: return "usampler2DArray"; break; 39 case EbtSampler2DShadow: return "sampler2DShadow"; break; 40 case EbtSamplerCubeShadow: return "samplerCubeShadow"; break; 41 case EbtSampler2DArrayShadow: return "sampler2DArrayShadow"; break; 42 case EbtStruct: return "structure"; break; 43 case EbtInterfaceBlock: return "interface block"; break; 44 default: UNREACHABLE(); return "unknown type"; 45 } 46 } 47 48 TType::TType(const TPublicType &p) 49 : type(p.type), precision(p.precision), qualifier(p.qualifier), layoutQualifier(p.layoutQualifier), 50 primarySize(p.primarySize), secondarySize(p.secondarySize), array(p.array), arraySize(p.arraySize), 51 interfaceBlock(0), structure(0) 52 { 53 if (p.userDef) 54 structure = p.userDef->getStruct(); 55 } 56 57 bool TStructure::equals(const TStructure &other) const 58 { 59 return (uniqueId() == other.uniqueId()); 60 } 61 62 // 63 // Recursively generate mangled names. 64 // 65 TString TType::buildMangledName() const 66 { 67 TString mangledName; 68 if (isMatrix()) 69 mangledName += 'm'; 70 else if (isVector()) 71 mangledName += 'v'; 72 73 switch (type) 74 { 75 case EbtFloat: 76 mangledName += 'f'; 77 break; 78 case EbtInt: 79 mangledName += 'i'; 80 break; 81 case EbtUInt: 82 mangledName += 'u'; 83 break; 84 case EbtBool: 85 mangledName += 'b'; 86 break; 87 case EbtSampler2D: 88 mangledName += "s2"; 89 break; 90 case EbtSampler3D: 91 mangledName += "s3"; 92 break; 93 case EbtSamplerCube: 94 mangledName += "sC"; 95 break; 96 case EbtSampler2DArray: 97 mangledName += "s2a"; 98 break; 99 case EbtSamplerExternalOES: 100 mangledName += "sext"; 101 break; 102 case EbtSampler2DRect: 103 mangledName += "s2r"; 104 break; 105 case EbtISampler2D: 106 mangledName += "is2"; 107 break; 108 case EbtISampler3D: 109 mangledName += "is3"; 110 break; 111 case EbtISamplerCube: 112 mangledName += "isC"; 113 break; 114 case EbtISampler2DArray: 115 mangledName += "is2a"; 116 break; 117 case EbtUSampler2D: 118 mangledName += "us2"; 119 break; 120 case EbtUSampler3D: 121 mangledName += "us3"; 122 break; 123 case EbtUSamplerCube: 124 mangledName += "usC"; 125 break; 126 case EbtUSampler2DArray: 127 mangledName += "us2a"; 128 break; 129 case EbtSampler2DShadow: 130 mangledName += "s2s"; 131 break; 132 case EbtSamplerCubeShadow: 133 mangledName += "sCs"; 134 break; 135 case EbtSampler2DArrayShadow: 136 mangledName += "s2as"; 137 break; 138 case EbtStruct: 139 mangledName += structure->mangledName(); 140 break; 141 case EbtInterfaceBlock: 142 mangledName += interfaceBlock->mangledName(); 143 break; 144 default: 145 UNREACHABLE(); 146 } 147 148 if (isMatrix()) 149 { 150 mangledName += static_cast<char>('0' + getCols()); 151 mangledName += static_cast<char>('x'); 152 mangledName += static_cast<char>('0' + getRows()); 153 } 154 else 155 { 156 mangledName += static_cast<char>('0' + getNominalSize()); 157 } 158 159 if (isArray()) 160 { 161 char buf[20]; 162 snprintf(buf, sizeof(buf), "%d", arraySize); 163 mangledName += '['; 164 mangledName += buf; 165 mangledName += ']'; 166 } 167 return mangledName; 168 } 169 170 size_t TType::getObjectSize() const 171 { 172 size_t totalSize; 173 174 if (getBasicType() == EbtStruct) 175 totalSize = structure->objectSize(); 176 else 177 totalSize = primarySize * secondarySize; 178 179 if (isArray()) 180 { 181 size_t arraySize = getArraySize(); 182 if (arraySize > INT_MAX / totalSize) 183 totalSize = INT_MAX; 184 else 185 totalSize *= arraySize; 186 } 187 188 return totalSize; 189 } 190 191 bool TStructure::containsArrays() const 192 { 193 for (size_t i = 0; i < mFields->size(); ++i) 194 { 195 const TType *fieldType = (*mFields)[i]->type(); 196 if (fieldType->isArray() || fieldType->isStructureContainingArrays()) 197 return true; 198 } 199 return false; 200 } 201 202 TString TFieldListCollection::buildMangledName() const 203 { 204 TString mangledName(mangledNamePrefix()); 205 mangledName += *mName; 206 for (size_t i = 0; i < mFields->size(); ++i) 207 { 208 mangledName += '-'; 209 mangledName += (*mFields)[i]->type()->getMangledName(); 210 } 211 return mangledName; 212 } 213 214 size_t TFieldListCollection::calculateObjectSize() const 215 { 216 size_t size = 0; 217 for (size_t i = 0; i < mFields->size(); ++i) 218 { 219 size_t fieldSize = (*mFields)[i]->type()->getObjectSize(); 220 if (fieldSize > INT_MAX - size) 221 size = INT_MAX; 222 else 223 size += fieldSize; 224 } 225 return size; 226 } 227 228 int TStructure::calculateDeepestNesting() const 229 { 230 int maxNesting = 0; 231 for (size_t i = 0; i < mFields->size(); ++i) 232 maxNesting = std::max(maxNesting, (*mFields)[i]->type()->getDeepestStructNesting()); 233 return 1 + maxNesting; 234 } 235