text: //
  // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
  // Copyright (C) 2012-2013 LunarG, Inc.
  //
  // All rights reserved.
  //
  // Redistribution and use in source and binary forms, with or without
  // modification, are permitted provided that the following conditions
  // are met:
  //
  //    Redistributions of source code must retain the above copyright
  //    notice, this list of conditions and the following disclaimer.
  //
  //    Redistributions in binary form must reproduce the above
  //    copyright notice, this list of conditions and the following
  //    disclaimer in the documentation and/or other materials provided
  //    with the distribution.
  //
  //    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
  //    contributors may be used to endorse or promote products derived
  //    from this software without specific prior written permission.
  //
  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  // POSSIBILITY OF SUCH DAMAGE.
  //
  
  #ifndef _BASICTYPES_INCLUDED_
  #define _BASICTYPES_INCLUDED_
  
  namespace glslang {
  
  //
  // Basic type.  Arrays, vectors, sampler details, etc., are orthogonal to this.
  //
  enum TBasicType {
      EbtVoid,
      EbtFloat,
      EbtDouble,
  #ifdef AMD_EXTENSIONS
      EbtFloat16,
  #endif
      EbtInt,
      EbtUint,
      EbtInt64,
      EbtUint64,
      EbtBool,
      EbtAtomicUint,
      EbtSampler,
      EbtStruct,
      EbtBlock,
  
      // HLSL types that live only temporarily.
      EbtString,
  
      EbtNumTypes
  };
  
  //
  // Storage qualifiers.  Should align with different kinds of storage or
  // resource or GLSL storage qualifier.  Expansion is deprecated.
  //
  // N.B.: You probably DON'T want to add anything here, but rather just add it
  // to the built-in variables.  See the comment above TBuiltInVariable.
  //
  // A new built-in variable will normally be an existing qualifier, like 'in', 'out', etc.
  // DO NOT follow the design pattern of, say EvqInstanceId, etc.
  //
  enum TStorageQualifier {
      EvqTemporary,     // For temporaries (within a function), read/write
      EvqGlobal,        // For globals read/write
      EvqConst,         // User-defined constant values, will be semantically constant and constant folded
      EvqVaryingIn,     // pipeline input, read only, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
      EvqVaryingOut,    // pipeline output, read/write, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
      EvqUniform,       // read only, shared with app
      EvqBuffer,        // read/write, shared with app
      EvqShared,        // compute shader's read/write 'shared' qualifier
  
      // parameters
      EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
      EvqOut,           // also, for 'out' in the grammar before we know if it's a pipeline output or an 'out' parameter
      EvqInOut,
      EvqConstReadOnly, // input; also other read-only types having neither a constant value nor constant-value semantics
  
      // built-ins read by vertex shader
      EvqVertexId,
      EvqInstanceId,
  
      // built-ins written by vertex shader
      EvqPosition,
      EvqPointSize,
      EvqClipVertex,
  
      // built-ins read by fragment shader
      EvqFace,
      EvqFragCoord,
      EvqPointCoord,
  
      // built-ins written by fragment shader
      EvqFragColor,
      EvqFragDepth,
  
      // end of list
      EvqLast
  };
  
  //
  // Subcategories of the TStorageQualifier, simply to give a direct mapping
  // between built-in variable names and an numerical value (the enum).
  //
  // For backward compatibility, there is some redundancy between the
  // TStorageQualifier and these.  Existing members should both be maintained accurately.
  // However, any new built-in variable (and any existing non-redundant one)
  // must follow the pattern that the specific built-in is here, and only its
  // general qualifier is in TStorageQualifier.
  //
  // Something like gl_Position, which is sometimes 'in' and sometimes 'out'
  // shows up as two different built-in variables in a single stage, but
  // only has a single enum in TBuiltInVariable, so both the
  // TStorageQualifier and the TBuitinVariable are needed to distinguish
  // between them.
  //
  enum TBuiltInVariable {
      EbvNone,
      EbvNumWorkGroups,
      EbvWorkGroupSize,
      EbvWorkGroupId,
      EbvLocalInvocationId,
      EbvGlobalInvocationId,
      EbvLocalInvocationIndex,
      EbvSubGroupSize,
      EbvSubGroupInvocation,
      EbvSubGroupEqMask,
      EbvSubGroupGeMask,
      EbvSubGroupGtMask,
      EbvSubGroupLeMask,
      EbvSubGroupLtMask,
      EbvVertexId,
      EbvInstanceId,
      EbvVertexIndex,
      EbvInstanceIndex,
      EbvBaseVertex,
      EbvBaseInstance,
      EbvDrawId,
      EbvPosition,
      EbvPointSize,
      EbvClipVertex,
      EbvClipDistance,
      EbvCullDistance,
      EbvNormal,
      EbvVertex,
      EbvMultiTexCoord0,
      EbvMultiTexCoord1,
      EbvMultiTexCoord2,
      EbvMultiTexCoord3,
      EbvMultiTexCoord4,
      EbvMultiTexCoord5,
      EbvMultiTexCoord6,
      EbvMultiTexCoord7,
      EbvFrontColor,
      EbvBackColor,
      EbvFrontSecondaryColor,
      EbvBackSecondaryColor,
      EbvTexCoord,
      EbvFogFragCoord,
      EbvInvocationId,
      EbvPrimitiveId,
      EbvLayer,
      EbvViewportIndex,
      EbvPatchVertices,
      EbvTessLevelOuter,
      EbvTessLevelInner,
      EbvBoundingBox,
      EbvTessCoord,
      EbvColor,
      EbvSecondaryColor,
      EbvFace,
      EbvFragCoord,
      EbvPointCoord,
      EbvFragColor,
      EbvFragData,
      EbvFragDepth,
      EbvSampleId,
      EbvSamplePosition,
      EbvSampleMask,
      EbvHelperInvocation,
  #ifdef AMD_EXTENSIONS
      EbvBaryCoordNoPersp,
      EbvBaryCoordNoPerspCentroid,
      EbvBaryCoordNoPerspSample,
      EbvBaryCoordSmooth,
      EbvBaryCoordSmoothCentroid,
      EbvBaryCoordSmoothSample,
      EbvBaryCoordPullModel,
  #endif
  
  #ifdef NV_EXTENSIONS
      EbvViewportMaskNV,
      EbvSecondaryPositionNV,
      EbvSecondaryViewportMaskNV,
  #endif 
      // HLSL built-ins that live only temporarily, until they get remapped
      // to one of the above.
      EbvFragDepthGreater,
      EbvFragDepthLesser,
  
      EbvLast
  };
  
  // These will show up in error messages
  __inline const char* GetStorageQualifierString(TStorageQualifier q)
  {
      switch (q) {
      case EvqTemporary:      return "temp";           break;
      case EvqGlobal:         return "global";         break;
      case EvqConst:          return "const";          break;
      case EvqConstReadOnly:  return "const (read only)"; break;
      case EvqVaryingIn:      return "in";             break;
      case EvqVaryingOut:     return "out";            break;
      case EvqUniform:        return "uniform";        break;
      case EvqBuffer:         return "buffer";         break;
      case EvqShared:         return "shared";         break;
      case EvqIn:             return "in";             break;
      case EvqOut:            return "out";            break;
      case EvqInOut:          return "inout";          break;
      case EvqVertexId:       return "gl_VertexId";    break;
      case EvqInstanceId:     return "gl_InstanceId";  break;
      case EvqPosition:       return "gl_Position";    break;
      case EvqPointSize:      return "gl_PointSize";   break;
      case EvqClipVertex:     return "gl_ClipVertex";  break;
      case EvqFace:           return "gl_FrontFacing"; break;
      case EvqFragCoord:      return "gl_FragCoord";   break;
      case EvqPointCoord:     return "gl_PointCoord";  break;
      case EvqFragColor:      return "fragColor";      break;
      case EvqFragDepth:      return "gl_FragDepth";   break;
      default:                return "unknown qualifier";
      }
  }
  
  __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
  {
      switch (v) {
      case EbvNone:                 return "";
      case EbvNumWorkGroups:        return "NumWorkGroups";
      case EbvWorkGroupSize:        return "WorkGroupSize";
      case EbvWorkGroupId:          return "WorkGroupID";
      case EbvLocalInvocationId:    return "LocalInvocationID";
      case EbvGlobalInvocationId:   return "GlobalInvocationID";
      case EbvLocalInvocationIndex: return "LocalInvocationIndex";
      case EbvSubGroupSize:         return "SubGroupSize";
      case EbvSubGroupInvocation:   return "SubGroupInvocation";
      case EbvSubGroupEqMask:       return "SubGroupEqMask";
      case EbvSubGroupGeMask:       return "SubGroupGeMask";
      case EbvSubGroupGtMask:       return "SubGroupGtMask";
      case EbvSubGroupLeMask:       return "SubGroupLeMask";
      case EbvSubGroupLtMask:       return "SubGroupLtMask";
      case EbvVertexId:             return "VertexId";
      case EbvInstanceId:           return "InstanceId";
      case EbvVertexIndex:          return "VertexIndex";
      case EbvInstanceIndex:        return "InstanceIndex";
      case EbvBaseVertex:           return "BaseVertex";
      case EbvBaseInstance:         return "BaseInstance";
      case EbvDrawId:               return "DrawId";
      case EbvPosition:             return "Position";
      case EbvPointSize:            return "PointSize";
      case EbvClipVertex:           return "ClipVertex";
      case EbvClipDistance:         return "ClipDistance";
      case EbvCullDistance:         return "CullDistance";
      case EbvNormal:               return "Normal";
      case EbvVertex:               return "Vertex";
      case EbvMultiTexCoord0:       return "MultiTexCoord0";
      case EbvMultiTexCoord1:       return "MultiTexCoord1";
      case EbvMultiTexCoord2:       return "MultiTexCoord2";
      case EbvMultiTexCoord3:       return "MultiTexCoord3";
      case EbvMultiTexCoord4:       return "MultiTexCoord4";
      case EbvMultiTexCoord5:       return "MultiTexCoord5";
      case EbvMultiTexCoord6:       return "MultiTexCoord6";
      case EbvMultiTexCoord7:       return "MultiTexCoord7";
      case EbvFrontColor:           return "FrontColor";
      case EbvBackColor:            return "BackColor";
      case EbvFrontSecondaryColor:  return "FrontSecondaryColor";
      case EbvBackSecondaryColor:   return "BackSecondaryColor";
      case EbvTexCoord:             return "TexCoord";
      case EbvFogFragCoord:         return "FogFragCoord";
      case EbvInvocationId:         return "InvocationID";
      case EbvPrimitiveId:          return "PrimitiveID";
      case EbvLayer:                return "Layer";
      case EbvViewportIndex:        return "ViewportIndex";
      case EbvPatchVertices:        return "PatchVertices";
      case EbvTessLevelOuter:       return "TessLevelOuter";
      case EbvTessLevelInner:       return "TessLevelInner";
      case EbvBoundingBox:          return "BoundingBox";
      case EbvTessCoord:            return "TessCoord";
      case EbvColor:                return "Color";
      case EbvSecondaryColor:       return "SecondaryColor";
      case EbvFace:                 return "Face";
      case EbvFragCoord:            return "FragCoord";
      case EbvPointCoord:           return "PointCoord";
      case EbvFragColor:            return "FragColor";
      case EbvFragData:             return "FragData";
      case EbvFragDepth:            return "FragDepth";
      case EbvSampleId:             return "SampleId";
      case EbvSamplePosition:       return "SamplePosition";
      case EbvSampleMask:           return "SampleMaskIn";
      case EbvHelperInvocation:     return "HelperInvocation";
  #ifdef AMD_EXTENSIONS
      case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
      case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
      case EbvBaryCoordNoPerspSample:     return "BaryCoordNoPerspSample";
      case EbvBaryCoordSmooth:            return "BaryCoordSmooth";
      case EbvBaryCoordSmoothCentroid:    return "BaryCoordSmoothCentroid";
      case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
      case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
  #endif
  #ifdef NV_EXTENSIONS
      case EbvViewportMaskNV:             return "ViewportMaskNV";
      case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
      case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
  #endif 
      default:                      return "unknown built-in variable";
      }
  }
  
  // In this enum, order matters; users can assume higher precision is a bigger value
  // and EpqNone is 0.
  enum TPrecisionQualifier {
      EpqNone = 0,
      EpqLow,
      EpqMedium,
      EpqHigh
  };
  
  __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
  {
      switch(p) {
      case EpqNone:   return "";        break;
      case EpqLow:    return "lowp";    break;
      case EpqMedium: return "mediump"; break;
      case EpqHigh:   return "highp";   break;
      default:        return "unknown precision qualifier";
      }
  }
  
  } // end namespace glslang
  
  #endif // _BASICTYPES_INCLUDED_
  