Merge pull request #2913 from greg-lunarg/i2905
[platform/upstream/glslang.git] / Test / spv.int64.frag
1 #version 450\r
2 \r
3 #extension GL_ARB_gpu_shader_int64: enable\r
4 #extension GL_EXT_shader_explicit_arithmetic_types_int64: require\r
5 \r
6 layout(binding = 0) uniform Uniforms\r
7 {\r
8     uint index;\r
9 };\r
10 \r
11 layout(std140, binding = 1) uniform Block\r
12 {\r
13     i64vec3  i64v;\r
14     uint64_t u64;\r
15 } block;\r
16 \r
17 void main()\r
18 {\r
19 }\r
20 \r
21 void literal()\r
22 {\r
23     const int64_t i64Const[3] =\r
24     {\r
25         -0x1111111111111111l,   // Hex\r
26         -1l,                    // Dec\r
27         040000000000l,          // Oct\r
28     };\r
29 \r
30     int64_t i64 = i64Const[index];\r
31 \r
32     const uint64_t u64Const[] =\r
33     {\r
34         0xFFFFFFFFFFFFFFFFul,   // Hex\r
35         4294967296UL,           // Dec\r
36         077777777777ul,         // Oct\r
37     };\r
38 \r
39     uint64_t u64 = u64Const[index];\r
40 }\r
41 \r
42 void typeCast()\r
43 {\r
44     bvec2 bv;\r
45     ivec2 iv;\r
46     uvec2 uv;\r
47     vec2  fv;\r
48     dvec2 dv;\r
49 \r
50     i64vec2 i64v;\r
51     u64vec2 u64v;\r
52 \r
53     i64v = i64vec2(bv);   // bool -> int64\r
54     u64v = u64vec2(bv);   // bool -> uint64\r
55 \r
56     i64v = iv;            // int   -> int64\r
57     iv = ivec2(i64v);     // int64 -> int\r
58 \r
59     u64v = uv;            // uint   -> uint64\r
60     uv = uvec2(u64v);     // uint64 -> uint\r
61 \r
62     fv = vec2(i64v);      // int64 -> float\r
63     dv = i64v;            // int64 -> double\r
64 \r
65     fv = vec2(u64v);      // uint64 -> float\r
66     dv = u64v;            // uint64 -> double\r
67 \r
68     i64v = i64vec2(fv);   // float  -> int64\r
69     i64v = i64vec2(dv);   // double -> int64\r
70 \r
71     u64v = u64vec2(fv);   // float  -> uint64\r
72     u64v = u64vec2(dv);   // double -> uint64\r
73 \r
74     bv = bvec2(i64v);     // int64  -> bool\r
75     bv = bvec2(u64v);     // uint64 -> bool\r
76 \r
77     u64v = i64v;          // int64  -> uint64\r
78     i64v = i64vec2(u64v); // uint64 -> int64\r
79 \r
80     uv = uvec2(i64v);     // int64 -> uint\r
81     i64v = i64vec2(uv);   // uint -> int64\r
82     iv = ivec2(u64v);     // uint64 -> int\r
83     u64v = iv;            // int -> uint64\r
84 }\r
85 \r
86 void operators()\r
87 {\r
88     u64vec3 u64v;\r
89     int64_t i64;\r
90     uvec3   uv;\r
91     int     i;\r
92     bool    b;\r
93 \r
94     // Unary\r
95     u64v++;\r
96     i64--;\r
97     ++i64;\r
98     --u64v;\r
99 \r
100     u64v = ~u64v;\r
101 \r
102     i64 = +i64;\r
103     u64v = -u64v;\r
104 \r
105     // Arithmetic\r
106     i64  += i64;\r
107     u64v -= u64v;\r
108     i64  *= i;\r
109     u64v /= uv;\r
110     u64v %= i;\r
111 \r
112     u64v = u64v + uv;\r
113     i64  = i64 - i;\r
114     u64v = u64v * uv;\r
115     i64  = i64 * i;\r
116     i64  = i64 % i;\r
117 \r
118     // Shift\r
119     u64v = u64v << i;\r
120     i64 = i64 >> uv.y;\r
121     u64v <<= i;\r
122     i64  >>= uv.y;\r
123 \r
124     i64  = i64 << u64v.z;\r
125     u64v = u64v << i64;\r
126 \r
127     // Relational\r
128     b = (u64v.x != i64);\r
129     b = (i64 == u64v.x);\r
130     b = (u64v.x > uv.y);\r
131     b = (i64 < i);\r
132     b = (u64v.y >= uv.x);\r
133     b = (i64 <= i);\r
134 \r
135     // Bitwise\r
136     u64v |= i;\r
137     i64  = i64 | i;\r
138     i64  &= i;\r
139     u64v = u64v & uv;\r
140     u64v ^= i64;\r
141     u64v = u64v ^ i64;\r
142 }\r
143 \r
144 void builtinFuncs()\r
145 {\r
146     i64vec2  i64v;\r
147     u64vec3  u64v;\r
148     dvec3    dv;\r
149     bvec3    bv;\r
150 \r
151     int64_t  i64;\r
152     uint64_t u64;\r
153 \r
154     // abs()\r
155     i64v = abs(i64v);\r
156 \r
157     // sign()\r
158     i64  = sign(i64);\r
159 \r
160     // min()\r
161     i64v = min(i64v, i64);\r
162     i64v = min(i64v, i64vec2(-1));\r
163     u64v = min(u64v, u64);\r
164     u64v = min(u64v, u64vec3(0));\r
165 \r
166     // max()\r
167     i64v = max(i64v, i64);\r
168     i64v = max(i64v, i64vec2(-1));\r
169     u64v = max(u64v, u64);\r
170     u64v = max(u64v, u64vec3(0));\r
171 \r
172     // clamp()\r
173     i64v = clamp(i64v, -i64, i64);\r
174     i64v = clamp(i64v, -i64v, i64v);\r
175     u64v = clamp(u64v, -u64, u64);\r
176     u64v = clamp(u64v, -u64v, u64v);\r
177 \r
178     // mix()\r
179     i64  = mix(i64v.x, i64v.y, true);\r
180     i64v = mix(i64vec2(i64), i64vec2(-i64), bvec2(false));\r
181     u64  = mix(u64v.x, u64v.y, true);\r
182     u64v = mix(u64vec3(u64), u64vec3(-u64), bvec3(false));\r
183 \r
184     // doubleBitsToInt64()\r
185     i64v = doubleBitsToInt64(dv.xy);\r
186 \r
187     // doubleBitsToUint64()\r
188     u64v.x = doubleBitsToUint64(dv.z);\r
189 \r
190     // int64BitsToDouble()\r
191     dv.xy = int64BitsToDouble(i64v);\r
192 \r
193     // uint64BitsToDouble()\r
194     dv = uint64BitsToDouble(u64v);\r
195 \r
196     // packInt2x32()\r
197     i64 = packInt2x32(ivec2(1, 2));\r
198 \r
199     // unpackInt2x32()\r
200     ivec2 iv = unpackInt2x32(i64);\r
201 \r
202     // packUint2x32()\r
203     u64 = packUint2x32(uvec2(2, 3));\r
204 \r
205     // unpackUint2x32()\r
206     uvec2 uv = unpackUint2x32(u64);\r
207 \r
208     // lessThan()\r
209     bv    = lessThan(u64v, u64vec3(u64));\r
210     bv.xy = lessThan(i64v, i64vec2(i64));\r
211 \r
212     // lessThanEqual()\r
213     bv    = lessThanEqual(u64v, u64vec3(u64));\r
214     bv.xy = lessThanEqual(i64v, i64vec2(i64));\r
215 \r
216     // greaterThan()\r
217     bv    = greaterThan(u64v, u64vec3(u64));\r
218     bv.xy = greaterThan(i64v, i64vec2(i64));\r
219 \r
220     // greaterThanEqual()\r
221     bv    = greaterThanEqual(u64v, u64vec3(u64));\r
222     bv.xy = greaterThanEqual(i64v, i64vec2(i64));\r
223 \r
224     // equal()\r
225     bv    = equal(u64v, u64vec3(u64));\r
226     bv.xy = equal(i64v, i64vec2(i64));\r
227 \r
228     // notEqual()\r
229     bv    = notEqual(u64v, u64vec3(u64));\r
230     bv.xy = notEqual(i64v, i64vec2(i64));\r
231 \r
232     // findLSB()\r
233     i64   = findLSB(u64);\r
234     i64v  = findLSB(u64vec2(u64));\r
235 \r
236     // bitCount()\r
237     i64   = bitCount(u64);\r
238     i64v  = bitCount(u64vec2(u64));\r
239 }\r
240 \r
241 // Type conversion for specialization constant\r
242 layout(constant_id = 100) const int64_t  si64 = -10L;\r
243 layout(constant_id = 101) const uint64_t su64 = 20UL;\r
244 layout(constant_id = 102) const int  si = -5;\r
245 layout(constant_id = 103) const uint su = 4;\r
246 layout(constant_id = 104) const bool sb = true;\r
247 layout(constant_id = 105) const uint64_t su64inc = su64 + 1UL;\r
248 \r
249 // bool <-> int64/uint64\r
250 const bool i64_to_b = bool(si64);\r
251 const bool u64_to_b = bool(su64);\r
252 const int64_t  b_to_i64 = int64_t(sb);\r
253 const uint64_t b_to_u64 = uint64_t(sb);\r
254 \r
255 // int <-> int64\r
256 const int     i64_to_i = int(si64);\r
257 const int64_t i_to_i64 = int64_t(si);\r
258 \r
259 // uint <-> uint64\r
260 const uint     u64_to_u = uint(su64);\r
261 const uint64_t u_to_u64 = uint64_t(su);\r
262 \r
263 // int64 <-> uint64\r
264 const int64_t  u64_to_i64 = int64_t(su64);\r
265 const uint64_t i64_to_u64 = uint64_t(si64);\r
266 \r
267 // int <-> uint64\r
268 const int      u64_to_i = int(su64);\r
269 const uint64_t i_to_u64 = uint64_t(si);\r
270 \r
271 // uint <-> int64\r
272 const uint    i64_to_u = uint(si64);\r
273 const int64_t u_to_i64 = int64_t(su);\r
274 \r
275 #define UINT64_MAX  18446744073709551615ul\r
276 uint64_t u64Max = UINT64_MAX;\r