summaryrefslogtreecommitdiffstats
path: root/tests/autodiff/self-differential-type-synthesis.slang
blob: 6faa2175a8f8ab50f78a47bc7746e7e79e218268 (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
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -shaderobj

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

// Test that struct types made up of differentiable members who are self-differential (i.e. their Differential type is the same as their type) 
// are considered self-differential as well. We should be able to assign T.Differential = T and T = T.Differential without errors.
// 1

struct Ray : IDifferentiable {
    float a;
    float3 dir, o;
}

[numthreads(1, 1, 1)]
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
{
    Ray ray = {};
    Ray.Differential ray2;

    ray.a = 1.f;
    ray.o = float3(3.f, 4.f, 2.5f);

    ray2 = ray;

    float t = 0.f;
    float.Differential dt = 0.f;

    t = dt;

    outputBuffer[0] = t;
    outputBuffer[1] = ray2.o.y;
    outputBuffer[2] = Ray.dadd(ray2, ray2).a;
}