diff options
| author | Yong He <yonghe@outlook.com> | 2025-06-13 22:13:00 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-13 22:13:00 -0700 |
| commit | 6a23949f07f4eba38086b656e7073ce3bf8cd2fe (patch) | |
| tree | 132bbe330b6027d323c74175686d006605e4da6d /tests/language-feature | |
| parent | e72b3325663ab6d4bb791742574b031f0df6328a (diff) | |
Allow interface methods to have default implementations. (#7439)
Diffstat (limited to 'tests/language-feature')
4 files changed, 178 insertions, 0 deletions
diff --git a/tests/language-feature/interfaces/default-method-differentiable.slang b/tests/language-feature/interfaces/default-method-differentiable.slang new file mode 100644 index 000000000..4cd5dc1ed --- /dev/null +++ b/tests/language-feature/interfaces/default-method-differentiable.slang @@ -0,0 +1,42 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +// Test that a default interface method can be differentiable. + +interface IFoo<int v> +{ + [Differentiable] + float getVal(float x); + + [Differentiable] + float getGreaterVal<int y>(float x) + { + return getVal(x) + y + v; + } +} + +struct Impl : IFoo<2> +{ + [Differentiable] + float getVal(float x) + { + return x*x; + } + + // Using the default implementation for getGreaterVal. +} + +[Differentiable] +float test<int y, T:IFoo<y>>(T v, float x) { return v.getGreaterVal<1>(x); } + +//TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer<float> resultBuffer; + +[numthreads(1,1,1)] +void computeMain() +{ + Impl impl = {}; + var dpx = diffPair(3.0); + bwd_diff(test)(impl, dpx, 1.0f); + resultBuffer[0] = dpx.d; + // CHECK: 6.0 +} diff --git a/tests/language-feature/interfaces/default-method-generic-interface.slang b/tests/language-feature/interfaces/default-method-generic-interface.slang new file mode 100644 index 000000000..fb32b2001 --- /dev/null +++ b/tests/language-feature/interfaces/default-method-generic-interface.slang @@ -0,0 +1,55 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +// Test that a generic interface method in a generic interface +// can have a body providing default implementation. + +interface IFoo<int v> +{ + int getVal(); + int getGreaterVal<int x>() + { + return getVal() + x + v; + } +} + +struct Impl : IFoo<2> +{ + int getVal() + { + return 42; + } + + // Using the default implementation for getGreaterVal. +} + +struct Impl2 : IFoo<2> +{ + int getVal() + { + return 42; + } + + // overriding default implementation. + int getGreaterVal<int x>() + { + return 100 + x; + } +} + +int test<int y, T:IFoo<y>>(T v) { return v.getGreaterVal<1>(); } + +//TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer<int> resultBuffer; + +[numthreads(1,1,1)] +void computeMain() +{ + Impl impl = {}; + int result = test(impl); + resultBuffer[0] = result; + // CHECK: 45 + + Impl2 impl2 = {}; + resultBuffer[1] = test(impl2); + // CHECK: 101 +}
\ No newline at end of file diff --git a/tests/language-feature/interfaces/default-method-generic.slang b/tests/language-feature/interfaces/default-method-generic.slang new file mode 100644 index 000000000..48e1d98de --- /dev/null +++ b/tests/language-feature/interfaces/default-method-generic.slang @@ -0,0 +1,36 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +// Test that a generic interface method can have a body providing default implementation. + +interface IFoo +{ + int getVal(); + int getGreaterVal<int x>() + { + return getVal() + x; + } +} + +struct Impl : IFoo +{ + int getVal() + { + return 42; + } + + // Using the default implementation for getGreaterVal. +} + +int test<T:IFoo>(T v) { return v.getGreaterVal<1>(); } + +//TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer<int> resultBuffer; + +[numthreads(1,1,1)] +void computeMain() +{ + Impl impl = {}; + int result = test(impl); + resultBuffer[0] = result; + // CHECK: 43 +}
\ No newline at end of file diff --git a/tests/language-feature/interfaces/default-method.slang b/tests/language-feature/interfaces/default-method.slang new file mode 100644 index 000000000..98bebc1e3 --- /dev/null +++ b/tests/language-feature/interfaces/default-method.slang @@ -0,0 +1,45 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +// Test that interface method can have a body providing default implementation. + +interface IFoo +{ + int getVal(); + int getGreaterVal() + { + return getVal() + 1; + } + static int getStaticVal() + { + return 100; + } +} + +struct Impl : IFoo +{ + int getVal() + { + return 42; + } + + // Using the default implementation for getGreaterVal. +} + +int test<T:IFoo>(T v) { return v.getGreaterVal(); } + +int test2<T:IFoo>() { return T.getStaticVal();} + +//TEST_INPUT: set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) +RWStructuredBuffer<int> resultBuffer; + +[numthreads(1,1,1)] +void computeMain() +{ + Impl impl = {}; + int result = test(impl); + resultBuffer[0] = result; + // CHECK: 43 + + resultBuffer[1] = test2<Impl>(); + // CHECK: 100 +}
\ No newline at end of file |
