Home | History | Annotate | Download | only in translator
      1 //
      2 // Copyright (c) 2002-2013 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 _BASICTYPES_INCLUDED_
      8 #define _BASICTYPES_INCLUDED_
      9 
     10 #include <assert.h>
     11 
     12 //
     13 // Precision qualifiers
     14 //
     15 enum TPrecision
     16 {
     17     // These need to be kept sorted
     18     EbpUndefined,
     19     EbpLow,
     20     EbpMedium,
     21     EbpHigh
     22 };
     23 
     24 inline const char* getPrecisionString(TPrecision p)
     25 {
     26     switch(p)
     27     {
     28     case EbpHigh:		return "highp";		break;
     29     case EbpMedium:		return "mediump";	break;
     30     case EbpLow:		return "lowp";		break;
     31     default:			return "mediump";   break;   // Safest fallback
     32     }
     33 }
     34 
     35 //
     36 // Basic type.  Arrays, vectors, etc., are orthogonal to this.
     37 //
     38 enum TBasicType
     39 {
     40     EbtVoid,
     41     EbtFloat,
     42     EbtInt,
     43     EbtUInt,
     44     EbtBool,
     45     EbtGVec4,              // non type: represents vec4, ivec4 and uvec4
     46     EbtGuardSamplerBegin,  // non type: see implementation of IsSampler()
     47     EbtSampler2D,
     48     EbtSampler3D,
     49     EbtSamplerCube,
     50     EbtSampler2DArray,
     51     EbtSamplerExternalOES,  // Only valid if OES_EGL_image_external exists.
     52     EbtSampler2DRect,       // Only valid if GL_ARB_texture_rectangle exists.
     53     EbtISampler2D,
     54     EbtISampler3D,
     55     EbtISamplerCube,
     56     EbtISampler2DArray,
     57     EbtUSampler2D,
     58     EbtUSampler3D,
     59     EbtUSamplerCube,
     60     EbtUSampler2DArray,
     61     EbtSampler2DShadow,
     62     EbtSamplerCubeShadow,
     63     EbtSampler2DArrayShadow,
     64     EbtGuardSamplerEnd,    // non type: see implementation of IsSampler()
     65     EbtGSampler2D,         // non type: represents sampler2D, isampler2D and usampler2D
     66     EbtGSampler3D,         // non type: represents sampler3D, isampler3D and usampler3D
     67     EbtGSamplerCube,       // non type: represents samplerCube, isamplerCube and usamplerCube
     68     EbtGSampler2DArray,    // non type: represents sampler2DArray, isampler2DArray and usampler2DArray
     69     EbtStruct,
     70     EbtInterfaceBlock,
     71     EbtAddress,            // should be deprecated??
     72     EbtInvariant          // used as a type when qualifying a previously declared variable as being invariant
     73 };
     74 
     75 inline const char* getBasicString(TBasicType t)
     76 {
     77     switch (t)
     78     {
     79       case EbtVoid:                 return "void";                 break;
     80       case EbtFloat:                return "float";                break;
     81       case EbtInt:                  return "int";                  break;
     82       case EbtUInt:                 return "uint";                 break;
     83       case EbtBool:                 return "bool";                 break;
     84       case EbtSampler2D:            return "sampler2D";            break;
     85       case EbtSampler3D:            return "sampler3D";            break;
     86       case EbtSamplerCube:          return "samplerCube";          break;
     87       case EbtSamplerExternalOES:   return "samplerExternalOES";   break;
     88       case EbtSampler2DRect:        return "sampler2DRect";        break;
     89       case EbtSampler2DArray:       return "sampler2DArray";       break;
     90       case EbtISampler2D:           return "isampler2D";           break;
     91       case EbtISampler3D:           return "isampler3D";           break;
     92       case EbtISamplerCube:         return "isamplerCube";         break;
     93       case EbtISampler2DArray:      return "isampler2DArray";      break;
     94       case EbtUSampler2D:           return "usampler2D";           break;
     95       case EbtUSampler3D:           return "usampler3D";           break;
     96       case EbtUSamplerCube:         return "usamplerCube";         break;
     97       case EbtUSampler2DArray:      return "usampler2DArray";      break;
     98       case EbtSampler2DShadow:      return "sampler2DShadow";      break;
     99       case EbtSamplerCubeShadow:    return "samplerCubeShadow";    break;
    100       case EbtSampler2DArrayShadow: return "sampler2DArrayShadow"; break;
    101       case EbtStruct:               return "structure";            break;
    102       case EbtInterfaceBlock:       return "interface block";      break;
    103       default:                      return "unknown type";
    104     }
    105 }
    106 
    107 inline bool IsSampler(TBasicType type)
    108 {
    109     return type > EbtGuardSamplerBegin && type < EbtGuardSamplerEnd;
    110 }
    111 
    112 inline bool IsIntegerSampler(TBasicType type)
    113 {
    114     switch (type)
    115     {
    116       case EbtISampler2D:
    117       case EbtISampler3D:
    118       case EbtISamplerCube:
    119       case EbtISampler2DArray:
    120       case EbtUSampler2D:
    121       case EbtUSampler3D:
    122       case EbtUSamplerCube:
    123       case EbtUSampler2DArray:
    124         return true;
    125       case EbtSampler2D:
    126       case EbtSampler3D:
    127       case EbtSamplerCube:
    128       case EbtSamplerExternalOES:
    129       case EbtSampler2DRect:
    130       case EbtSampler2DArray:
    131       case EbtSampler2DShadow:
    132       case EbtSamplerCubeShadow:
    133       case EbtSampler2DArrayShadow:
    134         return false;
    135       default:
    136         assert(!IsSampler(type));
    137     }
    138 
    139     return false;
    140 }
    141 
    142 inline bool IsSampler2D(TBasicType type)
    143 {
    144     switch (type)
    145     {
    146       case EbtSampler2D:
    147       case EbtISampler2D:
    148       case EbtUSampler2D:
    149       case EbtSampler2DArray:
    150       case EbtISampler2DArray:
    151       case EbtUSampler2DArray:
    152       case EbtSampler2DRect:
    153       case EbtSamplerExternalOES:
    154       case EbtSampler2DShadow:
    155       case EbtSampler2DArrayShadow:
    156         return true;
    157       case EbtSampler3D:
    158       case EbtISampler3D:
    159       case EbtUSampler3D:
    160       case EbtISamplerCube:
    161       case EbtUSamplerCube:
    162       case EbtSamplerCube:
    163       case EbtSamplerCubeShadow:
    164         return false;
    165       default:
    166         assert(!IsSampler(type));
    167     }
    168 
    169     return false;
    170 }
    171 
    172 inline bool IsSamplerCube(TBasicType type)
    173 {
    174     switch (type)
    175     {
    176       case EbtSamplerCube:
    177       case EbtISamplerCube:
    178       case EbtUSamplerCube:
    179       case EbtSamplerCubeShadow:
    180         return true;
    181       case EbtSampler2D:
    182       case EbtSampler3D:
    183       case EbtSamplerExternalOES:
    184       case EbtSampler2DRect:
    185       case EbtSampler2DArray:
    186       case EbtISampler2D:
    187       case EbtISampler3D:
    188       case EbtISampler2DArray:
    189       case EbtUSampler2D:
    190       case EbtUSampler3D:
    191       case EbtUSampler2DArray:
    192       case EbtSampler2DShadow:
    193       case EbtSampler2DArrayShadow:
    194         return false;
    195       default:
    196         assert(!IsSampler(type));
    197     }
    198 
    199     return false;
    200 }
    201 
    202 inline bool IsSampler3D(TBasicType type)
    203 {
    204     switch (type)
    205     {
    206       case EbtSampler3D:
    207       case EbtISampler3D:
    208       case EbtUSampler3D:
    209         return true;
    210       case EbtSampler2D:
    211       case EbtSamplerCube:
    212       case EbtSamplerExternalOES:
    213       case EbtSampler2DRect:
    214       case EbtSampler2DArray:
    215       case EbtISampler2D:
    216       case EbtISamplerCube:
    217       case EbtISampler2DArray:
    218       case EbtUSampler2D:
    219       case EbtUSamplerCube:
    220       case EbtUSampler2DArray:
    221       case EbtSampler2DShadow:
    222       case EbtSamplerCubeShadow:
    223       case EbtSampler2DArrayShadow:
    224         return false;
    225       default:
    226         assert(!IsSampler(type));
    227     }
    228 
    229     return false;
    230 }
    231 
    232 inline bool IsSamplerArray(TBasicType type)
    233 {
    234     switch (type)
    235     {
    236       case EbtSampler2DArray:
    237       case EbtISampler2DArray:
    238       case EbtUSampler2DArray:
    239       case EbtSampler2DArrayShadow:
    240         return true;
    241       case EbtSampler2D:
    242       case EbtISampler2D:
    243       case EbtUSampler2D:
    244       case EbtSampler2DRect:
    245       case EbtSamplerExternalOES:
    246       case EbtSampler3D:
    247       case EbtISampler3D:
    248       case EbtUSampler3D:
    249       case EbtISamplerCube:
    250       case EbtUSamplerCube:
    251       case EbtSamplerCube:
    252       case EbtSampler2DShadow:
    253       case EbtSamplerCubeShadow:
    254         return false;
    255       default:
    256         assert(!IsSampler(type));
    257     }
    258 
    259     return false;
    260 }
    261 
    262 inline bool IsShadowSampler(TBasicType type)
    263 {
    264     switch (type)
    265     {
    266       case EbtSampler2DShadow:
    267       case EbtSamplerCubeShadow:
    268       case EbtSampler2DArrayShadow:
    269         return true;
    270       case EbtISampler2D:
    271       case EbtISampler3D:
    272       case EbtISamplerCube:
    273       case EbtISampler2DArray:
    274       case EbtUSampler2D:
    275       case EbtUSampler3D:
    276       case EbtUSamplerCube:
    277       case EbtUSampler2DArray:
    278       case EbtSampler2D:
    279       case EbtSampler3D:
    280       case EbtSamplerCube:
    281       case EbtSamplerExternalOES:
    282       case EbtSampler2DRect:
    283       case EbtSampler2DArray:
    284         return false;
    285       default:
    286         assert(!IsSampler(type));
    287     }
    288 
    289     return false;
    290 }
    291 
    292 inline bool SupportsPrecision(TBasicType type)
    293 {
    294     return type == EbtFloat || type == EbtInt || type == EbtUInt || IsSampler(type);
    295 }
    296 
    297 //
    298 // Qualifiers and built-ins.  These are mainly used to see what can be read
    299 // or written, and by the machine dependent translator to know which registers
    300 // to allocate variables in.  Since built-ins tend to go to different registers
    301 // than varying or uniform, it makes sense they are peers, not sub-classes.
    302 //
    303 enum TQualifier
    304 {
    305     EvqTemporary,     // For temporaries (within a function), read/write
    306     EvqGlobal,        // For globals read/write
    307     EvqInternal,      // For internal use, not visible to the user
    308     EvqConst,         // User defined constants and non-output parameters in functions
    309     EvqAttribute,     // Readonly
    310     EvqVaryingIn,     // readonly, fragment shaders only
    311     EvqVaryingOut,    // vertex shaders only  read/write
    312     EvqInvariantVaryingIn,     // readonly, fragment shaders only
    313     EvqInvariantVaryingOut,    // vertex shaders only  read/write
    314     EvqUniform,       // Readonly, vertex and fragment
    315 
    316     EvqVertexIn,      // Vertex shader input
    317     EvqFragmentOut,   // Fragment shader output
    318     EvqVertexOut,     // Vertex shader output
    319     EvqFragmentIn,    // Fragment shader input
    320 
    321     // parameters
    322     EvqIn,
    323     EvqOut,
    324     EvqInOut,
    325     EvqConstReadOnly,
    326 
    327     // built-ins written by vertex shader
    328     EvqPosition,
    329     EvqPointSize,
    330 
    331     // built-ins read by fragment shader
    332     EvqFragCoord,
    333     EvqFrontFacing,
    334     EvqPointCoord,
    335 
    336     // built-ins written by fragment shader
    337     EvqFragColor,
    338     EvqFragData,
    339     EvqFragDepth,
    340 
    341     // GLSL ES 3.0 vertex output and fragment input
    342     EvqSmooth,        // Incomplete qualifier, smooth is the default
    343     EvqFlat,          // Incomplete qualifier
    344     EvqSmoothOut = EvqSmooth,
    345     EvqFlatOut = EvqFlat,
    346     EvqCentroidOut,   // Implies smooth
    347     EvqSmoothIn,
    348     EvqFlatIn,
    349     EvqCentroidIn,    // Implies smooth
    350 
    351     // end of list
    352     EvqLast
    353 };
    354 
    355 enum TLayoutMatrixPacking
    356 {
    357     EmpUnspecified,
    358     EmpRowMajor,
    359     EmpColumnMajor
    360 };
    361 
    362 enum TLayoutBlockStorage
    363 {
    364     EbsUnspecified,
    365     EbsShared,
    366     EbsPacked,
    367     EbsStd140
    368 };
    369 
    370 struct TLayoutQualifier
    371 {
    372     int location;
    373     TLayoutMatrixPacking matrixPacking;
    374     TLayoutBlockStorage blockStorage;
    375 
    376     static TLayoutQualifier create()
    377     {
    378         TLayoutQualifier layoutQualifier;
    379 
    380         layoutQualifier.location = -1;
    381         layoutQualifier.matrixPacking = EmpUnspecified;
    382         layoutQualifier.blockStorage = EbsUnspecified;
    383 
    384         return layoutQualifier;
    385     }
    386 
    387     bool isEmpty() const
    388     {
    389         return location == -1 && matrixPacking == EmpUnspecified && blockStorage == EbsUnspecified;
    390     }
    391 };
    392 
    393 //
    394 // This is just for debug print out, carried along with the definitions above.
    395 //
    396 inline const char* getQualifierString(TQualifier q)
    397 {
    398     switch(q)
    399     {
    400     case EvqTemporary:      return "Temporary";      break;
    401     case EvqGlobal:         return "Global";         break;
    402     case EvqConst:          return "const";          break;
    403     case EvqConstReadOnly:  return "const";          break;
    404     case EvqAttribute:      return "attribute";      break;
    405     case EvqVaryingIn:      return "varying";        break;
    406     case EvqVaryingOut:     return "varying";        break;
    407     case EvqInvariantVaryingIn: return "invariant varying";	break;
    408     case EvqInvariantVaryingOut:return "invariant varying";	break;
    409     case EvqUniform:        return "uniform";        break;
    410     case EvqVertexIn:       return "in";             break;
    411     case EvqFragmentOut:    return "out";            break;
    412     case EvqVertexOut:      return "out";            break;
    413     case EvqFragmentIn:     return "in";             break;
    414     case EvqIn:             return "in";             break;
    415     case EvqOut:            return "out";            break;
    416     case EvqInOut:          return "inout";          break;
    417     case EvqPosition:       return "Position";       break;
    418     case EvqPointSize:      return "PointSize";      break;
    419     case EvqFragCoord:      return "FragCoord";      break;
    420     case EvqFrontFacing:    return "FrontFacing";    break;
    421     case EvqFragColor:      return "FragColor";      break;
    422     case EvqFragData:       return "FragData";       break;
    423     case EvqFragDepth:      return "FragDepth";      break;
    424     case EvqSmoothOut:      return "smooth out";     break;
    425     case EvqCentroidOut:    return "centroid out";   break;
    426     case EvqFlatOut:        return "flat out";       break;
    427     case EvqSmoothIn:       return "smooth in";      break;
    428     case EvqCentroidIn:     return "centroid in";    break;
    429     case EvqFlatIn:         return "flat in";        break;
    430     default:                return "unknown qualifier";
    431     }
    432 }
    433 
    434 inline const char* getMatrixPackingString(TLayoutMatrixPacking mpq)
    435 {
    436     switch (mpq)
    437     {
    438     case EmpUnspecified:    return "mp_unspecified";
    439     case EmpRowMajor:       return "row_major";
    440     case EmpColumnMajor:    return "column_major";
    441     default:                return "unknown matrix packing";
    442     }
    443 }
    444 
    445 inline const char* getBlockStorageString(TLayoutBlockStorage bsq)
    446 {
    447     switch (bsq)
    448     {
    449     case EbsUnspecified:    return "bs_unspecified";
    450     case EbsShared:         return "shared";
    451     case EbsPacked:         return "packed";
    452     case EbsStd140:         return "std140";
    453     default:                return "unknown block storage";
    454     }
    455 }
    456 
    457 inline const char* getInterpolationString(TQualifier q)
    458 {
    459     switch(q)
    460     {
    461     case EvqSmoothOut:      return "smooth";   break;
    462     case EvqCentroidOut:    return "centroid"; break;
    463     case EvqFlatOut:        return "flat";     break;
    464     case EvqSmoothIn:       return "smooth";   break;
    465     case EvqCentroidIn:     return "centroid"; break;
    466     case EvqFlatIn:         return "flat";     break;
    467     default:                return "unknown interpolation";
    468     }
    469 }
    470 
    471 #endif // _BASICTYPES_INCLUDED_
    472