1float VertexShaderFunctionS(float inF0, float inF1, float inF2, uint inU0, uint inU1)
2{
3    all(inF0);
4    abs(inF0);
5    acos(inF0);
6    any(inF0);
7    asin(inF0);
8    asint(inF0);
9    asuint(inF0);
10    asfloat(inU0);
11    // asdouble(inU0, inU1);  // TODO: enable when HLSL parser used for intrinsics
12    atan(inF0);
13    atan2(inF0, inF1);
14    ceil(inF0);
15    clamp(inF0, inF1, inF2);
16    cos(inF0);
17    cosh(inF0);
18    countbits(7);
19    degrees(inF0);
20    // EvaluateAttributeAtCentroid(inF0);
21    // EvaluateAttributeAtSample(inF0, 0);
22    // TODO: EvaluateAttributeSnapped(inF0, int2(1,2));
23    exp(inF0);
24    exp2(inF0);
25    firstbithigh(7);
26    firstbitlow(7);
27    floor(inF0);
28    // TODO: fma(inD0, inD1, inD2);
29    fmod(inF0, inF1);
30    frac(inF0);
31    isinf(inF0);
32    isnan(inF0);
33    ldexp(inF0, inF1);
34    lerp(inF0, inF1, inF2);
35    log(inF0);
36    log10(inF0);
37    log2(inF0);
38    max(inF0, inF1);
39    min(inF0, inF1);
40    // TODO: mul(inF0, inF1);
41    pow(inF0, inF1);
42    radians(inF0);
43    reversebits(2);
44    round(inF0);
45    rsqrt(inF0);
46    saturate(inF0);
47    sign(inF0);
48    sin(inF0);
49    sincos(inF0, inF1, inF2);
50    sinh(inF0);
51    smoothstep(inF0, inF1, inF2);
52    sqrt(inF0);
53    step(inF0, inF1);
54    tan(inF0);
55    tanh(inF0);
56    // TODO: sampler intrinsics, when we can declare the types.
57    trunc(inF0);
58
59    return 0.0;
60}
61
62float1 VertexShaderFunction1(float1 inF0, float1 inF1, float1 inF2)
63{
64    // TODO: ... add when float1 prototypes are generated
65    return 0.0;
66}
67
68float2 VertexShaderFunction2(float2 inF0, float2 inF1, float2 inF2, uint2 inU0, uint2 inU1)
69{
70    all(inF0);
71    abs(inF0);
72    acos(inF0);
73    any(inF0);
74    asin(inF0);
75    asint(inF0);
76    asuint(inF0);
77    asfloat(inU0);
78    // asdouble(inU0, inU1);  // TODO: enable when HLSL parser used for intrinsics
79    atan(inF0);
80    atan2(inF0, inF1);
81    ceil(inF0);
82    clamp(inF0, inF1, inF2);
83    cos(inF0);
84    cosh(inF0);
85    countbits(int2(7,3));
86    degrees(inF0);
87    distance(inF0, inF1);
88    dot(inF0, inF1);
89    // EvaluateAttributeAtCentroid(inF0);
90    // EvaluateAttributeAtSample(inF0, 0);
91    // TODO: EvaluateAttributeSnapped(inF0, int2(1,2));
92    exp(inF0);
93    exp2(inF0);
94    faceforward(inF0, inF1, inF2);
95    firstbithigh(7);
96    firstbitlow(7);
97    floor(inF0);
98    // TODO: fma(inD0, inD1, inD2);
99    fmod(inF0, inF1);
100    frac(inF0);
101    isinf(inF0);
102    isnan(inF0);
103    ldexp(inF0, inF1);
104    lerp(inF0, inF1, inF2);
105    length(inF0);
106    log(inF0);
107    log10(inF0);
108    log2(inF0);
109    max(inF0, inF1);
110    min(inF0, inF1);
111    // TODO: mul(inF0, inF1);
112    normalize(inF0);
113    pow(inF0, inF1);
114    radians(inF0);
115    reflect(inF0, inF1);
116    refract(inF0, inF1, 2.0);
117    reversebits(int2(1,2));
118    round(inF0);
119    rsqrt(inF0);
120    saturate(inF0);
121    sign(inF0);
122    sin(inF0);
123    sincos(inF0, inF1, inF2);
124    sinh(inF0);
125    smoothstep(inF0, inF1, inF2);
126    sqrt(inF0);
127    step(inF0, inF1);
128    tan(inF0);
129    tanh(inF0);
130    // TODO: sampler intrinsics, when we can declare the types.
131    trunc(inF0);
132
133    // TODO: ... add when float1 prototypes are generated
134    return float2(1,2);
135}
136
137float3 VertexShaderFunction3(float3 inF0, float3 inF1, float3 inF2, uint3 inU0, uint3 inU1)
138{
139    all(inF0);
140    abs(inF0);
141    acos(inF0);
142    any(inF0);
143    asin(inF0);
144    asint(inF0);
145    asuint(inF0);
146    asfloat(inU0);
147    // asdouble(inU0, inU1);  // TODO: enable when HLSL parser used for intrinsics
148    atan(inF0);
149    atan2(inF0, inF1);
150    ceil(inF0);
151    clamp(inF0, inF1, inF2);
152    cos(inF0);
153    cosh(inF0);
154    countbits(int3(7,3,5));
155    cross(inF0, inF1);
156    degrees(inF0);
157    distance(inF0, inF1);
158    dot(inF0, inF1);
159    // EvaluateAttributeAtCentroid(inF0);
160    // EvaluateAttributeAtSample(inF0, 0);
161    // TODO: EvaluateAttributeSnapped(inF0, int2(1,2));
162    exp(inF0);
163    exp2(inF0);
164    faceforward(inF0, inF1, inF2);
165    firstbithigh(7);
166    firstbitlow(7);
167    floor(inF0);
168    // TODO: fma(inD0, inD1, inD2);
169    fmod(inF0, inF1);
170    frac(inF0);
171    isinf(inF0);
172    isnan(inF0);
173    ldexp(inF0, inF1);
174    lerp(inF0, inF1, inF2);
175    length(inF0);
176    log(inF0);
177    log10(inF0);
178    log2(inF0);
179    max(inF0, inF1);
180    min(inF0, inF1);
181    // TODO: mul(inF0, inF1);
182    normalize(inF0);
183    pow(inF0, inF1);
184    radians(inF0);
185    reflect(inF0, inF1);
186    refract(inF0, inF1, 2.0);
187    reversebits(int3(1,2,3));
188    round(inF0);
189    rsqrt(inF0);
190    saturate(inF0);
191    sign(inF0);
192    sin(inF0);
193    sincos(inF0, inF1, inF2);
194    sinh(inF0);
195    smoothstep(inF0, inF1, inF2);
196    sqrt(inF0);
197    step(inF0, inF1);
198    tan(inF0);
199    tanh(inF0);
200    // TODO: sampler intrinsics, when we can declare the types.
201    trunc(inF0);
202
203    // TODO: ... add when float1 prototypes are generated
204    return float3(1,2,3);
205}
206
207float4 VertexShaderFunction4(float4 inF0, float4 inF1, float4 inF2, uint4 inU0, uint4 inU1)
208{
209    all(inF0);
210    abs(inF0);
211    acos(inF0);
212    any(inF0);
213    asin(inF0);
214    asint(inF0);
215    asuint(inF0);
216    asfloat(inU0);
217    // asdouble(inU0, inU1);  // TODO: enable when HLSL parser used for intrinsics
218    atan(inF0);
219    atan2(inF0, inF1);
220    ceil(inF0);
221    clamp(inF0, inF1, inF2);
222    cos(inF0);
223    cosh(inF0);
224    countbits(int4(7,3,5,2));
225    degrees(inF0);
226    distance(inF0, inF1);
227    dot(inF0, inF1);
228    dst(inF0, inF1);
229    // EvaluateAttributeAtCentroid(inF0);
230    // EvaluateAttributeAtSample(inF0, 0);
231    // TODO: EvaluateAttributeSnapped(inF0, int2(1,2));
232    exp(inF0);
233    exp2(inF0);
234    faceforward(inF0, inF1, inF2);
235    firstbithigh(7);
236    firstbitlow(7);
237    floor(inF0);
238    // TODO: fma(inD0, inD1, inD2);
239    fmod(inF0, inF1);
240    frac(inF0);
241    isinf(inF0);
242    isnan(inF0);
243    ldexp(inF0, inF1);
244    lerp(inF0, inF1, inF2);
245    length(inF0);
246    log(inF0);
247    log10(inF0);
248    log2(inF0);
249    max(inF0, inF1);
250    min(inF0, inF1);
251    // TODO: mul(inF0, inF1);
252    normalize(inF0);
253    pow(inF0, inF1);
254    radians(inF0);
255    reflect(inF0, inF1);
256    refract(inF0, inF1, 2.0);
257    reversebits(int4(1,2,3,4));
258    round(inF0);
259    rsqrt(inF0);
260    saturate(inF0);
261    sign(inF0);
262    sin(inF0);
263    sincos(inF0, inF1, inF2);
264    sinh(inF0);
265    smoothstep(inF0, inF1, inF2);
266    sqrt(inF0);
267    step(inF0, inF1);
268    tan(inF0);
269    tanh(inF0);
270    // TODO: sampler intrinsics, when we can declare the types.
271    trunc(inF0);
272
273    // TODO: ... add when float1 prototypes are generated
274    return float4(1,2,3,4);
275}
276
277// TODO: for mats:
278//    asfloat(inU0); \
279//    asint(inF0); \
280//    asuint(inF0); \
281
282// TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
283#define MATFNS() \
284    all(inF0); \
285    abs(inF0); \
286    acos(inF0); \
287    any(inF0); \
288    asin(inF0); \
289    atan(inF0); \
290    atan2(inF0, inF1); \
291    ceil(inF0); \
292    clamp(inF0, inF1, inF2); \
293    cos(inF0); \
294    cosh(inF0); \
295    degrees(inF0); \
296    determinant(inF0); \
297    exp(inF0); \
298    exp2(inF0); \
299    firstbithigh(7); \
300    firstbitlow(7); \
301    floor(inF0); \
302    fmod(inF0, inF1); \
303    frac(inF0); \
304    ldexp(inF0, inF1); \
305    lerp(inF0, inF1, inF2); \
306    log(inF0); \
307    log10(inF0); \
308    log2(inF0); \
309    max(inF0, inF1); \
310    min(inF0, inF1); \
311    pow(inF0, inF1); \
312    radians(inF0); \
313    round(inF0); \
314    rsqrt(inF0); \
315    saturate(inF0); \
316    sign(inF0); \
317    sin(inF0); \
318    sincos(inF0, inF1, inF2); \
319    sinh(inF0); \
320    smoothstep(inF0, inF1, inF2); \
321    sqrt(inF0); \
322    step(inF0, inF1); \
323    tan(inF0); \
324    tanh(inF0); \
325    transpose(inF0); \
326    trunc(inF0);
327
328// TODO: turn on non-square matrix tests when protos are available.
329
330float2x2 VertexShaderFunction2x2(float2x2 inF0, float2x2 inF1, float2x2 inF2)
331{
332    // TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
333    MATFNS();
334
335    // TODO: ... add when float1 prototypes are generated
336    return float2x2(2,2,2,2);
337}
338
339float3x3 VertexShaderFunction3x3(float3x3 inF0, float3x3 inF1, float3x3 inF2)
340{
341    // TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
342    MATFNS();
343
344    // TODO: ... add when float1 prototypes are generated
345    return float3x3(3,3,3,3,3,3,3,3,3);
346}
347
348float4x4 VertexShaderFunction4x4(float4x4 inF0, float4x4 inF1, float4x4 inF2)
349{
350    // TODO: FXC doesn't accept this with (), but glslang doesn't accept it without.
351    MATFNS();
352
353    // TODO: ... add when float1 prototypes are generated
354    return float4x4(4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4);
355}
356
357#define TESTGENMUL(ST, VT, MT) \
358    ST r0 = mul(inF0,  inF1);  \
359    VT r1 = mul(inFV0, inF0);  \
360    VT r2 = mul(inF0,  inFV0); \
361    ST r3 = mul(inFV0, inFV1); \
362    VT r4 = mul(inFM0, inFV0); \
363    VT r5 = mul(inFV0, inFM0); \
364    MT r6 = mul(inFM0, inF0);  \
365    MT r7 = mul(inF0, inFM0);  \
366    MT r8 = mul(inFM0, inFM1);
367
368
369void TestGenMul2(float inF0, float inF1,
370                 float2 inFV0, float2 inFV1,
371                 float2x2 inFM0, float2x2 inFM1)
372{
373    TESTGENMUL(float, float2, float2x2);
374}
375
376void TestGenMul3(float inF0, float inF1,
377                 float3 inFV0, float3 inFV1,
378                 float3x3 inFM0, float3x3 inFM1)
379{
380    TESTGENMUL(float, float3, float3x3);
381}
382
383void TestGenMul4(float inF0, float inF1,
384                 float4 inFV0, float4 inFV1,
385                 float4x4 inFM0, float4x4 inFM1)
386{
387    TESTGENMUL(float, float4, float4x4);
388}
389
390// Test some non-square mats
391void TestGenMulNxM(float inF0, float inF1,
392                   float2 inFV2, float3 inFV3,
393                   float2x3 inFM2x3, float3x2 inFM3x2,
394                   float3x3 inFM3x3, float3x4 inFM3x4,
395                   float2x4 inFM2x4)
396{
397    float  r00 = mul(inF0,  inF1);  // S=S*S
398    float2 r01 = mul(inFV2, inF0);  // V=V*S
399    float3 r02 = mul(inFV3, inF0);  // V=V*S
400    float2 r03 = mul(inF0,  inFV2); // V=S*V
401    float3 r04 = mul(inF0,  inFV3); // V=S*V
402    float  r05 = mul(inFV2, inFV2); // S=V*V
403    float  r06 = mul(inFV3, inFV3); // S=V*V
404    float3 r07 = mul(inFV2, inFM2x3); // V=V*M (return V dim is Mcols)
405    float2 r08 = mul(inFV3, inFM3x2); // V=V*M (return V dim is Mcols)
406    float2 r09 = mul(inFM2x3, inFV3); // V=M*V (return V dim is Mrows)
407    float3 r10 = mul(inFM3x2, inFV2); // V=M*V (return V dim is Mrows)
408    float2x3 r11 = mul(inFM2x3, inF0);
409    float3x2 r12 = mul(inFM3x2, inF0);
410    float2x2 r13 = mul(inFM2x3, inFM3x2);
411    float2x3 r14 = mul(inFM2x3, inFM3x3);
412    float2x4 r15 = mul(inFM2x3, inFM3x4);
413    float3x4 r16 = mul(inFM3x2, inFM2x4);
414}
415