Merge pull request #2892 from greg-lunarg/mb
[platform/upstream/glslang.git] / Test / spv.float32.frag
1 #version 450
2
3 #extension GL_EXT_shader_explicit_arithmetic_types: enable
4 #extension GL_EXT_shader_explicit_arithmetic_types_int8: require
5 #extension GL_EXT_shader_explicit_arithmetic_types_int16: require
6 #extension GL_EXT_shader_explicit_arithmetic_types_int32: require
7 #extension GL_EXT_shader_explicit_arithmetic_types_int64: require
8 #extension GL_EXT_shader_explicit_arithmetic_types_float16: require
9 #extension GL_EXT_shader_explicit_arithmetic_types_float32: require
10 #extension GL_EXT_shader_explicit_arithmetic_types_float64: require
11
12 void main()
13 {
14 }
15
16 // Single float literals
17 void literal()
18 {
19     const float32_t f32c  = 0.000001f;
20     const f32vec2   f32cv = f32vec2(-0.25F, 0.03f);
21
22     f32vec2 f32v;
23     f32v.x  = f32c;
24     f32v   += f32cv;
25 }
26
27 // Block memory layout
28 struct S
29 {
30     float32_t  x;
31     f32vec2    y;
32     f32vec3    z;
33 };
34
35 layout(column_major, std140) uniform B1
36 {
37     float32_t  a;
38     f32vec2    b;
39     f32vec3    c;
40     float32_t  d[2];
41     f32mat2x3  e;
42     f32mat2x3  f[2];
43     S          g;
44     S          h[2];
45 };
46
47 // Specialization constant
48 layout(constant_id = 100) const float16_t sf16 = 0.125hf;
49 layout(constant_id = 101) const float32_t sf   = 0.25;
50 layout(constant_id = 102) const float64_t sd   = 0.5lf;
51
52 const float  f16_to_f = float(sf16);
53 const double f16_to_d = float(sf16);
54
55 const float16_t f_to_f16 = float16_t(sf);
56 const float16_t d_to_f16 = float16_t(sd);
57
58 void operators()
59 {
60     float32_t f32;
61     f32vec2   f32v;
62     f32mat2x2 f32m;
63     bool      b;
64
65     // Arithmetic
66     f32v += f32v;
67     f32v -= f32v;
68     f32v *= f32v;
69     f32v /= f32v;
70     f32v++;
71     f32v--;
72     ++f32m;
73     --f32m;
74     f32v = -f32v;
75     f32m = -f32m;
76
77     f32 = f32v.x + f32v.y;
78     f32 = f32v.x - f32v.y;
79     f32 = f32v.x * f32v.y;
80     f32 = f32v.x / f32v.y;
81
82     // Relational
83     b = (f32v.x != f32);
84     b = (f32v.y == f32);
85     b = (f32v.x >  f32);
86     b = (f32v.y <  f32);
87     b = (f32v.x >= f32);
88     b = (f32v.y <= f32);
89
90     // Vector/matrix operations
91     f32v = f32v * f32;
92     f32m = f32m * f32;
93     f32v = f32m * f32v;
94     f32v = f32v * f32m;
95     f32m = f32m * f32m;
96 }
97
98 void typeCast()
99 {
100     bvec3   bv;
101     f32vec3   f32v;
102     f64vec3   f64v;
103     i8vec3    i8v;
104     u8vec3    u8v;
105     i16vec3   i16v;
106     u16vec3   u16v;
107     i32vec3   i32v;
108     u32vec3   u32v;
109     i64vec3   i64v;
110     u64vec3   u64v;
111     f16vec3   f16v;
112
113     f64v = f32v;            // float32_t -> float64_t
114
115     f32v = f32vec3(bv);     // bool -> float32
116     bv   = bvec3(f32v);     // float32 -> bool
117
118     f32v = f32vec3(f64v);   // double -> float32
119     f64v = f64vec3(f32v);   // float32 -> double
120
121     f32v = f32vec3(f16v);   // float16 -> float32
122     f16v = f16vec3(f32v);   // float32 -> float16
123
124     i8v  = i8vec3(f32v);    //  float32 -> int8
125     i16v = i16vec3(f32v);    // float32 -> int16
126     i32v = i32vec3(f32v);    // float32 -> int32
127     i64v = i64vec3(f32v);    // float32 -> int64
128
129     u8v  = u8vec3(f32v);    //  float32 -> uint8
130     u16v = u16vec3(f32v);    // float32 -> uint16
131     u32v = u32vec3(f32v);    // float32 -> uint32
132     u64v = u64vec3(f32v);    // float32 -> uint64
133 }
134
135 void builtinAngleTrigFuncs()
136 {
137     f32vec4 f32v1, f32v2;
138
139     f32v2 = radians(f32v1);
140     f32v2 = degrees(f32v1);
141     f32v2 = sin(f32v1);
142     f32v2 = cos(f32v1);
143     f32v2 = tan(f32v1);
144     f32v2 = asin(f32v1);
145     f32v2 = acos(f32v1);
146     f32v2 = atan(f32v1, f32v2);
147     f32v2 = atan(f32v1);
148     f32v2 = sinh(f32v1);
149     f32v2 = cosh(f32v1);
150     f32v2 = tanh(f32v1);
151     f32v2 = asinh(f32v1);
152     f32v2 = acosh(f32v1);
153     f32v2 = atanh(f32v1);
154 }
155
156 void builtinExpFuncs()
157 {
158     f32vec2 f32v1, f32v2;
159
160     f32v2 = pow(f32v1, f32v2);
161     f32v2 = exp(f32v1);
162     f32v2 = log(f32v1);
163     f32v2 = exp2(f32v1);
164     f32v2 = log2(f32v1);
165     f32v2 = sqrt(f32v1);
166     f32v2 = inversesqrt(f32v1);
167 }
168
169 void builtinCommonFuncs()
170 {
171     f32vec3   f32v1, f32v2, f32v3;
172     float32_t f32;
173     bool  b;
174     bvec3 bv;
175     ivec3 iv;
176
177     f32v2 = abs(f32v1);
178     f32v2 = sign(f32v1);
179     f32v2 = floor(f32v1);
180     f32v2 = trunc(f32v1);
181     f32v2 = round(f32v1);
182     f32v2 = roundEven(f32v1);
183     f32v2 = ceil(f32v1);
184     f32v2 = fract(f32v1);
185     f32v2 = mod(f32v1, f32v2);
186     f32v2 = mod(f32v1, f32);
187     f32v3 = modf(f32v1, f32v2);
188     f32v3 = min(f32v1, f32v2);
189     f32v3 = min(f32v1, f32);
190     f32v3 = max(f32v1, f32v2);
191     f32v3 = max(f32v1, f32);
192     f32v3 = clamp(f32v1, f32, f32v2.x);
193     f32v3 = clamp(f32v1, f32v2, f32vec3(f32));
194     f32v3 = mix(f32v1, f32v2, f32);
195     f32v3 = mix(f32v1, f32v2, f32v3);
196     f32v3 = mix(f32v1, f32v2, bv);
197     f32v3 = step(f32v1, f32v2);
198     f32v3 = step(f32, f32v3);
199     f32v3 = smoothstep(f32v1, f32v2, f32v3);
200     f32v3 = smoothstep(f32, f32v1.x, f32v2);
201     b     = isnan(f32);
202     bv    = isinf(f32v1);
203     f32v3 = fma(f32v1, f32v2, f32v3);
204     f32v2 = frexp(f32v1, iv);
205     f32v2 = ldexp(f32v1, iv);
206 }
207
208 void builtinGeometryFuncs()
209 {
210     float32_t f32;
211     f32vec3   f32v1, f32v2, f32v3;
212
213     f32   = length(f32v1);
214     f32   = distance(f32v1, f32v2);
215     f32   = dot(f32v1, f32v2);
216     f32v3 = cross(f32v1, f32v2);
217     f32v2 = normalize(f32v1);
218     f32v3 = faceforward(f32v1, f32v2, f32v3);
219     f32v3 = reflect(f32v1, f32v2);
220     f32v3 = refract(f32v1, f32v2, f32);
221 }
222
223 void builtinMatrixFuncs()
224 {
225     f32mat2x3 f32m1, f32m2, f32m3;
226     f32mat3x2 f32m4;
227     f32mat3   f32m5;
228     f32mat4   f32m6, f32m7;
229
230     f32vec3 f32v1;
231     f32vec2 f32v2;
232
233     float32_t f32;
234
235     f32m3 = matrixCompMult(f32m1, f32m2);
236     f32m1 = outerProduct(f32v1, f32v2);
237     f32m4 = transpose(f32m1);
238     f32   = determinant(f32m5);
239     f32m6 = inverse(f32m7);
240 }
241
242 void builtinVecRelFuncs()
243 {
244     f32vec3 f32v1, f32v2;
245     bvec3   bv;
246
247     bv = lessThan(f32v1, f32v2);
248     bv = lessThanEqual(f32v1, f32v2);
249     bv = greaterThan(f32v1, f32v2);
250     bv = greaterThanEqual(f32v1, f32v2);
251     bv = equal(f32v1, f32v2);
252     bv = notEqual(f32v1, f32v2);
253 }
254
255 in f32vec3 if32v;
256
257 void builtinFragProcFuncs()
258 {
259     f32vec3 f32v;
260
261     // Derivative
262     f32v.x  = dFdx(if32v.x);
263     f32v.y  = dFdy(if32v.y);
264     f32v.xy = dFdxFine(if32v.xy);
265     f32v.xy = dFdyFine(if32v.xy);
266     f32v    = dFdxCoarse(if32v);
267     f32v    = dFdxCoarse(if32v);
268
269     f32v.x  = fwidth(if32v.x);
270     f32v.xy = fwidthFine(if32v.xy);
271     f32v    = fwidthCoarse(if32v);
272
273     // Interpolation
274     f32v.x  = interpolateAtCentroid(if32v.x);
275     f32v.xy = interpolateAtSample(if32v.xy, 1);
276     f32v    = interpolateAtOffset(if32v, f32vec2(0.5f));
277 }