Home | History | Annotate | Download | only in translator
      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