yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

ArielG-NVInit expressions for struct fields support, #3738 (#3907)d5d39dda2

master
1.4 KiB59 linesraw
1//TEST:SIMPLE(filecheck=CHECK): -target glsl -entry computeMain -stage compute
2// CHECK: main(
3struct DiffMaterialData : IDifferentiable
4{
5    static const uint kMaterialParamCount = 20;
6
7    // Material parameters.
8    float data[kMaterialParamCount];
9
10    [Differentiable]
11    __init()
12    {
13        [ForceUnroll]
14        for (uint i = 0; i < kMaterialParamCount; i++)
15            data[i] = 0.f;
16    }
17
18    [Differentiable]
19    float read(inout uint offset) { return data[offset++]; }
20
21    [Differentiable]
22    void read<let N : int>(out vector<float, N> value, inout uint offset)
23    {
24        [ForceUnroll]
25        for (uint i = 0; i < N; i++)
26            value[i] = read(offset);
27    }
28
29    [Differentiable]
30    vector<float, N> read<let N : int>(inout uint offset)
31    {
32        vector<float, N> value;
33        this.read(value, offset);
34        return value;
35    }
36
37    [mutating]
38    [Differentiable]
39    void write(float value, inout uint offset) { data[offset++] = value; }
40
41    [mutating]
42    [Differentiable]
43    void write<let N : int>(vector<float, N> value, inout uint offset)
44    {
45        [ForceUnroll]
46        for (uint i = 0; i < N; i++)
47            this.write(value[i], offset);
48    }
49};
50
51RWStructuredBuffer<float3> outputBuffer;
52
53[numthreads(1,1,1)]
54void computeMain()
55{
56    DiffMaterialData diffData;
57    uint offset = 0;
58    outputBuffer[0] = diffData.read<3>(offset);
59}