1 //
2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 #ifndef _BASICTYPES_INCLUDED_
8 #define _BASICTYPES_INCLUDED_
9
10 //
11 // Precision qualifiers
12 //
13 enum TPrecision
14 {
15 // These need to be kept sorted
16 EbpUndefined,
17 EbpLow,
18 EbpMedium,
19 EbpHigh
20 };
21
getPrecisionString(TPrecision p)22 inline const char* getPrecisionString(TPrecision p)
23 {
24 switch(p)
25 {
26 case EbpHigh: return "highp"; break;
27 case EbpMedium: return "mediump"; break;
28 case EbpLow: return "lowp"; break;
29 default: return "mediump"; break; // Safest fallback
30 }
31 }
32
33 //
34 // Basic type. Arrays, vectors, etc., are orthogonal to this.
35 //
36 enum TBasicType
37 {
38 EbtVoid,
39 EbtFloat,
40 EbtInt,
41 EbtBool,
42 EbtGuardSamplerBegin, // non type: see implementation of IsSampler()
43 EbtSampler2D,
44 EbtSamplerCube,
45 EbtSamplerExternalOES, // Only valid if OES_EGL_image_external exists.
46 EbtSampler2DRect, // Only valid if GL_ARB_texture_rectangle exists.
47 EbtGuardSamplerEnd, // non type: see implementation of IsSampler()
48 EbtStruct,
49 EbtAddress, // should be deprecated??
50 EbtInvariant // used as a type when qualifying a previously declared variable as being invariant
51 };
52
getBasicString(TBasicType t)53 inline const char* getBasicString(TBasicType t)
54 {
55 switch (t)
56 {
57 case EbtVoid: return "void"; break;
58 case EbtFloat: return "float"; break;
59 case EbtInt: return "int"; break;
60 case EbtBool: return "bool"; break;
61 case EbtSampler2D: return "sampler2D"; break;
62 case EbtSamplerCube: return "samplerCube"; break;
63 case EbtSamplerExternalOES: return "samplerExternalOES"; break;
64 case EbtSampler2DRect: return "sampler2DRect"; break;
65 case EbtStruct: return "structure"; break;
66 default: return "unknown type";
67 }
68 }
69
IsSampler(TBasicType type)70 inline bool IsSampler(TBasicType type)
71 {
72 return type > EbtGuardSamplerBegin && type < EbtGuardSamplerEnd;
73 }
74
75 //
76 // Qualifiers and built-ins. These are mainly used to see what can be read
77 // or written, and by the machine dependent translator to know which registers
78 // to allocate variables in. Since built-ins tend to go to different registers
79 // than varying or uniform, it makes sense they are peers, not sub-classes.
80 //
81 enum TQualifier
82 {
83 EvqTemporary, // For temporaries (within a function), read/write
84 EvqGlobal, // For globals read/write
85 EvqConst, // User defined constants and non-output parameters in functions
86 EvqAttribute, // Readonly
87 EvqVaryingIn, // readonly, fragment shaders only
88 EvqVaryingOut, // vertex shaders only read/write
89 EvqInvariantVaryingIn, // readonly, fragment shaders only
90 EvqInvariantVaryingOut, // vertex shaders only read/write
91 EvqUniform, // Readonly, vertex and fragment
92
93 // parameters
94 EvqIn,
95 EvqOut,
96 EvqInOut,
97 EvqConstReadOnly,
98
99 // built-ins written by vertex shader
100 EvqPosition,
101 EvqPointSize,
102
103 // built-ins read by fragment shader
104 EvqFragCoord,
105 EvqFrontFacing,
106 EvqPointCoord,
107
108 // built-ins written by fragment shader
109 EvqFragColor,
110 EvqFragData,
111 EvqFragDepth,
112
113 // end of list
114 EvqLast
115 };
116
117 //
118 // This is just for debug print out, carried along with the definitions above.
119 //
getQualifierString(TQualifier q)120 inline const char* getQualifierString(TQualifier q)
121 {
122 switch(q)
123 {
124 case EvqTemporary: return "Temporary"; break;
125 case EvqGlobal: return "Global"; break;
126 case EvqConst: return "const"; break;
127 case EvqConstReadOnly: return "const"; break;
128 case EvqAttribute: return "attribute"; break;
129 case EvqVaryingIn: return "varying"; break;
130 case EvqVaryingOut: return "varying"; break;
131 case EvqInvariantVaryingIn: return "invariant varying"; break;
132 case EvqInvariantVaryingOut:return "invariant varying"; break;
133 case EvqUniform: return "uniform"; break;
134 case EvqIn: return "in"; break;
135 case EvqOut: return "out"; break;
136 case EvqInOut: return "inout"; break;
137 case EvqPosition: return "Position"; break;
138 case EvqPointSize: return "PointSize"; break;
139 case EvqFragCoord: return "FragCoord"; break;
140 case EvqFrontFacing: return "FrontFacing"; break;
141 case EvqFragColor: return "FragColor"; break;
142 case EvqFragData: return "FragData"; break;
143 case EvqFragDepth: return "FragDepth"; break;
144 default: return "unknown qualifier";
145 }
146 }
147
148 #endif // _BASICTYPES_INCLUDED_
149