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