| // |
| //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, |
| 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 |
| |
| // 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 |
| 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_ |