summaryrefslogtreecommitdiffstats
path: root/tests/language-feature
diff options
context:
space:
mode:
Diffstat (limited to 'tests/language-feature')
-rw-r--r--tests/language-feature/interfaces/default-method-differentiable.slang42
-rw-r--r--tests/language-feature/interfaces/default-method-generic-interface.slang55
-rw-r--r--tests/language-feature/interfaces/default-method-generic.slang36
-rw-r--r--tests/language-feature/interfaces/default-method.slang45
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