% TODO: dxcompiler emits no loops for any of these test shaders.

[pixel shader]
float a;

float4 main() : sv_target
{
    float res = 0;

    for (int i = 0; i < 10; ++i)
    {
        res += a;
        // The temp copy of 'a' must reserve its registers for the rest of the loop.
        // It shall not be overwritten.
    }
    return res;
}

[test]
uniform 0 float 5.0
todo(msl) draw quad
probe (0, 0) rgba (50.0, 50.0, 50.0, 50.0)


[pixel shader]
float a;

float4 main() : sv_target
{
    float res = 0;

    for (int i = 0; i < 10; ++i)
    {
        res += a;
        // The temp copy of 'a' must reserve its registers for the rest of the loop.
        // It shall not be overwritten.
        i++;
    }
    return res;
}

[test]
uniform 0 float 4.0
todo(msl) draw quad
probe (0, 0) rgba (20.0, 20.0, 20.0, 20.0)

[pixel shader]
float a;

float4 main() : sv_target
{
    int i = 0;
    float res = a;

    while (i < 10)
    {
       if (i == 5)
       {
           res += 0.1f;
           break;
       }
       res += 1.0f;
       i++;
       if (i == 2) continue;
       res += 100.f;
    }

    return res;
}

[test]
uniform 0 float 4.0
todo(msl) draw quad
probe (0, 0) rgba (409.1, 409.1, 409.1, 409.1)

[pixel shader]
float a;

float4 main() : sv_target
{
    int i = 0;
    float res = a;

    do
    {
       res += 1.0f;
       if (i == 5)
       {
           res += 0.1f;
           break;
       }
       i++;
       if (i == 2) continue;
       res += 100.f;
    }
    while (i < 10);

    return res;
}

[test]
uniform 0 float 4.0
todo(msl) draw quad
probe (0, 0) rgba (410.1, 410.1, 410.1, 410.1)

% loop attribute by itself
[pixel shader todo(sm<4)]
float4 main() : sv_target
{
    float ret = 0.0;

    [loop] for (int i = 0; i < 10; ++i)
    {
        ret += 1.0;
    }

    return ret;
}

[test]
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0)

[pixel shader todo(sm<4)]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [loop] while (i < 10)
    {
        ret += 1.0;
        i++;
    }

    return ret;
}

[test]
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0)

[pixel shader todo(sm<4)]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [loop] do
    {
        i++;
        ret += 1.0;
    } while (i < 10);

    return ret;
}

[test]
todo(sm<4 | msl) draw quad
probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0)

% unroll can't be used with fastopt or loop
[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;

    [loop] [unroll(1)] for (int i = 0; i < 10; ++i)
    {
        ret += 1.0;
    }

    return ret;
}

[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;

    [fastopt] [unroll(1)] for (int i = 0; i < 10; ++i)
    {
        ret += 1.0;
    }

    return ret;
}

[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [loop] [unroll(1)] while (i < 10)
    {
        ret += 1.0;
        i++;
    }

    return ret;
}

[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [fastopt] [unroll(1)] while (i < 10)
    {
        ret += 1.0;
        i++;
    }

    return ret;
}

[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [loop] [unroll(1)] do
    {
        ret += 1.0;
        i++;
    } while (i < 10)

    return ret;
}

[pixel shader fail]
float4 main() : sv_target
{
    float ret = 0.0;
    int i = 0;

    [fastopt] [unroll(1)] do
    {
        ret += 1.0;
        i++;
    } while (i < 10)

    return ret;
}