summaryrefslogtreecommitdiffstats
path: root/tests/language-feature/higher-order-functions/overload-different-param-count.slang
blob: 1af1b6706be5207c2f7b92527d9c22c37d3793d1 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//TEST:SIMPLE(filecheck=CHECK): -target glsl -entry computeMain -stage compute
// CHECK: main(
struct DiffMaterialData : IDifferentiable
{
    static const uint kMaterialParamCount = 20;

    // Material parameters.
    float data[kMaterialParamCount];

    [Differentiable]
    __init()
    {
        [ForceUnroll]
        for (uint i = 0; i < kMaterialParamCount; i++)
            data[i] = 0.f;
    }

    [Differentiable]
    float read(inout uint offset) { return data[offset++]; }

    [Differentiable]
    void read<let N : int>(out vector<float, N> value, inout uint offset)
    {
        [ForceUnroll]
        for (uint i = 0; i < N; i++)
            value[i] = read(offset);
    }

    [Differentiable]
    vector<float, N> read<let N : int>(inout uint offset)
    {
        vector<float, N> value;
        this.read(value, offset);
        return value;
    }

    [mutating]
    [Differentiable]
    void write(float value, inout uint offset) { data[offset++] = value; }

    [mutating]
    [Differentiable]
    void write<let N : int>(vector<float, N> value, inout uint offset)
    {
        [ForceUnroll]
        for (uint i = 0; i < N; i++)
            this.write(value[i], offset);
    }
};

RWStructuredBuffer<float3> outputBuffer;

[numthreads(1,1,1)]
void computeMain()
{
    DiffMaterialData diffData;
    uint offset = 0;
    outputBuffer[0] = diffData.read<3>(offset);
}