From 4f6f827e26ffcb9b850ef8a8b7f7b4beb5addb7a Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 27 Aug 2024 18:48:41 -0700 Subject: Add functor syntax support. (#4926) --- tests/language-feature/ifunc/diff-functor.slang | 8 ++--- tests/language-feature/ifunc/functor.slang | 40 +++++++++++++++++++++++++ tests/language-feature/ifunc/ifunc.slang | 6 ++-- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 tests/language-feature/ifunc/functor.slang (limited to 'tests') diff --git a/tests/language-feature/ifunc/diff-functor.slang b/tests/language-feature/ifunc/diff-functor.slang index 04b0be44f..117cce76b 100644 --- a/tests/language-feature/ifunc/diff-functor.slang +++ b/tests/language-feature/ifunc/diff-functor.slang @@ -6,7 +6,7 @@ struct DiffFunctor : IDifferentiableFunc { [Differentiable] - float __call(float p) + float operator()(float p) { return p + 1; } @@ -14,19 +14,19 @@ struct DiffFunctor : IDifferentiableFunc float apply(IMutatingFunc f, float p) { - return f.__call(p); + return f(p); } [Differentiable] float applyDiff(IDifferentiableFunc f, float p) { - return f.__call(p); + return f(p); } [Differentiable] TR applyDiffGen(IDifferentiableFunc f, expand each TP p) { - return f.__call(expand each p); + return f(expand each p); } //TEST_INPUT:ubuffer(data=[0 3 2 2], stride=4):out,name=outputBuffer diff --git a/tests/language-feature/ifunc/functor.slang b/tests/language-feature/ifunc/functor.slang new file mode 100644 index 000000000..73987cbbf --- /dev/null +++ b/tests/language-feature/ifunc/functor.slang @@ -0,0 +1,40 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-dx12 -use-dxil -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -shaderobj -output-using-type + +struct Functor : IMutatingFunc +{ + int context; + + [mutating] + float operator()(float p) + { + context += (int)p; + return context; + } +} + +float apply>(inout T f, float p) +{ + return f(p); +} + +//TEST_INPUT:ubuffer(data=[0 3 2 2], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(1, 1, 1)] +void computeMain(uint tid: SV_DispatchThreadID) +{ + Functor f; + f.context = 0; + + f(1.0f); + f.operator()(1.0f); // explicit operator () call should also work. + + apply(f, 2.0f); + apply(f, 3.0f); + + // CHECK: 7 + outputBuffer[0] = (uint)f.context; +} diff --git a/tests/language-feature/ifunc/ifunc.slang b/tests/language-feature/ifunc/ifunc.slang index f270299b3..6c946f4df 100644 --- a/tests/language-feature/ifunc/ifunc.slang +++ b/tests/language-feature/ifunc/ifunc.slang @@ -5,7 +5,7 @@ struct Functor : IFunc { - int __call(int p, bool t) + int operator()(int p, bool t) { return p + 1; } @@ -15,7 +15,7 @@ struct MutatingFunctor : IMutatingFunc { int data = 0; [mutating] - int __call(int p, bool t) + int operator()(int p, bool t) { data++; return p + 1; @@ -24,7 +24,7 @@ struct MutatingFunctor : IMutatingFunc int apply(IMutatingFunc f, int p) { - return f.__call(p, true); + return f(p, true); } //TEST_INPUT:ubuffer(data=[0 3 2 2], stride=4):out,name=outputBuffer -- cgit v1.2.3