vkd3d-shader/hlsl: Use a block in hlsl_normalize_binary_exprs().
[vkd3d.git] / tests / hlsl / function-return.shader_test
blobb70ae706c2d481c3b7db6041450f5e467ce604f7
1 % Test early return from a user-defined function.
3 [pixel shader]
5 float func(out float o)
7     o = 0.1;
8     return 0.2;
9     o = 0.3;
10     return 0.4;
13 void func2(out float o)
15     o = 0.5;
16     return;
17     o = 0.6;
20 float4 main() : sv_target
22     float4 ret;
24     ret.z = 0.7;
25     ret.x = func(ret.y);
26     func2(ret.w);
27     ret.z = 0.8;
28     return ret;
31 [test]
32 draw quad
33 probe (0, 0) rgba (0.2, 0.1, 0.8, 0.5);
35 [pixel shader todo(sm<4)]
36 uniform float f;
38 float func(out float o)
40     o = 0.1;
41     if (f < 0.3)
42     {
43         return 0.2;
44         o = 0.3;
45     }
46     else if (f < 0.7)
47     {
48         o = 0.4;
49         return 0.5;
50     }
51     o = 0.6;
52     return 0.7;
55 float func2(out float o)
57     o = 0.1;
58     if (f < 0.5)
59     {
60         o = 0.2;
61     }
62     else
63     {
64         o = 0.4;
65         return 0.3;
66     }
67     return 0.5;
70 float4 main() : sv_target
72     float4 ret;
74     ret.x = func(ret.y);
75     ret.z = func2(ret.w);
76     ret += 0.1;
77     return ret;
80 [test]
81 uniform 0 float 0.1
82 todo(sm<4) draw quad
83 probe (0, 0) rgba (0.3, 0.2, 0.6, 0.3) 1
84 uniform 0 float 0.4
85 todo(sm<4) draw quad
86 probe (0, 0) rgba (0.6, 0.5, 0.6, 0.3) 1
87 uniform 0 float 0.6
88 todo(sm<4) draw quad
89 probe (0, 0) rgba (0.6, 0.5, 0.4, 0.5) 1
90 uniform 0 float 0.8
91 todo(sm<4) draw quad
92 probe (0, 0) rgba (0.8, 0.7, 0.4, 0.5) 1
94 [pixel shader todo(sm<4)]
95 uniform float f;
97 float func(out float o)
99     o = 0.1;
100     if (f < 0.3)
101     {
102         return 0.2;
103     }
104     o += 0.3;
105     if (f < 0.7)
106     {
107         return 0.5;
108     }
109     o += 0.5;
110     return 1.0;
113 float func2(out float o)
115     o = 0.1;
116     if (f < 0.7)
117     {
118         if (f < 0.3)
119             return 0.2;
120         o += 0.3;
121     }
122     o += 0.5;
123     return 1.0;
126 float4 main() : sv_target
128     float4 ret;
130     ret.x = func(ret.y);
131     ret.z = func2(ret.w);
132     return ret;
135 [test]
136 uniform 0 float 0.1
137 todo(sm<4) draw quad
138 probe (0, 0) rgba (0.2, 0.1, 0.2, 0.1) 1
139 uniform 0 float 0.5
140 todo(sm<4) draw quad
141 probe (0, 0) rgba (0.5, 0.4, 1.0, 0.9) 1
142 uniform 0 float 0.9
143 todo(sm<4) draw quad
144 probe (0, 0) rgba (1.0, 0.9, 1.0, 0.6) 1
146 [pixel shader]
147 float func(out float o)
149     o = 0.1;
150     for (;;)
151     {
152         o *= 2;
153         return 0.3;
154         o *= 3;
155     }
156     o = 0;
157     return 0.4;
160 float func2(out float o)
162     o = 0.1;
163     for (;;)
164     {
165         if (o > 0.5)
166             return 0.2;
167         o *= 2;
168     }
169     o = 0;
170     return 0.3;
173 float4 main() : sv_target
175     float4 ret;
177     ret.x = func(ret.y);
178     ret.z = func2(ret.w);
179     ret += 0.1;
180     return ret;
183 [test]
184 draw quad
185 probe (0, 0) rgba (0.4, 0.3, 0.3, 0.9) 1
187 [pixel shader todo(sm<4)]
188 uniform float f;
190 float func(out float o)
192     int i;
194     o = 0.1;
195     for (i = 0; i < 4; ++i)
196     {
197         if (o > f)
198             return 0.2;
199         o *= 2;
200     }
201     o = 0;
202     return 0.3;
205 float func2(out float o)
207     if (f < 0.5)
208     {
209         o = 0.1;
210         for (;;)
211         {
212             o *= 2;
213             return 0.2;
214         }
215         o *= 3;
216         return 0.3;
217     }
218     else
219     {
220         o = 0.4;
221     }
222     o = 0.5;
223     return 0.6;
226 float4 main() : sv_target
228     float4 ret;
230     ret.x = func(ret.y);
231     ret.z = func2(ret.w);
232     ret += 0.1;
233     return ret;
236 [test]
237 uniform 0 float 0.0
238 todo(sm<4) draw quad
239 probe (0, 0) rgba (0.3, 0.2, 0.3, 0.3) 1
241 uniform 0 float 0.1
242 todo(sm<4) draw quad
243 probe (0, 0) rgba (0.3, 0.3, 0.3, 0.3) 1
245 uniform 0 float 0.3
246 todo(sm<4) draw quad
247 probe (0, 0) rgba (0.3, 0.5, 0.3, 0.3) 1
249 uniform 0 float 0.7
250 todo(sm<4) draw quad
251 probe (0, 0) rgba (0.3, 0.9, 0.7, 0.6) 1
253 uniform 0 float 0.9
254 todo(sm<4) draw quad
255 probe (0, 0) rgba (0.4, 0.1, 0.7, 0.6) 1
257 [pixel shader todo(sm<4)]
259 uniform float4 f[3];
261 float func(out float o)
263     int i, j;
265     o = 0.1;
266     for (i = 0; i < 3; ++i)
267     {
268         for (j = 0; j < 3; ++j)
269         {
270             if (o > f[j].x)
271                 return 0.2;
272         }
273         o *= 2;
274     }
275     o = 0;
276     return 0.3;
279 float4 main() : sv_target
281     float4 ret;
283     ret.x = func(ret.y);
284     ret.zw = 0.5;
285     ret += 0.1;
286     return ret;
289 [test]
291 uniform 0 float4 0.3 0.0 0.0 0.0
292 uniform 4 float4 0.0 0.0 0.0 0.0
293 uniform 8 float4 0.1 0.0 0.0 0.0
294 todo(sm<4) draw quad
295 probe (0, 0) rgba (0.3, 0.2, 0.6, 0.6) 1
297 uniform 4 float4 0.35 0.0 0.0 0.0
298 todo(sm<4) draw quad
299 probe (0, 0) rgba (0.3, 0.3, 0.6, 0.6) 1
301 uniform 8 float4 0.5 0.0 0.0 0.0
302 todo(sm<4) draw quad
303 probe (0, 0) rgba (0.3, 0.5, 0.6, 0.6) 1
305 uniform 0 float4 1.0 0.0 0.0 0.0
306 todo(sm<4) draw quad
307 probe (0, 0) rgba (0.3, 0.5, 0.6, 0.6) 1
309 uniform 4 float4 2.0 0.0 0.0 0.0
310 todo(sm<4) draw quad
311 probe (0, 0) rgba (0.4, 0.1, 0.6, 0.6) 1