Add support for GL_NV_shader_invocation_reorder. (#3054)
[platform/upstream/glslang.git] / glslang / Include / BaseTypes.h
1 //
2 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
3 // Copyright (C) 2012-2013 LunarG, Inc.
4 // Copyright (C) 2017 ARM Limited.
5 // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
6 //
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions
11 // are met:
12 //
13 //    Redistributions of source code must retain the above copyright
14 //    notice, this list of conditions and the following disclaimer.
15 //
16 //    Redistributions in binary form must reproduce the above
17 //    copyright notice, this list of conditions and the following
18 //    disclaimer in the documentation and/or other materials provided
19 //    with the distribution.
20 //
21 //    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
22 //    contributors may be used to endorse or promote products derived
23 //    from this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29 // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 // POSSIBILITY OF SUCH DAMAGE.
37 //
38
39 #ifndef _BASICTYPES_INCLUDED_
40 #define _BASICTYPES_INCLUDED_
41
42 namespace glslang {
43
44 //
45 // Basic type.  Arrays, vectors, sampler details, etc., are orthogonal to this.
46 //
47 enum TBasicType {
48     EbtVoid,
49     EbtFloat,
50     EbtDouble,
51     EbtFloat16,
52     EbtInt8,
53     EbtUint8,
54     EbtInt16,
55     EbtUint16,
56     EbtInt,
57     EbtUint,
58     EbtInt64,
59     EbtUint64,
60     EbtBool,
61     EbtAtomicUint,
62     EbtSampler,
63     EbtStruct,
64     EbtBlock,
65     EbtAccStruct,
66     EbtReference,
67     EbtRayQuery,
68     EbtHitObjectNV,
69 #ifndef GLSLANG_WEB
70     // SPIR-V type defined by spirv_type
71     EbtSpirvType,
72 #endif
73
74     // HLSL types that live only temporarily.
75     EbtString,
76
77     EbtNumTypes
78 };
79
80 //
81 // Storage qualifiers.  Should align with different kinds of storage or
82 // resource or GLSL storage qualifier.  Expansion is deprecated.
83 //
84 // N.B.: You probably DON'T want to add anything here, but rather just add it
85 // to the built-in variables.  See the comment above TBuiltInVariable.
86 //
87 // A new built-in variable will normally be an existing qualifier, like 'in', 'out', etc.
88 // DO NOT follow the design pattern of, say EvqInstanceId, etc.
89 //
90 enum TStorageQualifier {
91     EvqTemporary,     // For temporaries (within a function), read/write
92     EvqGlobal,        // For globals read/write
93     EvqConst,         // User-defined constant values, will be semantically constant and constant folded
94     EvqVaryingIn,     // pipeline input, read only, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
95     EvqVaryingOut,    // pipeline output, read/write, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
96     EvqUniform,       // read only, shared with app
97     EvqBuffer,        // read/write, shared with app
98     EvqShared,        // compute shader's read/write 'shared' qualifier
99 #ifndef GLSLANG_WEB
100     EvqSpirvStorageClass, // spirv_storage_class
101 #endif
102
103     EvqPayload,
104     EvqPayloadIn,
105     EvqHitAttr,
106     EvqCallableData,
107     EvqCallableDataIn,
108     EvqHitObjectAttrNV,
109
110     EvqtaskPayloadSharedEXT,
111
112     // parameters
113     EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
114     EvqOut,           // also, for 'out' in the grammar before we know if it's a pipeline output or an 'out' parameter
115     EvqInOut,
116     EvqConstReadOnly, // input; also other read-only types having neither a constant value nor constant-value semantics
117
118     // built-ins read by vertex shader
119     EvqVertexId,
120     EvqInstanceId,
121
122     // built-ins written by vertex shader
123     EvqPosition,
124     EvqPointSize,
125     EvqClipVertex,
126
127     // built-ins read by fragment shader
128     EvqFace,
129     EvqFragCoord,
130     EvqPointCoord,
131
132     // built-ins written by fragment shader
133     EvqFragColor,
134     EvqFragDepth,
135     EvqFragStencil,
136
137     // end of list
138     EvqLast
139 };
140
141 //
142 // Subcategories of the TStorageQualifier, simply to give a direct mapping
143 // between built-in variable names and an numerical value (the enum).
144 //
145 // For backward compatibility, there is some redundancy between the
146 // TStorageQualifier and these.  Existing members should both be maintained accurately.
147 // However, any new built-in variable (and any existing non-redundant one)
148 // must follow the pattern that the specific built-in is here, and only its
149 // general qualifier is in TStorageQualifier.
150 //
151 // Something like gl_Position, which is sometimes 'in' and sometimes 'out'
152 // shows up as two different built-in variables in a single stage, but
153 // only has a single enum in TBuiltInVariable, so both the
154 // TStorageQualifier and the TBuitinVariable are needed to distinguish
155 // between them.
156 //
157 enum TBuiltInVariable {
158     EbvNone,
159     EbvNumWorkGroups,
160     EbvWorkGroupSize,
161     EbvWorkGroupId,
162     EbvLocalInvocationId,
163     EbvGlobalInvocationId,
164     EbvLocalInvocationIndex,
165     EbvNumSubgroups,
166     EbvSubgroupID,
167     EbvSubGroupSize,
168     EbvSubGroupInvocation,
169     EbvSubGroupEqMask,
170     EbvSubGroupGeMask,
171     EbvSubGroupGtMask,
172     EbvSubGroupLeMask,
173     EbvSubGroupLtMask,
174     EbvSubgroupSize2,
175     EbvSubgroupInvocation2,
176     EbvSubgroupEqMask2,
177     EbvSubgroupGeMask2,
178     EbvSubgroupGtMask2,
179     EbvSubgroupLeMask2,
180     EbvSubgroupLtMask2,
181     EbvVertexId,
182     EbvInstanceId,
183     EbvVertexIndex,
184     EbvInstanceIndex,
185     EbvBaseVertex,
186     EbvBaseInstance,
187     EbvDrawId,
188     EbvPosition,
189     EbvPointSize,
190     EbvClipVertex,
191     EbvClipDistance,
192     EbvCullDistance,
193     EbvNormal,
194     EbvVertex,
195     EbvMultiTexCoord0,
196     EbvMultiTexCoord1,
197     EbvMultiTexCoord2,
198     EbvMultiTexCoord3,
199     EbvMultiTexCoord4,
200     EbvMultiTexCoord5,
201     EbvMultiTexCoord6,
202     EbvMultiTexCoord7,
203     EbvFrontColor,
204     EbvBackColor,
205     EbvFrontSecondaryColor,
206     EbvBackSecondaryColor,
207     EbvTexCoord,
208     EbvFogFragCoord,
209     EbvInvocationId,
210     EbvPrimitiveId,
211     EbvLayer,
212     EbvViewportIndex,
213     EbvPatchVertices,
214     EbvTessLevelOuter,
215     EbvTessLevelInner,
216     EbvBoundingBox,
217     EbvTessCoord,
218     EbvColor,
219     EbvSecondaryColor,
220     EbvFace,
221     EbvFragCoord,
222     EbvPointCoord,
223     EbvFragColor,
224     EbvFragData,
225     EbvFragDepth,
226     EbvFragStencilRef,
227     EbvSampleId,
228     EbvSamplePosition,
229     EbvSampleMask,
230     EbvHelperInvocation,
231
232     EbvBaryCoordNoPersp,
233     EbvBaryCoordNoPerspCentroid,
234     EbvBaryCoordNoPerspSample,
235     EbvBaryCoordSmooth,
236     EbvBaryCoordSmoothCentroid,
237     EbvBaryCoordSmoothSample,
238     EbvBaryCoordPullModel,
239
240     EbvViewIndex,
241     EbvDeviceIndex,
242
243     EbvShadingRateKHR,
244     EbvPrimitiveShadingRateKHR,
245
246     EbvFragSizeEXT,
247     EbvFragInvocationCountEXT,
248
249     EbvSecondaryFragDataEXT,
250     EbvSecondaryFragColorEXT,
251
252     EbvViewportMaskNV,
253     EbvSecondaryPositionNV,
254     EbvSecondaryViewportMaskNV,
255     EbvPositionPerViewNV,
256     EbvViewportMaskPerViewNV,
257     EbvFragFullyCoveredNV,
258     EbvFragmentSizeNV,
259     EbvInvocationsPerPixelNV,
260     // ray tracing
261     EbvLaunchId,
262     EbvLaunchSize,
263     EbvInstanceCustomIndex,
264     EbvGeometryIndex,
265     EbvWorldRayOrigin,
266     EbvWorldRayDirection,
267     EbvObjectRayOrigin,
268     EbvObjectRayDirection,
269     EbvRayTmin,
270     EbvRayTmax,
271     EbvCullMask,
272     EbvHitT,
273     EbvHitKind,
274     EbvObjectToWorld,
275     EbvObjectToWorld3x4,
276     EbvWorldToObject,
277     EbvWorldToObject3x4,
278     EbvIncomingRayFlags,
279     EbvCurrentRayTimeNV,
280     // barycentrics
281     EbvBaryCoordNV,
282     EbvBaryCoordNoPerspNV,
283     EbvBaryCoordEXT,
284     EbvBaryCoordNoPerspEXT,
285     // mesh shaders
286     EbvTaskCountNV,
287     EbvPrimitiveCountNV,
288     EbvPrimitiveIndicesNV,
289     EbvClipDistancePerViewNV,
290     EbvCullDistancePerViewNV,
291     EbvLayerPerViewNV,
292     EbvMeshViewCountNV,
293     EbvMeshViewIndicesNV,
294     //GL_EXT_mesh_shader
295     EbvPrimitivePointIndicesEXT,
296     EbvPrimitiveLineIndicesEXT,
297     EbvPrimitiveTriangleIndicesEXT,
298     EbvCullPrimitiveEXT,
299
300     // sm builtins
301     EbvWarpsPerSM,
302     EbvSMCount,
303     EbvWarpID,
304     EbvSMID,
305
306     // HLSL built-ins that live only temporarily, until they get remapped
307     // to one of the above.
308     EbvFragDepthGreater,
309     EbvFragDepthLesser,
310     EbvGsOutputStream,
311     EbvOutputPatch,
312     EbvInputPatch,
313
314     // structbuffer types
315     EbvAppendConsume, // no need to differentiate append and consume
316     EbvRWStructuredBuffer,
317     EbvStructuredBuffer,
318     EbvByteAddressBuffer,
319     EbvRWByteAddressBuffer,
320
321     // ARM specific core builtins
322     EbvCoreCountARM,
323     EbvCoreIDARM,
324     EbvCoreMaxIDARM,
325     EbvWarpIDARM,
326     EbvWarpMaxIDARM,
327
328     EbvLast
329 };
330
331 // In this enum, order matters; users can assume higher precision is a bigger value
332 // and EpqNone is 0.
333 enum TPrecisionQualifier {
334     EpqNone = 0,
335     EpqLow,
336     EpqMedium,
337     EpqHigh
338 };
339
340 #ifdef GLSLANG_WEB
341 __inline const char* GetStorageQualifierString(TStorageQualifier q) { return ""; }
342 __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) { return ""; }
343 #else
344 // These will show up in error messages
345 __inline const char* GetStorageQualifierString(TStorageQualifier q)
346 {
347     switch (q) {
348     case EvqTemporary:      return "temp";           break;
349     case EvqGlobal:         return "global";         break;
350     case EvqConst:          return "const";          break;
351     case EvqConstReadOnly:  return "const (read only)"; break;
352 #ifndef GLSLANG_WEB
353     case EvqSpirvStorageClass: return "spirv_storage_class"; break;
354 #endif
355     case EvqVaryingIn:      return "in";             break;
356     case EvqVaryingOut:     return "out";            break;
357     case EvqUniform:        return "uniform";        break;
358     case EvqBuffer:         return "buffer";         break;
359     case EvqShared:         return "shared";         break;
360     case EvqIn:             return "in";             break;
361     case EvqOut:            return "out";            break;
362     case EvqInOut:          return "inout";          break;
363     case EvqVertexId:       return "gl_VertexId";    break;
364     case EvqInstanceId:     return "gl_InstanceId";  break;
365     case EvqPosition:       return "gl_Position";    break;
366     case EvqPointSize:      return "gl_PointSize";   break;
367     case EvqClipVertex:     return "gl_ClipVertex";  break;
368     case EvqFace:           return "gl_FrontFacing"; break;
369     case EvqFragCoord:      return "gl_FragCoord";   break;
370     case EvqPointCoord:     return "gl_PointCoord";  break;
371     case EvqFragColor:      return "fragColor";      break;
372     case EvqFragDepth:      return "gl_FragDepth";   break;
373     case EvqFragStencil:    return "gl_FragStencilRefARB"; break;
374     case EvqPayload:        return "rayPayloadNV";     break;
375     case EvqPayloadIn:      return "rayPayloadInNV";   break;
376     case EvqHitAttr:        return "hitAttributeNV";   break;
377     case EvqCallableData:   return "callableDataNV";   break;
378     case EvqCallableDataIn: return "callableDataInNV"; break;
379     case EvqtaskPayloadSharedEXT: return "taskPayloadSharedEXT"; break;
380     case EvqHitObjectAttrNV:return "hitObjectAttributeNV"; break;
381     default:                return "unknown qualifier";
382     }
383 }
384
385 __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
386 {
387     switch (v) {
388     case EbvNone:                 return "";
389     case EbvNumWorkGroups:        return "NumWorkGroups";
390     case EbvWorkGroupSize:        return "WorkGroupSize";
391     case EbvWorkGroupId:          return "WorkGroupID";
392     case EbvLocalInvocationId:    return "LocalInvocationID";
393     case EbvGlobalInvocationId:   return "GlobalInvocationID";
394     case EbvLocalInvocationIndex: return "LocalInvocationIndex";
395     case EbvNumSubgroups:         return "NumSubgroups";
396     case EbvSubgroupID:           return "SubgroupID";
397     case EbvSubGroupSize:         return "SubGroupSize";
398     case EbvSubGroupInvocation:   return "SubGroupInvocation";
399     case EbvSubGroupEqMask:       return "SubGroupEqMask";
400     case EbvSubGroupGeMask:       return "SubGroupGeMask";
401     case EbvSubGroupGtMask:       return "SubGroupGtMask";
402     case EbvSubGroupLeMask:       return "SubGroupLeMask";
403     case EbvSubGroupLtMask:       return "SubGroupLtMask";
404     case EbvSubgroupSize2:        return "SubgroupSize";
405     case EbvSubgroupInvocation2:  return "SubgroupInvocationID";
406     case EbvSubgroupEqMask2:      return "SubgroupEqMask";
407     case EbvSubgroupGeMask2:      return "SubgroupGeMask";
408     case EbvSubgroupGtMask2:      return "SubgroupGtMask";
409     case EbvSubgroupLeMask2:      return "SubgroupLeMask";
410     case EbvSubgroupLtMask2:      return "SubgroupLtMask";
411     case EbvVertexId:             return "VertexId";
412     case EbvInstanceId:           return "InstanceId";
413     case EbvVertexIndex:          return "VertexIndex";
414     case EbvInstanceIndex:        return "InstanceIndex";
415     case EbvBaseVertex:           return "BaseVertex";
416     case EbvBaseInstance:         return "BaseInstance";
417     case EbvDrawId:               return "DrawId";
418     case EbvPosition:             return "Position";
419     case EbvPointSize:            return "PointSize";
420     case EbvClipVertex:           return "ClipVertex";
421     case EbvClipDistance:         return "ClipDistance";
422     case EbvCullDistance:         return "CullDistance";
423     case EbvNormal:               return "Normal";
424     case EbvVertex:               return "Vertex";
425     case EbvMultiTexCoord0:       return "MultiTexCoord0";
426     case EbvMultiTexCoord1:       return "MultiTexCoord1";
427     case EbvMultiTexCoord2:       return "MultiTexCoord2";
428     case EbvMultiTexCoord3:       return "MultiTexCoord3";
429     case EbvMultiTexCoord4:       return "MultiTexCoord4";
430     case EbvMultiTexCoord5:       return "MultiTexCoord5";
431     case EbvMultiTexCoord6:       return "MultiTexCoord6";
432     case EbvMultiTexCoord7:       return "MultiTexCoord7";
433     case EbvFrontColor:           return "FrontColor";
434     case EbvBackColor:            return "BackColor";
435     case EbvFrontSecondaryColor:  return "FrontSecondaryColor";
436     case EbvBackSecondaryColor:   return "BackSecondaryColor";
437     case EbvTexCoord:             return "TexCoord";
438     case EbvFogFragCoord:         return "FogFragCoord";
439     case EbvInvocationId:         return "InvocationID";
440     case EbvPrimitiveId:          return "PrimitiveID";
441     case EbvLayer:                return "Layer";
442     case EbvViewportIndex:        return "ViewportIndex";
443     case EbvPatchVertices:        return "PatchVertices";
444     case EbvTessLevelOuter:       return "TessLevelOuter";
445     case EbvTessLevelInner:       return "TessLevelInner";
446     case EbvBoundingBox:          return "BoundingBox";
447     case EbvTessCoord:            return "TessCoord";
448     case EbvColor:                return "Color";
449     case EbvSecondaryColor:       return "SecondaryColor";
450     case EbvFace:                 return "Face";
451     case EbvFragCoord:            return "FragCoord";
452     case EbvPointCoord:           return "PointCoord";
453     case EbvFragColor:            return "FragColor";
454     case EbvFragData:             return "FragData";
455     case EbvFragDepth:            return "FragDepth";
456     case EbvFragStencilRef:       return "FragStencilRef";
457     case EbvSampleId:             return "SampleId";
458     case EbvSamplePosition:       return "SamplePosition";
459     case EbvSampleMask:           return "SampleMaskIn";
460     case EbvHelperInvocation:     return "HelperInvocation";
461
462     case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
463     case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
464     case EbvBaryCoordNoPerspSample:     return "BaryCoordNoPerspSample";
465     case EbvBaryCoordSmooth:            return "BaryCoordSmooth";
466     case EbvBaryCoordSmoothCentroid:    return "BaryCoordSmoothCentroid";
467     case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
468     case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
469
470     case EbvViewIndex:                  return "ViewIndex";
471     case EbvDeviceIndex:                return "DeviceIndex";
472
473     case EbvFragSizeEXT:                return "FragSizeEXT";
474     case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
475
476     case EbvSecondaryFragDataEXT:       return "SecondaryFragDataEXT";
477     case EbvSecondaryFragColorEXT:      return "SecondaryFragColorEXT";
478
479     case EbvViewportMaskNV:             return "ViewportMaskNV";
480     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
481     case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
482     case EbvPositionPerViewNV:          return "PositionPerViewNV";
483     case EbvViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
484     case EbvFragFullyCoveredNV:         return "FragFullyCoveredNV";
485     case EbvFragmentSizeNV:             return "FragmentSizeNV";
486     case EbvInvocationsPerPixelNV:      return "InvocationsPerPixelNV";
487     case EbvLaunchId:                   return "LaunchIdNV";
488     case EbvLaunchSize:                 return "LaunchSizeNV";
489     case EbvInstanceCustomIndex:        return "InstanceCustomIndexNV";
490     case EbvGeometryIndex:              return "GeometryIndexEXT";
491     case EbvWorldRayOrigin:             return "WorldRayOriginNV";
492     case EbvWorldRayDirection:          return "WorldRayDirectionNV";
493     case EbvObjectRayOrigin:            return "ObjectRayOriginNV";
494     case EbvObjectRayDirection:         return "ObjectRayDirectionNV";
495     case EbvRayTmin:                    return "ObjectRayTminNV";
496     case EbvRayTmax:                    return "ObjectRayTmaxNV";
497     case EbvHitT:                       return "HitTNV";
498     case EbvHitKind:                    return "HitKindNV";
499     case EbvIncomingRayFlags:           return "IncomingRayFlagsNV";
500     case EbvObjectToWorld:              return "ObjectToWorldNV";
501     case EbvWorldToObject:              return "WorldToObjectNV";
502     case EbvCurrentRayTimeNV:           return "CurrentRayTimeNV";
503
504     case EbvBaryCoordEXT:
505     case EbvBaryCoordNV:                return "BaryCoordKHR";
506     case EbvBaryCoordNoPerspEXT:
507     case EbvBaryCoordNoPerspNV:         return "BaryCoordNoPerspKHR";
508
509     case EbvTaskCountNV:                return "TaskCountNV";
510     case EbvPrimitiveCountNV:           return "PrimitiveCountNV";
511     case EbvPrimitiveIndicesNV:         return "PrimitiveIndicesNV";
512     case EbvClipDistancePerViewNV:      return "ClipDistancePerViewNV";
513     case EbvCullDistancePerViewNV:      return "CullDistancePerViewNV";
514     case EbvLayerPerViewNV:             return "LayerPerViewNV";
515     case EbvMeshViewCountNV:            return "MeshViewCountNV";
516     case EbvMeshViewIndicesNV:          return "MeshViewIndicesNV";
517     // GL_EXT_mesh_shader
518     case EbvPrimitivePointIndicesEXT:    return "PrimitivePointIndicesEXT";
519     case EbvPrimitiveLineIndicesEXT:     return "PrimitiveLineIndicesEXT";
520     case EbvPrimitiveTriangleIndicesEXT: return "PrimitiveTriangleIndicesEXT";
521     case EbvCullPrimitiveEXT:            return "CullPrimitiveEXT";
522
523     case EbvWarpsPerSM:                 return "WarpsPerSMNV";
524     case EbvSMCount:                    return "SMCountNV";
525     case EbvWarpID:                     return "WarpIDNV";
526     case EbvSMID:                       return "SMIDNV";
527
528     case EbvShadingRateKHR:             return "ShadingRateKHR";
529     case EbvPrimitiveShadingRateKHR:    return "PrimitiveShadingRateKHR";
530
531     default:                      return "unknown built-in variable";
532     }
533 }
534
535 __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
536 {
537     switch (p) {
538     case EpqNone:   return "";        break;
539     case EpqLow:    return "lowp";    break;
540     case EpqMedium: return "mediump"; break;
541     case EpqHigh:   return "highp";   break;
542     default:        return "unknown precision qualifier";
543     }
544 }
545 #endif
546
547 __inline bool isTypeSignedInt(TBasicType type)
548 {
549     switch (type) {
550     case EbtInt8:
551     case EbtInt16:
552     case EbtInt:
553     case EbtInt64:
554         return true;
555     default:
556         return false;
557     }
558 }
559
560 __inline bool isTypeUnsignedInt(TBasicType type)
561 {
562     switch (type) {
563     case EbtUint8:
564     case EbtUint16:
565     case EbtUint:
566     case EbtUint64:
567         return true;
568     default:
569         return false;
570     }
571 }
572
573 __inline bool isTypeInt(TBasicType type)
574 {
575     return isTypeSignedInt(type) || isTypeUnsignedInt(type);
576 }
577
578 __inline bool isTypeFloat(TBasicType type)
579 {
580     switch (type) {
581     case EbtFloat:
582     case EbtDouble:
583     case EbtFloat16:
584         return true;
585     default:
586         return false;
587     }
588 }
589
590 __inline int getTypeRank(TBasicType type)
591 {
592     int res = -1;
593     switch(type) {
594     case EbtInt8:
595     case EbtUint8:
596         res = 0;
597         break;
598     case EbtInt16:
599     case EbtUint16:
600         res = 1;
601         break;
602     case EbtInt:
603     case EbtUint:
604         res = 2;
605         break;
606     case EbtInt64:
607     case EbtUint64:
608         res = 3;
609         break;
610     default:
611         assert(false);
612         break;
613     }
614     return res;
615 }
616
617 } // end namespace glslang
618
619 #endif // _BASICTYPES_INCLUDED_