summaryrefslogtreecommitdiff
path: root/tests/preprocessor/define-function-like.slang.expected
blob: 1e4b4dcc9c4b64c4aaf40e935f237c145f125bd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
result code = -1
standard error = {
tests/preprocessor/define-function-like.slang(16): error 30015: undefined identifier 'x'.
#define M (x) - (x)
           ^
tests/preprocessor/define-function-like.slang(16): error 30015: undefined identifier 'x'.
#define M (x) - (x)
                 ^
}
standard output = {
}
href='#n31'>31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// Test calling differentiable function through dynamic dispatch.

//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type

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

[anyValueSize(16)]
interface IInterface
{
    static float calc(float x);
}

struct A : IInterface
{
    static float calc(float x) { return 1.0; }
};

struct B : IInterface
{
    static float calc(float x) { return 2.0; }
};

DifferentialPair<float> dsqr<T:IInterface>(T obj, DifferentialPair<float> x)
{
    float primal = obj.calc(x.p) + x.p * x.p;
    float diff = 2.0 * x.p * x.d;
    return diffPair(primal, diff);
}

[ForwardDerivative(dsqr)]
float sqr<T:IInterface>(T obj, float x)
{
    return no_diff(obj.calc(x)) + x * x;
}

//TEST_INPUT: type_conformance A:IInterface = 0
//TEST_INPUT: type_conformance B:IInterface = 1


[numthreads(1, 1, 1)]
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
{
    var obj = createDynamicObject<IInterface>(dispatchThreadID.x, 0); // A
    var p = DifferentialPair<float>(2.0, 1.0);
   
    outputBuffer[0] =  __fwd_diff(sqr)(obj, p).d; // A.calc, expect 4

    obj = createDynamicObject<IInterface>(dispatchThreadID.x + 1, 0); // B
    p = DifferentialPair<float>(1.5, 1.0);
    outputBuffer[1] = __fwd_diff(sqr)(obj, p).d;  // B.calc, expect 3
}