summaryrefslogtreecommitdiffstats
path: root/tests/experiments/generic/param-specialize.slang
blob: cff623827b70511f74876ad7998b970b5917c8a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj

/* This test trys to specialize an algorithm through generic parameters. 

Using parameters in this way ensures the algorithm in function form 
will have those values known at compile time, and presumably lead to a specialized version.

Does not work because

.slang(24): error 30019: expected an expression of type 'int', got 'Enum'
    let v = doThing<true, false, Enum::A>();
                                     ^      
                                   
Note that docs say doesn't support any other than int, but error is a bit confusing. No error at declaration.
*/

//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<int> outputBuffer;

enum class Enum
{
    A, B
};

int doThing<let a : bool, let b : int, let c : Enum>()
{
    if (a)
    {
        return 1;
    }
    return 0;
    // A more complex scenario
    //return a ? b + b + int(c) : b - int(c);
}

[numthreads(4, 1, 1)]
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
{    
    int index = dispatchThreadID.x;
    
    let v = doThing<true, false, Enum::A>();
    
    outputBuffer[dispatchThreadID.x] = v;
}