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