From ecf85df6eee3da76ef54b14e4ab083f22da89e46 Mon Sep 17 00:00:00 2001 From: Yong He Date: Sun, 18 Aug 2024 21:57:24 -0700 Subject: Variadic Generics Part 2: IR lowering and specialization. (#4849) * Variadic Generics Part 2: IR lowering and specialization. * Update design doc status. * Update design doc. * Resolve review comments. --- tests/language-feature/generics/tuple.slang | 27 +++++++++++++ tests/language-feature/generics/variadic-0.slang | 47 ++++++++++++++++++++++ .../language-feature/generics/variadic-void.slang | 44 ++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 tests/language-feature/generics/tuple.slang create mode 100644 tests/language-feature/generics/variadic-0.slang create mode 100644 tests/language-feature/generics/variadic-void.slang (limited to 'tests') diff --git a/tests/language-feature/generics/tuple.slang b/tests/language-feature/generics/tuple.slang new file mode 100644 index 000000000..b8c70f872 --- /dev/null +++ b/tests/language-feature/generics/tuple.slang @@ -0,0 +1,27 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +T writeSingle(inout int offset, T value) +{ + outputBuffer[offset++] = __realCast(value); + return value; +} + +void write(Tuple tuple) +{ + int offset = 0; + expand writeSingle(offset, each tuple); +} + +[numthreads(1,1,1)] +void computeMain() +{ + // CHECK: 1.0 + // CHECK: 2.0 + // CHECK: 3.0 + // CHECK: 4.0 + let tuple = Tuple(1.0, 2.0h, 3.0, 4.0); + write(tuple); +} diff --git a/tests/language-feature/generics/variadic-0.slang b/tests/language-feature/generics/variadic-0.slang new file mode 100644 index 000000000..8ee41647f --- /dev/null +++ b/tests/language-feature/generics/variadic-0.slang @@ -0,0 +1,47 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +struct S +{ + T v; + __init(T x) + { + v = x; + } +} + + +S makeS(T x) +{ + return S(x); +} +bool cmp(T a, int b) +{ + return a > __int_cast(b); +} +void accept(expand each T value) {} + +T writeSingle(inout int offset, T value) +{ + outputBuffer[offset++] = __realCast(value); + return value; +} + +void write(expand S value) +{ + int offset = 0; + accept(expand writeSingle(offset, cmp((each value).v, 0) ? (each value).v : __realCast(0.0))); +} + +[numthreads(1,1,1)] +void computeMain() +{ + // CHECK: 1.0 + // CHECK: 2.0 + // CHECK: 3.0 + // CHECK: 4.0 + write(); + write(makeS(1.0), makeS(2.0h), makeS(3.0), makeS(4.0)); +} diff --git a/tests/language-feature/generics/variadic-void.slang b/tests/language-feature/generics/variadic-void.slang new file mode 100644 index 000000000..d44acbfd4 --- /dev/null +++ b/tests/language-feature/generics/variadic-void.slang @@ -0,0 +1,44 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +struct S +{ + T v; + __init(T x) + { + v = x; + } +} + + +S makeS(T x) +{ + return S(x); +} + +void accept(expand each T value) {} + +void writeSingle(T value) +{ + static int counter = 0; + outputBuffer[counter++] = __realCast(value); + //return value; +} + +void write(expand S value) +{ + accept(expand writeSingle((each value).v)); +} + +[numthreads(1,1,1)] +void computeMain() +{ + // CHECK: 1.0 + // CHECK: 2.0 + // CHECK: 3.0 + // CHECK: 4.0 + write(makeS(1.0), makeS(2.0), makeS(3.0), makeS(4.0)); + write(); +} \ No newline at end of file -- cgit v1.2.3