struct PS_OUTPUT { float4 Color : SV_Target0; }; uniform int3 i3; uniform bool3 b3; uniform float3 f3; uniform uint3 u3; uniform double3 d3; uniform int is; uniform bool bs; uniform float fs; uniform uint us; uniform double ds; void Fn_F3(float3 x) { } void Fn_I3(int3 x) { } void Fn_U3(uint3 x) { } void Fn_B3(bool3 x) { } void Fn_D3(double3 x) { } // ----------- Test implicit conversions on function returns ----------- float3 Fn_R_F3I(out float3 p) { p = i3; return i3; } float3 Fn_R_F3U(out float3 p) { p = u3; return u3; } float3 Fn_R_F3B(out float3 p) { p = b3; return b3; } float3 Fn_R_F3D(out float3 p) { p = d3; return d3; } // valid, but loss of precision on downconversion. int3 Fn_R_I3U(out int3 p) { p = u3; return u3; } int3 Fn_R_I3B(out int3 p) { p = b3; return b3; } int3 Fn_R_I3F(out int3 p) { p = f3; return f3; } int3 Fn_R_I3D(out int3 p) { p = d3; return d3; } // valid, but loss of precision on downconversion. uint3 Fn_R_U3I(out uint3 p) { p = i3; return i3; } uint3 Fn_R_U3F(out uint3 p) { p = f3; return f3; } uint3 Fn_R_U3B(out uint3 p) { p = b3; return b3; } uint3 Fn_R_U3D(out uint3 p) { p = d3; return d3; } // valid, but loss of precision on downconversion. bool3 Fn_R_B3I(out bool3 p) { p = i3; return i3; } bool3 Fn_R_B3U(out bool3 p) { p = u3; return u3; } bool3 Fn_R_B3F(out bool3 p) { p = f3; return f3; } bool3 Fn_R_B3D(out bool3 p) { p = d3; return d3; } double3 Fn_R_D3I(out double3 p) { p = i3; return i3; } double3 Fn_R_D3U(out double3 p) { p = u3; return u3; } double3 Fn_R_D3B(out double3 p) { p = b3; return b3; } double3 Fn_R_D3F(out double3 p) { p = f3; return f3; } PS_OUTPUT main() { // ----------- assignment conversions ----------- float3 r00 = i3; float3 r01 = b3; float3 r02 = u3; float3 r03 = d3; // valid, but loss of precision on downconversion. int3 r10 = b3; int3 r11 = u3; int3 r12 = f3; int3 r13 = d3; // valid, but loss of precision on downconversion. uint3 r20 = b3; uint3 r21 = i3; uint3 r22 = f3; uint3 r23 = d3; // valid, but loss of precision on downconversion. bool3 r30 = i3; bool3 r31 = u3; bool3 r32 = f3; bool3 r33 = d3; double3 r40 = i3; double3 r41 = u3; double3 r42 = f3; double3 r43 = b3; // ----------- assign ops: vector times vector ----------- r00 *= i3; r01 *= b3; r02 *= u3; r03 *= d3; // valid, but loss of precision on downconversion. r10 *= b3; r11 *= u3; r12 *= f3; r13 *= d3; // valid, but loss of precision on downconversion. r20 *= b3; r21 *= i3; r22 *= f3; r23 *= d3; // valid, but loss of precision on downconversion. // No mul operator for bools r40 *= i3; r41 *= u3; r42 *= f3; r43 *= b3; // ----------- assign ops: vector times scalar ----------- r00 *= is; r01 *= bs; r02 *= us; r03 *= ds; // valid, but loss of precision on downconversion. r10 *= bs; r11 *= us; r12 *= fs; r13 *= ds; // valid, but loss of precision on downconversion. r20 *= bs; r21 *= is; r22 *= fs; r23 *= ds; // valid, but loss of precision on downconversion. // No mul operator for bools r40 *= is; r41 *= us; r42 *= fs; r43 *= bs; #define FN_OVERLOADS 0 // change to 1 when overloads under promotions are in place #if FN_OVERLOADS Fn_F3(i3); Fn_F3(u3); Fn_F3(f3); Fn_F3(b3); Fn_F3(d3); // valid, but loss of precision on downconversion. Fn_I3(i3); Fn_I3(u3); Fn_I3(f3); Fn_I3(b3); Fn_I3(d3); // valid, but loss of precision on downconversion. Fn_U3(i3); Fn_U3(u3); Fn_U3(f3); Fn_U3(b3); Fn_U3(d3); // valid, but loss of precision on downconversion. Fn_B3(i3); Fn_B3(u3); Fn_B3(f3); Fn_B3(b3); Fn_B3(d3); Fn_D3(i3); Fn_D3(u3); Fn_D3(f3); Fn_D3(b3); Fn_D3(d3); Fn_F3(i3.x); Fn_F3(u3.x); Fn_F3(f3.x); Fn_F3(b3.x); Fn_F3(d3.x); // valid, but loss of precision on downconversion. Fn_I3(i3.x); Fn_I3(u3.x); Fn_I3(f3.x); Fn_I3(b3.x); Fn_I3(d3.x); // valid, but loss of precision on downconversion. Fn_U3(i3.x); Fn_U3(u3.x); Fn_U3(f3.x); Fn_U3(b3.x); Fn_U3(d3.x); // valid, but loss of precision on downconversion. Fn_B3(i3.x); Fn_B3(u3.x); Fn_B3(f3.x); Fn_B3(b3.x); Fn_B3(d3.x); Fn_D3(i3.x); Fn_D3(u3.x); Fn_D3(f3.x); Fn_D3(b3.x); Fn_D3(d3.x); #endif const int si = 3; const float sf = 1.2; int c1 = si * sf; // 3.6 (not 3!) int c2 = sf * si; // 3.6 (not 3!) float4 outval = float4(si * sf, sf*si, c1, c2); PS_OUTPUT psout; psout.Color = outval; return psout; }