summaryrefslogtreecommitdiffstats
path: root/tests/experiments/algorithm
diff options
context:
space:
mode:
Diffstat (limited to 'tests/experiments/algorithm')
-rw-r--r--tests/experiments/algorithm/find-max-2.slang45
-rw-r--r--tests/experiments/algorithm/find-max.slang41
-rw-r--r--tests/experiments/algorithm/generic-int-controlled-2.slang33
-rw-r--r--tests/experiments/algorithm/generic-int-controlled.slang35
4 files changed, 154 insertions, 0 deletions
diff --git a/tests/experiments/algorithm/find-max-2.slang b/tests/experiments/algorithm/find-max-2.slang
new file mode 100644
index 000000000..3aebbc997
--- /dev/null
+++ b/tests/experiments/algorithm/find-max-2.slang
@@ -0,0 +1,45 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
+
+/* Find max algorithm.
+
+Works.
+ */
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+interface IComparable
+{
+ bool isLess(This other);
+};
+
+extension int : IComparable
+{
+ bool isLess(int other) { return this < other; }
+};
+
+T findMax<T : IComparable, let SIZE : int>(T arr[SIZE])
+{
+ T m = arr[0];
+ for (int i = 1; i < 8; ++i)
+ {
+ if (m.isLess(arr[i]))
+ {
+ m = arr[i];
+ }
+ }
+ return m;
+}
+
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int index = dispatchThreadID.x;
+
+ int values[] = { 1, 3, - 1};
+
+ outputBuffer[index] = findMax<int, 3>(values);
+}
+
+
diff --git a/tests/experiments/algorithm/find-max.slang b/tests/experiments/algorithm/find-max.slang
new file mode 100644
index 000000000..ba8499013
--- /dev/null
+++ b/tests/experiments/algorithm/find-max.slang
@@ -0,0 +1,41 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
+
+/* Find max algorithm.
+
+Doesn't work because, can't compare T as it is any type.
+
+.slang(15): error 39999: no overload for '>' applicable to arguments of type (T, T)
+ if (arr[i] > m)
+ ^
+core.meta.slang(2572): note 39999: candidate: func >(uint64_t, uint64_t) -> bool
+
+ */
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+T findMax<T, let SIZE : int>(T arr[SIZE])
+{
+ T m = arr[0];
+ for (int i = 1; i < 8; ++i)
+ {
+ if (arr[i] > m)
+ {
+ m = arr[i];
+ }
+ }
+ return i;
+}
+
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int index = dispatchThreadID.x;
+
+ int values[] = { 1, 3, - 1};
+
+ outputBuffer[index] = findMax(values);
+}
+
+
diff --git a/tests/experiments/algorithm/generic-int-controlled-2.slang b/tests/experiments/algorithm/generic-int-controlled-2.slang
new file mode 100644
index 000000000..52ef02336
--- /dev/null
+++ b/tests/experiments/algorithm/generic-int-controlled-2.slang
@@ -0,0 +1,33 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
+
+/* Test to control altering of an algorithm via generic compile time values.
+
+Works.
+ */
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+int reduce<let Clustering : int, let DupTest : int>( int a)
+{
+ if (Clustering)
+ {
+ a = a + a;
+ }
+ if (DupTest)
+ {
+ a *= a;
+ }
+ return a;
+}
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int index = dispatchThreadID.x;
+
+ int r = reduce<1, 2>(index);
+
+ outputBuffer[index] = r;
+}
+
diff --git a/tests/experiments/algorithm/generic-int-controlled.slang b/tests/experiments/algorithm/generic-int-controlled.slang
new file mode 100644
index 000000000..5f698633c
--- /dev/null
+++ b/tests/experiments/algorithm/generic-int-controlled.slang
@@ -0,0 +1,35 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
+
+/* Test to control altering of an algorithm via generic compile time values.
+
+slang(28): note 99999: an internal error threw an exception while working on code near this location
+(0): error 99999: Slang compilation aborted due to an exception of class Slang::InternalError: unexpected: could not resolve target declaration for call
+
+Seems like it's the default value (=1) that leads to this crash. If we explicitly specify it's ok.
+ */
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+int reduce<let Clustering : int, let DupTest : int = 1>( int a)
+{
+ if (Clustering)
+ {
+ a = a + a;
+ }
+ if (DupTest)
+ {
+ a *= a;
+ }
+ return a;
+}
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ int index = dispatchThreadID.x;
+
+ int r = reduce<1>(index);
+
+ outputBuffer[index] = r;
+} \ No newline at end of file