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