[pixel shader]
uniform int i;
uniform uint u;
uniform bool b;
uniform float f;

float4 main() : sv_target
{
    return float4(((half)i) + 1.5, ((half)u) - 2.5, ((half)b) / 2, f);
}

[test]
if(sm<4) uniform 0 float -1
if(sm<4) uniform 4 float 3
if(sm<4) uniform 8 float 1
if(sm<4) uniform 12 float 0.5
if(sm>=4) uniform 0 int -1
if(sm>=4) uniform 1 uint 3
if(sm>=4) uniform 2 int -2
if(sm>=4) uniform 3 float 0.5
draw quad
probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5)


[pixel shader]
float4 main() : sv_target
{
    int i = -1;
    uint u = 3;
    bool b = true;
    float f = 0.5;
    return float4(((half)i) + 1.5, ((half)u) - 2.5, ((half)b) / 2, f);
}

[test]
draw quad
probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5)

[require]
shader model >= 6.2
native-16-bit

[pixel shader]
uniform float4 f;

float4 main() : sv_target
{
    half4 h = f;
    /* WARP and AMD (but not NVIDIA) convert 65536.0f to 65504.0h rather than
     * to infinity. We're not currently interested in modelling these details,
     * so we flush 65504.0h to infinity manually. */
    bool4 near_infinity = (abs(h) == 65504.0);
    h /= !near_infinity;
    return h * half4(2.0, 2.0, 0.5, 0.5);
}

[test]
uniform 0 float4 65536.0 32768.0 65536.0 32768.0
draw quad
probe (0, 0) f32(inf, inf, inf, 16384.0)
uniform 0 float4 -65536.0 -32768.0 -65536.0 -32768.0
draw quad
probe (0, 0) f32(-inf, -inf, -inf, -16384.0)
uniform 0 float4 0.000062 5.97e-8 0.000062 5.97e-8
draw quad
probe (0, 0) f32(0.00012397766, 1.1920929e-7, 0.000030994415, 0.0) 1
uniform 0 float4 -0.000062 -5.97e-8 -0.000062 -5.97e-8
draw quad
probe (0, 0) f32(-0.00012397766, -1.1920929e-7, -0.000030994415, 0.0) 1
