1617a3babSopenharmony_ci
2617a3babSopenharmony_cistruct PS_OUTPUT
3617a3babSopenharmony_ci{
4617a3babSopenharmony_ci    float4 Color : SV_Target0;
5617a3babSopenharmony_ci};
6617a3babSopenharmony_ci
7617a3babSopenharmony_ciuniform int3    i3;
8617a3babSopenharmony_ciuniform bool3   b3;
9617a3babSopenharmony_ciuniform float3  f3;
10617a3babSopenharmony_ciuniform uint3   u3;
11617a3babSopenharmony_ciuniform double3 d3;
12617a3babSopenharmony_ci
13617a3babSopenharmony_ciuniform int    is;
14617a3babSopenharmony_ciuniform bool   bs;
15617a3babSopenharmony_ciuniform float  fs;
16617a3babSopenharmony_ciuniform uint   us;
17617a3babSopenharmony_ciuniform double ds;
18617a3babSopenharmony_ci
19617a3babSopenharmony_civoid Fn_F3(float3 x) { }
20617a3babSopenharmony_civoid Fn_I3(int3 x) { }
21617a3babSopenharmony_civoid Fn_U3(uint3 x) { }
22617a3babSopenharmony_civoid Fn_B3(bool3 x) { }
23617a3babSopenharmony_civoid Fn_D3(double3 x) { }
24617a3babSopenharmony_ci
25617a3babSopenharmony_ci// ----------- Test implicit conversions on function returns -----------
26617a3babSopenharmony_cifloat3  Fn_R_F3I(out float3 p) { p = i3; return i3; }
27617a3babSopenharmony_cifloat3  Fn_R_F3U(out float3 p) { p = u3; return u3; }
28617a3babSopenharmony_cifloat3  Fn_R_F3B(out float3 p) { p = b3; return b3; }
29617a3babSopenharmony_cifloat3  Fn_R_F3D(out float3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
30617a3babSopenharmony_ci
31617a3babSopenharmony_ciint3    Fn_R_I3U(out int3 p) { p = u3; return u3; }
32617a3babSopenharmony_ciint3    Fn_R_I3B(out int3 p) { p = b3; return b3; }
33617a3babSopenharmony_ciint3    Fn_R_I3F(out int3 p) { p = f3; return f3; }
34617a3babSopenharmony_ciint3    Fn_R_I3D(out int3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
35617a3babSopenharmony_ci
36617a3babSopenharmony_ciuint3   Fn_R_U3I(out uint3 p) { p = i3; return i3; }
37617a3babSopenharmony_ciuint3   Fn_R_U3F(out uint3 p) { p = f3; return f3; }
38617a3babSopenharmony_ciuint3   Fn_R_U3B(out uint3 p) { p = b3; return b3; }
39617a3babSopenharmony_ciuint3   Fn_R_U3D(out uint3 p) { p = d3; return d3; }  // valid, but loss of precision on downconversion.
40617a3babSopenharmony_ci
41617a3babSopenharmony_cibool3   Fn_R_B3I(out bool3 p) { p = i3; return i3; }
42617a3babSopenharmony_cibool3   Fn_R_B3U(out bool3 p) { p = u3; return u3; }
43617a3babSopenharmony_cibool3   Fn_R_B3F(out bool3 p) { p = f3; return f3; }
44617a3babSopenharmony_cibool3   Fn_R_B3D(out bool3 p) { p = d3; return d3; }
45617a3babSopenharmony_ci
46617a3babSopenharmony_cidouble3 Fn_R_D3I(out double3 p) { p = i3; return i3; }
47617a3babSopenharmony_cidouble3 Fn_R_D3U(out double3 p) { p = u3; return u3; }
48617a3babSopenharmony_cidouble3 Fn_R_D3B(out double3 p) { p = b3; return b3; }
49617a3babSopenharmony_cidouble3 Fn_R_D3F(out double3 p) { p = f3; return f3; }
50617a3babSopenharmony_ci
51617a3babSopenharmony_ciPS_OUTPUT main()
52617a3babSopenharmony_ci{
53617a3babSopenharmony_ci    // ----------- assignment conversions -----------
54617a3babSopenharmony_ci    float3 r00 = i3;
55617a3babSopenharmony_ci    float3 r01 = b3;
56617a3babSopenharmony_ci    float3 r02 = u3;
57617a3babSopenharmony_ci    float3 r03 = d3;  // valid, but loss of precision on downconversion.
58617a3babSopenharmony_ci
59617a3babSopenharmony_ci    int3   r10 = b3;
60617a3babSopenharmony_ci    int3   r11 = u3;
61617a3babSopenharmony_ci    int3   r12 = f3;
62617a3babSopenharmony_ci    int3   r13 = d3;  // valid, but loss of precision on downconversion.
63617a3babSopenharmony_ci
64617a3babSopenharmony_ci    uint3  r20 = b3;
65617a3babSopenharmony_ci    uint3  r21 = i3;
66617a3babSopenharmony_ci    uint3  r22 = f3;
67617a3babSopenharmony_ci    uint3  r23 = d3;  // valid, but loss of precision on downconversion.
68617a3babSopenharmony_ci
69617a3babSopenharmony_ci    bool3  r30 = i3;
70617a3babSopenharmony_ci    bool3  r31 = u3;
71617a3babSopenharmony_ci    bool3  r32 = f3;
72617a3babSopenharmony_ci    bool3  r33 = d3;
73617a3babSopenharmony_ci
74617a3babSopenharmony_ci    double3 r40 = i3;
75617a3babSopenharmony_ci    double3 r41 = u3;
76617a3babSopenharmony_ci    double3 r42 = f3;
77617a3babSopenharmony_ci    double3 r43 = b3;
78617a3babSopenharmony_ci
79617a3babSopenharmony_ci    // ----------- assign ops: vector times vector ----------- 
80617a3babSopenharmony_ci    r00 *= i3;
81617a3babSopenharmony_ci    r01 *= b3;
82617a3babSopenharmony_ci    r02 *= u3;
83617a3babSopenharmony_ci    r03 *= d3;  // valid, but loss of precision on downconversion.
84617a3babSopenharmony_ci    
85617a3babSopenharmony_ci    r10 *= b3;
86617a3babSopenharmony_ci    r11 *= u3;
87617a3babSopenharmony_ci    r12 *= f3;
88617a3babSopenharmony_ci    r13 *= d3;  // valid, but loss of precision on downconversion.
89617a3babSopenharmony_ci    
90617a3babSopenharmony_ci    r20 *= b3;
91617a3babSopenharmony_ci    r21 *= i3;
92617a3babSopenharmony_ci    r22 *= f3;
93617a3babSopenharmony_ci    r23 *= d3;  // valid, but loss of precision on downconversion.
94617a3babSopenharmony_ci
95617a3babSopenharmony_ci    // No mul operator for bools
96617a3babSopenharmony_ci    
97617a3babSopenharmony_ci    r40 *= i3;
98617a3babSopenharmony_ci    r41 *= u3;
99617a3babSopenharmony_ci    r42 *= f3;
100617a3babSopenharmony_ci    r43 *= b3;
101617a3babSopenharmony_ci
102617a3babSopenharmony_ci    // ----------- assign ops: vector times scalar ----------- 
103617a3babSopenharmony_ci    r00 *= is;
104617a3babSopenharmony_ci    r01 *= bs;
105617a3babSopenharmony_ci    r02 *= us;
106617a3babSopenharmony_ci    r03 *= ds;  // valid, but loss of precision on downconversion.
107617a3babSopenharmony_ci    
108617a3babSopenharmony_ci    r10 *= bs;
109617a3babSopenharmony_ci    r11 *= us;
110617a3babSopenharmony_ci    r12 *= fs;
111617a3babSopenharmony_ci    r13 *= ds;  // valid, but loss of precision on downconversion.
112617a3babSopenharmony_ci    
113617a3babSopenharmony_ci    r20 *= bs;
114617a3babSopenharmony_ci    r21 *= is;
115617a3babSopenharmony_ci    r22 *= fs;
116617a3babSopenharmony_ci    r23 *= ds;  // valid, but loss of precision on downconversion.
117617a3babSopenharmony_ci
118617a3babSopenharmony_ci    // No mul operator for bools
119617a3babSopenharmony_ci    
120617a3babSopenharmony_ci    r40 *= is;
121617a3babSopenharmony_ci    r41 *= us;
122617a3babSopenharmony_ci    r42 *= fs;
123617a3babSopenharmony_ci    r43 *= bs;
124617a3babSopenharmony_ci
125617a3babSopenharmony_ci
126617a3babSopenharmony_ci#define FN_OVERLOADS 0 // change to 1 when overloads under promotions are in place
127617a3babSopenharmony_ci
128617a3babSopenharmony_ci#if FN_OVERLOADS
129617a3babSopenharmony_ci    Fn_F3(i3);
130617a3babSopenharmony_ci    Fn_F3(u3);
131617a3babSopenharmony_ci    Fn_F3(f3);
132617a3babSopenharmony_ci    Fn_F3(b3);
133617a3babSopenharmony_ci    Fn_F3(d3);  // valid, but loss of precision on downconversion.
134617a3babSopenharmony_ci
135617a3babSopenharmony_ci    Fn_I3(i3);
136617a3babSopenharmony_ci    Fn_I3(u3);
137617a3babSopenharmony_ci    Fn_I3(f3);
138617a3babSopenharmony_ci    Fn_I3(b3);
139617a3babSopenharmony_ci    Fn_I3(d3);  // valid, but loss of precision on downconversion.
140617a3babSopenharmony_ci
141617a3babSopenharmony_ci    Fn_U3(i3);
142617a3babSopenharmony_ci    Fn_U3(u3);
143617a3babSopenharmony_ci    Fn_U3(f3);
144617a3babSopenharmony_ci    Fn_U3(b3);
145617a3babSopenharmony_ci    Fn_U3(d3);  // valid, but loss of precision on downconversion.
146617a3babSopenharmony_ci
147617a3babSopenharmony_ci    Fn_B3(i3);
148617a3babSopenharmony_ci    Fn_B3(u3);
149617a3babSopenharmony_ci    Fn_B3(f3);
150617a3babSopenharmony_ci    Fn_B3(b3);
151617a3babSopenharmony_ci    Fn_B3(d3);
152617a3babSopenharmony_ci
153617a3babSopenharmony_ci    Fn_D3(i3);
154617a3babSopenharmony_ci    Fn_D3(u3);
155617a3babSopenharmony_ci    Fn_D3(f3);
156617a3babSopenharmony_ci    Fn_D3(b3);
157617a3babSopenharmony_ci    Fn_D3(d3);
158617a3babSopenharmony_ci
159617a3babSopenharmony_ci    Fn_F3(i3.x);
160617a3babSopenharmony_ci    Fn_F3(u3.x);
161617a3babSopenharmony_ci    Fn_F3(f3.x);
162617a3babSopenharmony_ci    Fn_F3(b3.x);
163617a3babSopenharmony_ci    Fn_F3(d3.x);  // valid, but loss of precision on downconversion.
164617a3babSopenharmony_ci
165617a3babSopenharmony_ci    Fn_I3(i3.x);
166617a3babSopenharmony_ci    Fn_I3(u3.x);
167617a3babSopenharmony_ci    Fn_I3(f3.x);
168617a3babSopenharmony_ci    Fn_I3(b3.x);
169617a3babSopenharmony_ci    Fn_I3(d3.x);  // valid, but loss of precision on downconversion.
170617a3babSopenharmony_ci
171617a3babSopenharmony_ci    Fn_U3(i3.x);
172617a3babSopenharmony_ci    Fn_U3(u3.x);
173617a3babSopenharmony_ci    Fn_U3(f3.x);
174617a3babSopenharmony_ci    Fn_U3(b3.x);
175617a3babSopenharmony_ci    Fn_U3(d3.x);  // valid, but loss of precision on downconversion.
176617a3babSopenharmony_ci
177617a3babSopenharmony_ci    Fn_B3(i3.x);
178617a3babSopenharmony_ci    Fn_B3(u3.x);
179617a3babSopenharmony_ci    Fn_B3(f3.x);
180617a3babSopenharmony_ci    Fn_B3(b3.x);
181617a3babSopenharmony_ci    Fn_B3(d3.x);
182617a3babSopenharmony_ci
183617a3babSopenharmony_ci    Fn_D3(i3.x);
184617a3babSopenharmony_ci    Fn_D3(u3.x);
185617a3babSopenharmony_ci    Fn_D3(f3.x);
186617a3babSopenharmony_ci    Fn_D3(b3.x);
187617a3babSopenharmony_ci    Fn_D3(d3.x);
188617a3babSopenharmony_ci#endif
189617a3babSopenharmony_ci
190617a3babSopenharmony_ci    const int   si = 3;
191617a3babSopenharmony_ci    const float sf = 1.2;
192617a3babSopenharmony_ci
193617a3babSopenharmony_ci    int   c1 = si * sf;  // 3.6 (not 3!)
194617a3babSopenharmony_ci    int   c2 = sf * si;  // 3.6 (not 3!)
195617a3babSopenharmony_ci
196617a3babSopenharmony_ci    float4 outval = float4(si * sf, sf*si, c1, c2);
197617a3babSopenharmony_ci
198617a3babSopenharmony_ci    PS_OUTPUT psout;
199617a3babSopenharmony_ci    psout.Color = outval;
200617a3babSopenharmony_ci    return psout;
201617a3babSopenharmony_ci}
202