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);
}
|