xref: /aosp_15_r20/external/angle/third_party/glslang/src/glslang/Include/BaseTypes.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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     EbtCoopmat,
70     EbtFunction,
71     EbtTensorLayoutNV,
72     EbtTensorViewNV,
73     // SPIR-V type defined by spirv_type
74     EbtSpirvType,
75 
76     // HLSL types that live only temporarily.
77     EbtString,
78 
79     EbtNumTypes
80 };
81 
82 //
83 // Storage qualifiers.  Should align with different kinds of storage or
84 // resource or GLSL storage qualifier.  Expansion is deprecated.
85 //
86 // N.B.: You probably DON'T want to add anything here, but rather just add it
87 // to the built-in variables.  See the comment above TBuiltInVariable.
88 //
89 // A new built-in variable will normally be an existing qualifier, like 'in', 'out', etc.
90 // DO NOT follow the design pattern of, say EvqInstanceId, etc.
91 //
92 enum TStorageQualifier {
93     EvqTemporary,     // For temporaries (within a function), read/write
94     EvqGlobal,        // For globals read/write
95     EvqConst,         // User-defined constant values, will be semantically constant and constant folded
96     EvqVaryingIn,     // pipeline input, read only, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
97     EvqVaryingOut,    // pipeline output, read/write, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
98     EvqUniform,       // read only, shared with app
99     EvqBuffer,        // read/write, shared with app
100     EvqShared,        // compute shader's read/write 'shared' qualifier
101     EvqSpirvStorageClass, // spirv_storage_class
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     EvqTileImageEXT,
138 
139     // end of list
140     EvqLast
141 };
142 
143 //
144 // Subcategories of the TStorageQualifier, simply to give a direct mapping
145 // between built-in variable names and an numerical value (the enum).
146 //
147 // For backward compatibility, there is some redundancy between the
148 // TStorageQualifier and these.  Existing members should both be maintained accurately.
149 // However, any new built-in variable (and any existing non-redundant one)
150 // must follow the pattern that the specific built-in is here, and only its
151 // general qualifier is in TStorageQualifier.
152 //
153 // Something like gl_Position, which is sometimes 'in' and sometimes 'out'
154 // shows up as two different built-in variables in a single stage, but
155 // only has a single enum in TBuiltInVariable, so both the
156 // TStorageQualifier and the TBuitinVariable are needed to distinguish
157 // between them.
158 //
159 enum TBuiltInVariable {
160     EbvNone,
161     EbvNumWorkGroups,
162     EbvWorkGroupSize,
163     EbvWorkGroupId,
164     EbvLocalInvocationId,
165     EbvGlobalInvocationId,
166     EbvLocalInvocationIndex,
167     EbvNumSubgroups,
168     EbvSubgroupID,
169     EbvSubGroupSize,
170     EbvSubGroupInvocation,
171     EbvSubGroupEqMask,
172     EbvSubGroupGeMask,
173     EbvSubGroupGtMask,
174     EbvSubGroupLeMask,
175     EbvSubGroupLtMask,
176     EbvSubgroupSize2,
177     EbvSubgroupInvocation2,
178     EbvSubgroupEqMask2,
179     EbvSubgroupGeMask2,
180     EbvSubgroupGtMask2,
181     EbvSubgroupLeMask2,
182     EbvSubgroupLtMask2,
183     EbvVertexId,
184     EbvInstanceId,
185     EbvVertexIndex,
186     EbvInstanceIndex,
187     EbvBaseVertex,
188     EbvBaseInstance,
189     EbvDrawId,
190     EbvPosition,
191     EbvPointSize,
192     EbvClipVertex,
193     EbvClipDistance,
194     EbvCullDistance,
195     EbvNormal,
196     EbvVertex,
197     EbvMultiTexCoord0,
198     EbvMultiTexCoord1,
199     EbvMultiTexCoord2,
200     EbvMultiTexCoord3,
201     EbvMultiTexCoord4,
202     EbvMultiTexCoord5,
203     EbvMultiTexCoord6,
204     EbvMultiTexCoord7,
205     EbvFrontColor,
206     EbvBackColor,
207     EbvFrontSecondaryColor,
208     EbvBackSecondaryColor,
209     EbvTexCoord,
210     EbvFogFragCoord,
211     EbvInvocationId,
212     EbvPrimitiveId,
213     EbvLayer,
214     EbvViewportIndex,
215     EbvPatchVertices,
216     EbvTessLevelOuter,
217     EbvTessLevelInner,
218     EbvBoundingBox,
219     EbvTessCoord,
220     EbvColor,
221     EbvSecondaryColor,
222     EbvFace,
223     EbvFragCoord,
224     EbvPointCoord,
225     EbvFragColor,
226     EbvFragData,
227     EbvFragDepth,
228     EbvFragStencilRef,
229     EbvSampleId,
230     EbvSamplePosition,
231     EbvSampleMask,
232     EbvHelperInvocation,
233 
234     EbvBaryCoordNoPersp,
235     EbvBaryCoordNoPerspCentroid,
236     EbvBaryCoordNoPerspSample,
237     EbvBaryCoordSmooth,
238     EbvBaryCoordSmoothCentroid,
239     EbvBaryCoordSmoothSample,
240     EbvBaryCoordPullModel,
241 
242     EbvViewIndex,
243     EbvDeviceIndex,
244 
245     EbvShadingRateKHR,
246     EbvPrimitiveShadingRateKHR,
247 
248     EbvFragSizeEXT,
249     EbvFragInvocationCountEXT,
250 
251     EbvSecondaryFragDataEXT,
252     EbvSecondaryFragColorEXT,
253 
254     EbvViewportMaskNV,
255     EbvSecondaryPositionNV,
256     EbvSecondaryViewportMaskNV,
257     EbvPositionPerViewNV,
258     EbvViewportMaskPerViewNV,
259     EbvFragFullyCoveredNV,
260     EbvFragmentSizeNV,
261     EbvInvocationsPerPixelNV,
262     // ray tracing
263     EbvLaunchId,
264     EbvLaunchSize,
265     EbvInstanceCustomIndex,
266     EbvGeometryIndex,
267     EbvWorldRayOrigin,
268     EbvWorldRayDirection,
269     EbvObjectRayOrigin,
270     EbvObjectRayDirection,
271     EbvRayTmin,
272     EbvRayTmax,
273     EbvCullMask,
274     EbvHitKind,
275     EbvObjectToWorld,
276     EbvObjectToWorld3x4,
277     EbvWorldToObject,
278     EbvWorldToObject3x4,
279     EbvIncomingRayFlags,
280     EbvCurrentRayTimeNV,
281     // barycentrics
282     EbvBaryCoordNV,
283     EbvBaryCoordNoPerspNV,
284     EbvBaryCoordEXT,
285     EbvBaryCoordNoPerspEXT,
286     // mesh shaders
287     EbvTaskCountNV,
288     EbvPrimitiveCountNV,
289     EbvPrimitiveIndicesNV,
290     EbvClipDistancePerViewNV,
291     EbvCullDistancePerViewNV,
292     EbvLayerPerViewNV,
293     EbvMeshViewCountNV,
294     EbvMeshViewIndicesNV,
295 
296     EbvMicroTrianglePositionNV,
297     EbvMicroTriangleBaryNV,
298     EbvHitKindFrontFacingMicroTriangleNV,
299     EbvHitKindBackFacingMicroTriangleNV,
300 
301     //GL_EXT_mesh_shader
302     EbvPrimitivePointIndicesEXT,
303     EbvPrimitiveLineIndicesEXT,
304     EbvPrimitiveTriangleIndicesEXT,
305     EbvCullPrimitiveEXT,
306 
307     // sm builtins
308     EbvWarpsPerSM,
309     EbvSMCount,
310     EbvWarpID,
311     EbvSMID,
312 
313     // HLSL built-ins that live only temporarily, until they get remapped
314     // to one of the above.
315     EbvFragDepthGreater,
316     EbvFragDepthLesser,
317     EbvGsOutputStream,
318     EbvOutputPatch,
319     EbvInputPatch,
320 
321     // structbuffer types
322     EbvAppendConsume, // no need to differentiate append and consume
323     EbvRWStructuredBuffer,
324     EbvStructuredBuffer,
325     EbvByteAddressBuffer,
326     EbvRWByteAddressBuffer,
327 
328     // ARM specific core builtins
329     EbvCoreCountARM,
330     EbvCoreIDARM,
331     EbvCoreMaxIDARM,
332     EbvWarpIDARM,
333     EbvWarpMaxIDARM,
334 
335     EbvPositionFetch,
336 
337     EbvLast
338 };
339 
340 // In this enum, order matters; users can assume higher precision is a bigger value
341 // and EpqNone is 0.
342 enum TPrecisionQualifier {
343     EpqNone = 0,
344     EpqLow,
345     EpqMedium,
346     EpqHigh
347 };
348 
349 // These will show up in error messages
GetStorageQualifierString(TStorageQualifier q)350 __inline const char* GetStorageQualifierString(TStorageQualifier q)
351 {
352     switch (q) {
353     case EvqTemporary:      return "temp";           break;
354     case EvqGlobal:         return "global";         break;
355     case EvqConst:          return "const";          break;
356     case EvqConstReadOnly:  return "const (read only)"; break;
357     case EvqSpirvStorageClass: return "spirv_storage_class"; break;
358     case EvqVaryingIn:      return "in";             break;
359     case EvqVaryingOut:     return "out";            break;
360     case EvqUniform:        return "uniform";        break;
361     case EvqBuffer:         return "buffer";         break;
362     case EvqShared:         return "shared";         break;
363     case EvqIn:             return "in";             break;
364     case EvqOut:            return "out";            break;
365     case EvqInOut:          return "inout";          break;
366     case EvqVertexId:       return "gl_VertexId";    break;
367     case EvqInstanceId:     return "gl_InstanceId";  break;
368     case EvqPosition:       return "gl_Position";    break;
369     case EvqPointSize:      return "gl_PointSize";   break;
370     case EvqClipVertex:     return "gl_ClipVertex";  break;
371     case EvqFace:           return "gl_FrontFacing"; break;
372     case EvqFragCoord:      return "gl_FragCoord";   break;
373     case EvqPointCoord:     return "gl_PointCoord";  break;
374     case EvqFragColor:      return "fragColor";      break;
375     case EvqFragDepth:      return "gl_FragDepth";   break;
376     case EvqFragStencil:    return "gl_FragStencilRefARB"; break;
377     case EvqPayload:        return "rayPayloadNV";     break;
378     case EvqPayloadIn:      return "rayPayloadInNV";   break;
379     case EvqHitAttr:        return "hitAttributeNV";   break;
380     case EvqCallableData:   return "callableDataNV";   break;
381     case EvqCallableDataIn: return "callableDataInNV"; break;
382     case EvqtaskPayloadSharedEXT: return "taskPayloadSharedEXT"; break;
383     case EvqHitObjectAttrNV:return "hitObjectAttributeNV"; break;
384     default:                return "unknown qualifier";
385     }
386 }
387 
GetBuiltInVariableString(TBuiltInVariable v)388 __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
389 {
390     switch (v) {
391     case EbvNone:                 return "";
392     case EbvNumWorkGroups:        return "NumWorkGroups";
393     case EbvWorkGroupSize:        return "WorkGroupSize";
394     case EbvWorkGroupId:          return "WorkGroupID";
395     case EbvLocalInvocationId:    return "LocalInvocationID";
396     case EbvGlobalInvocationId:   return "GlobalInvocationID";
397     case EbvLocalInvocationIndex: return "LocalInvocationIndex";
398     case EbvNumSubgroups:         return "NumSubgroups";
399     case EbvSubgroupID:           return "SubgroupID";
400     case EbvSubGroupSize:         return "SubGroupSize";
401     case EbvSubGroupInvocation:   return "SubGroupInvocation";
402     case EbvSubGroupEqMask:       return "SubGroupEqMask";
403     case EbvSubGroupGeMask:       return "SubGroupGeMask";
404     case EbvSubGroupGtMask:       return "SubGroupGtMask";
405     case EbvSubGroupLeMask:       return "SubGroupLeMask";
406     case EbvSubGroupLtMask:       return "SubGroupLtMask";
407     case EbvSubgroupSize2:        return "SubgroupSize";
408     case EbvSubgroupInvocation2:  return "SubgroupInvocationID";
409     case EbvSubgroupEqMask2:      return "SubgroupEqMask";
410     case EbvSubgroupGeMask2:      return "SubgroupGeMask";
411     case EbvSubgroupGtMask2:      return "SubgroupGtMask";
412     case EbvSubgroupLeMask2:      return "SubgroupLeMask";
413     case EbvSubgroupLtMask2:      return "SubgroupLtMask";
414     case EbvVertexId:             return "VertexId";
415     case EbvInstanceId:           return "InstanceId";
416     case EbvVertexIndex:          return "VertexIndex";
417     case EbvInstanceIndex:        return "InstanceIndex";
418     case EbvBaseVertex:           return "BaseVertex";
419     case EbvBaseInstance:         return "BaseInstance";
420     case EbvDrawId:               return "DrawId";
421     case EbvPosition:             return "Position";
422     case EbvPointSize:            return "PointSize";
423     case EbvClipVertex:           return "ClipVertex";
424     case EbvClipDistance:         return "ClipDistance";
425     case EbvCullDistance:         return "CullDistance";
426     case EbvNormal:               return "Normal";
427     case EbvVertex:               return "Vertex";
428     case EbvMultiTexCoord0:       return "MultiTexCoord0";
429     case EbvMultiTexCoord1:       return "MultiTexCoord1";
430     case EbvMultiTexCoord2:       return "MultiTexCoord2";
431     case EbvMultiTexCoord3:       return "MultiTexCoord3";
432     case EbvMultiTexCoord4:       return "MultiTexCoord4";
433     case EbvMultiTexCoord5:       return "MultiTexCoord5";
434     case EbvMultiTexCoord6:       return "MultiTexCoord6";
435     case EbvMultiTexCoord7:       return "MultiTexCoord7";
436     case EbvFrontColor:           return "FrontColor";
437     case EbvBackColor:            return "BackColor";
438     case EbvFrontSecondaryColor:  return "FrontSecondaryColor";
439     case EbvBackSecondaryColor:   return "BackSecondaryColor";
440     case EbvTexCoord:             return "TexCoord";
441     case EbvFogFragCoord:         return "FogFragCoord";
442     case EbvInvocationId:         return "InvocationID";
443     case EbvPrimitiveId:          return "PrimitiveID";
444     case EbvLayer:                return "Layer";
445     case EbvViewportIndex:        return "ViewportIndex";
446     case EbvPatchVertices:        return "PatchVertices";
447     case EbvTessLevelOuter:       return "TessLevelOuter";
448     case EbvTessLevelInner:       return "TessLevelInner";
449     case EbvBoundingBox:          return "BoundingBox";
450     case EbvTessCoord:            return "TessCoord";
451     case EbvColor:                return "Color";
452     case EbvSecondaryColor:       return "SecondaryColor";
453     case EbvFace:                 return "Face";
454     case EbvFragCoord:            return "FragCoord";
455     case EbvPointCoord:           return "PointCoord";
456     case EbvFragColor:            return "FragColor";
457     case EbvFragData:             return "FragData";
458     case EbvFragDepth:            return "FragDepth";
459     case EbvFragStencilRef:       return "FragStencilRef";
460     case EbvSampleId:             return "SampleId";
461     case EbvSamplePosition:       return "SamplePosition";
462     case EbvSampleMask:           return "SampleMaskIn";
463     case EbvHelperInvocation:     return "HelperInvocation";
464 
465     case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
466     case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
467     case EbvBaryCoordNoPerspSample:     return "BaryCoordNoPerspSample";
468     case EbvBaryCoordSmooth:            return "BaryCoordSmooth";
469     case EbvBaryCoordSmoothCentroid:    return "BaryCoordSmoothCentroid";
470     case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
471     case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
472 
473     case EbvViewIndex:                  return "ViewIndex";
474     case EbvDeviceIndex:                return "DeviceIndex";
475 
476     case EbvFragSizeEXT:                return "FragSizeEXT";
477     case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
478 
479     case EbvSecondaryFragDataEXT:       return "SecondaryFragDataEXT";
480     case EbvSecondaryFragColorEXT:      return "SecondaryFragColorEXT";
481 
482     case EbvViewportMaskNV:             return "ViewportMaskNV";
483     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
484     case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
485     case EbvPositionPerViewNV:          return "PositionPerViewNV";
486     case EbvViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
487     case EbvFragFullyCoveredNV:         return "FragFullyCoveredNV";
488     case EbvFragmentSizeNV:             return "FragmentSizeNV";
489     case EbvInvocationsPerPixelNV:      return "InvocationsPerPixelNV";
490     case EbvLaunchId:                   return "LaunchIdNV";
491     case EbvLaunchSize:                 return "LaunchSizeNV";
492     case EbvInstanceCustomIndex:        return "InstanceCustomIndexNV";
493     case EbvGeometryIndex:              return "GeometryIndexEXT";
494     case EbvWorldRayOrigin:             return "WorldRayOriginNV";
495     case EbvWorldRayDirection:          return "WorldRayDirectionNV";
496     case EbvObjectRayOrigin:            return "ObjectRayOriginNV";
497     case EbvObjectRayDirection:         return "ObjectRayDirectionNV";
498     case EbvRayTmin:                    return "ObjectRayTminNV";
499     case EbvRayTmax:                    return "ObjectRayTmaxNV";
500     case EbvHitKind:                    return "HitKindNV";
501     case EbvIncomingRayFlags:           return "IncomingRayFlagsNV";
502     case EbvObjectToWorld:              return "ObjectToWorldNV";
503     case EbvWorldToObject:              return "WorldToObjectNV";
504     case EbvCurrentRayTimeNV:           return "CurrentRayTimeNV";
505 
506     case EbvBaryCoordEXT:
507     case EbvBaryCoordNV:                return "BaryCoordKHR";
508     case EbvBaryCoordNoPerspEXT:
509     case EbvBaryCoordNoPerspNV:         return "BaryCoordNoPerspKHR";
510 
511     case EbvTaskCountNV:                return "TaskCountNV";
512     case EbvPrimitiveCountNV:           return "PrimitiveCountNV";
513     case EbvPrimitiveIndicesNV:         return "PrimitiveIndicesNV";
514     case EbvClipDistancePerViewNV:      return "ClipDistancePerViewNV";
515     case EbvCullDistancePerViewNV:      return "CullDistancePerViewNV";
516     case EbvLayerPerViewNV:             return "LayerPerViewNV";
517     case EbvMeshViewCountNV:            return "MeshViewCountNV";
518     case EbvMeshViewIndicesNV:          return "MeshViewIndicesNV";
519     // GL_EXT_mesh_shader
520     case EbvPrimitivePointIndicesEXT:    return "PrimitivePointIndicesEXT";
521     case EbvPrimitiveLineIndicesEXT:     return "PrimitiveLineIndicesEXT";
522     case EbvPrimitiveTriangleIndicesEXT: return "PrimitiveTriangleIndicesEXT";
523     case EbvCullPrimitiveEXT:            return "CullPrimitiveEXT";
524 
525     case EbvWarpsPerSM:                 return "WarpsPerSMNV";
526     case EbvSMCount:                    return "SMCountNV";
527     case EbvWarpID:                     return "WarpIDNV";
528     case EbvSMID:                       return "SMIDNV";
529 
530     case EbvShadingRateKHR:             return "ShadingRateKHR";
531     case EbvPrimitiveShadingRateKHR:    return "PrimitiveShadingRateKHR";
532 
533     case EbvHitKindFrontFacingMicroTriangleNV: return "HitKindFrontFacingMicroTriangleNV";
534     case EbvHitKindBackFacingMicroTriangleNV:  return "HitKindBackFacingMicroTriangleNV";
535 
536     default:                      return "unknown built-in variable";
537     }
538 }
539 
GetPrecisionQualifierString(TPrecisionQualifier p)540 __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
541 {
542     switch (p) {
543     case EpqNone:   return "";        break;
544     case EpqLow:    return "lowp";    break;
545     case EpqMedium: return "mediump"; break;
546     case EpqHigh:   return "highp";   break;
547     default:        return "unknown precision qualifier";
548     }
549 }
550 
isTypeSignedInt(TBasicType type)551 __inline bool isTypeSignedInt(TBasicType type)
552 {
553     switch (type) {
554     case EbtInt8:
555     case EbtInt16:
556     case EbtInt:
557     case EbtInt64:
558         return true;
559     default:
560         return false;
561     }
562 }
563 
isTypeUnsignedInt(TBasicType type)564 __inline bool isTypeUnsignedInt(TBasicType type)
565 {
566     switch (type) {
567     case EbtUint8:
568     case EbtUint16:
569     case EbtUint:
570     case EbtUint64:
571         return true;
572     default:
573         return false;
574     }
575 }
576 
isTypeInt(TBasicType type)577 __inline bool isTypeInt(TBasicType type)
578 {
579     return isTypeSignedInt(type) || isTypeUnsignedInt(type);
580 }
581 
isTypeFloat(TBasicType type)582 __inline bool isTypeFloat(TBasicType type)
583 {
584     switch (type) {
585     case EbtFloat:
586     case EbtDouble:
587     case EbtFloat16:
588         return true;
589     default:
590         return false;
591     }
592 }
593 
GetNumBits(TBasicType type)594 __inline uint32_t GetNumBits(TBasicType type)
595 {
596     switch (type) {
597     case EbtInt8:
598     case EbtUint8:
599         return 8;
600     case EbtFloat16:
601     case EbtInt16:
602     case EbtUint16:
603         return 16;
604     case EbtInt:
605     case EbtUint:
606     case EbtFloat:
607         return 32;
608     case EbtDouble:
609     case EbtInt64:
610     case EbtUint64:
611         return 64;
612     default:
613         assert(false);
614         return 0;
615     }
616 }
617 
getTypeRank(TBasicType type)618 __inline int getTypeRank(TBasicType type)
619 {
620     int res = -1;
621     switch(type) {
622     case EbtInt8:
623     case EbtUint8:
624         res = 0;
625         break;
626     case EbtInt16:
627     case EbtUint16:
628         res = 1;
629         break;
630     case EbtInt:
631     case EbtUint:
632         res = 2;
633         break;
634     case EbtInt64:
635     case EbtUint64:
636         res = 3;
637         break;
638     default:
639         assert(false);
640         break;
641     }
642     return res;
643 }
644 
645 } // end namespace glslang
646 
647 #endif // _BASICTYPES_INCLUDED_
648