diff options
| author | Yong He <yonghe@outlook.com> | 2022-06-25 13:05:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-25 13:05:35 -0700 |
| commit | 62d16a23b0ecd72dc624abd7e10b373c40adaa90 (patch) | |
| tree | 20cb95233113eb24072e605fdb9acd6f60c65fed /tests | |
| parent | 8da47c460df01fad6f1d0614210a770f4781edb1 (diff) | |
Specialize generic/existential calls within generic functions. (#2294)
* Expose internals of dce and use it to implement call graph walk.
* Specialize calls in generic functions.
* Fix clang error.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/compute/dynamic-dispatch-19.slang | 65 | ||||
| -rw-r--r-- | tests/compute/dynamic-dispatch-19.slang.expected.txt | 2 |
2 files changed, 67 insertions, 0 deletions
diff --git a/tests/compute/dynamic-dispatch-19.slang b/tests/compute/dynamic-dispatch-19.slang new file mode 100644 index 000000000..573cade82 --- /dev/null +++ b/tests/compute/dynamic-dispatch-19.slang @@ -0,0 +1,65 @@ +// Test use of unrelated generics in a dynamically dispatched generic function can be specialized. + +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_0 -use-dxil -output-using-type +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx11 -profile sm_5_0 -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type + +interface IValueGetter +{ + float get(); +} + +struct MyWrapper<T:IValueGetter> +{ + T getter; + float getVal() + { + return getter.get(); + } +} + +interface IFoo +{ + int getIntVal(int x); +} + +[anyValueSize(16)] +interface IInterface +{ + float callGetter<T:IFoo>(T foo); +} + +struct Impl : IInterface +{ + int data; + struct GetterImpl : IValueGetter { float val; float get(){return val;} } + float callGetter<T:IFoo>(T foo) + { + // We should be able to specialize `wrapper` even if it is + // used in this dynamically dispatched method. + MyWrapper<GetterImpl> wrapper; + wrapper.getter.val = 2.0f; + return wrapper.getVal() * foo.getIntVal(1); + } +}; + +struct IdentityFoo : IFoo { int getIntVal(int x) { return x; } } + +float test() +{ + IInterface obj = createDynamicObject<IInterface, uint4>(3, uint4(1,2,3,4)); + IdentityFoo foo; + // Call via dynamic dispatch + return obj.callGetter(foo); +} + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=gOutputBuffer +RWStructuredBuffer<float> gOutputBuffer; + +//TEST_INPUT: type_conformance Impl:IInterface = 3 + +[numthreads(1, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + gOutputBuffer[0] = test(); +} diff --git a/tests/compute/dynamic-dispatch-19.slang.expected.txt b/tests/compute/dynamic-dispatch-19.slang.expected.txt new file mode 100644 index 000000000..395c7d3be --- /dev/null +++ b/tests/compute/dynamic-dispatch-19.slang.expected.txt @@ -0,0 +1,2 @@ +type: float +2.0 |
