% Unlike assignment syntax, only these names are allowed.
% The parameter count is also checked.
[pixel shader]
sampler sam
{
    SetBlendState(foo, bar, baz); // 3 parameters
    SetDepthStencilState(foo, 2); // 2 parameters
    SetRasterizerState(foo);      // 1 parameter
    SetVertexShader(vs);          // 1 parameter
    SetDomainShader(ds);          // 1 paramter
    SetHullShader(100);           // 1 parameter
    SetGeometryShader(foo + bar); // 1 parameter
    SetPixelShader(ps1);          // 1 parameter
    SetComputeShader(ARG);        // 1 parameter
    OMSetRenderTargets(RTV0, RTV1, RTV2, RTV3, RTV4, RTV5, RTV6, RTV7, DSV); // 2 to 9 parameters
};

float4 main() : sv_target { return 0; }


[pixel shader]
sampler sam
{
    SetComputeShader("random string");
};

float4 main() : sv_target { return 0; }


[pixel shader fail(sm<6)]
sampler sam
{
    SetSomeotherState();
};

float4 main() : sv_target { return 0; }


[pixel shader fail(sm<6)]
sampler sam
{
    Setblendstate(1, 2, 3); // Test case-sensitivity.
};

float4 main() : sv_target { return 0; }


% It is allowed to use functions together with assignment syntax.
[pixel shader]
sampler sam
{
    SetDepthStencilState(foo, bar);
    arbitrary_field = 42;
};

float4 main() : sv_target { return 0; }


% Test complex expression on the arguments, including function calls.
[pixel shader]
float4 addition(float4 a, float4 b)
{
    return a + b;
}

sampler sam
{
    SetBlendState(addition(foo, bar), p + q, p / q);
};

float4 main() : sv_target { return 0; }


% Test the same thing on technique passes
[pixel shader]
technique tech1
{
    pass pass1
    {
        SetBlendState(foo, bar, baz);
        SetDepthStencilState(foo, 2);
        SetRasterizerState(foo);
        SetVertexShader(vs);
    }
}

float4 main() : sv_target { return 0; }


% It is not allowed to call the functions to set state blocks on the rhs using the assignment syntax
% for state groups or passes.
[pixel shader fail(sm<6)]
float4 main() : sv_target { return 0; }

technique
{
    pass
    {
        cat = SetPixelShader(foobar);
    }
}


% It not allowed to call the functions to set states outside state blocks or passes.
[pixel shader fail]
DepthStencilState dss1
{
    DepthEnable = false;
    DepthWriteMask = Zero;
    DepthFunc = Less;
};

float4 main() : sv_target
{
    SetDepthStencilState(NULL, dss1);
    return 0;
}
