summaryrefslogtreecommitdiff
path: root/tests/compute/interface-local.slang
diff options
context:
space:
mode:
Diffstat (limited to 'tests/compute/interface-local.slang')
-rw-r--r--tests/compute/interface-local.slang48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/compute/interface-local.slang b/tests/compute/interface-local.slang
new file mode 100644
index 000000000..d3ee88062
--- /dev/null
+++ b/tests/compute/interface-local.slang
@@ -0,0 +1,48 @@
+// interface-local.slang
+
+// Test basic use of an interface as an existential type
+// for a local variable, instead of just as a constraint
+// on a generic type parameter.
+//
+// Because the existential is created and then used inside
+// the same function, we can eliminate it via simple
+// local optimizations.
+
+// on a generic type parameter.
+
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
+
+interface IHelper
+{
+ int getVal();
+}
+
+struct HelperImpl : IHelper
+{
+ int storedVal;
+
+ int getVal() { return storedVal; }
+}
+
+int test(int val)
+{
+ HelperImpl helperImpl = { val };
+
+ IHelper existentialHelper = helperImpl;
+
+ return existentialHelper.getVal();
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):dxbinding(0),glbinding(0),out
+RWStructuredBuffer<int> gOutputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ uint tid = dispatchThreadID.x;
+ int inputVal = tid;
+ int outputVal = test(inputVal);
+ gOutputBuffer[tid] = outputVal;
+} \ No newline at end of file