diff options
Diffstat (limited to 'tests/compute/interface-shader-param2.slang')
| -rw-r--r-- | tests/compute/interface-shader-param2.slang | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/compute/interface-shader-param2.slang b/tests/compute/interface-shader-param2.slang new file mode 100644 index 000000000..039765084 --- /dev/null +++ b/tests/compute/interface-shader-param2.slang @@ -0,0 +1,103 @@ +// interface-shader-param2.slang + +// This test builds on `interface-shader-param.slang` by using +// concrete types that have data within them, instead of +// just empty types. + +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute + +// A lot of the setup is the same as for `interface-shader-param`, +// so look there if you want the comments. + +interface IRandomNumberGenerator +{ + [mutating] + int randomInt(); +} + +interface IRandomNumberGenerationStrategy +{ + associatedtype Generator : IRandomNumberGenerator; + Generator makeGenerator(int seed); +} + +interface IModifier +{ + int modify(int val); +} + +int test( + int seed, + IRandomNumberGenerationStrategy inStrategy, + IModifier modifier) +{ + let strategy = inStrategy; + var generator = strategy.makeGenerator(seed); + let unused = generator.randomInt(); + let val = generator.randomInt(); + let modifiedVal = modifier.modify(val); + return modifiedVal; +} + + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):dxbinding(0),glbinding(0),out +RWStructuredBuffer<int> gOutputBuffer; + +//TEST_INPUT:cbuffer(data=[1 0 0 0], stride=4):dxbinding(0),glbinding(1) +ConstantBuffer<IRandomNumberGenerationStrategy> gStrategy; + +[numthreads(4, 1, 1)] +void computeMain( + +//TEST_INPUT:cbuffer(data=[8 0 0 0], stride=4):dxbinding(1),glbinding(2) + uniform IModifier modifier, + uint3 dispatchThreadID : SV_DispatchThreadID) +{ + let tid = dispatchThreadID.x; + + let inputVal : int = tid; + let outputVal = test(inputVal, gStrategy, modifier); + + gOutputBuffer[tid] = outputVal; +} + +// Okay, now we get to the part that is unique starting +// in this test: we add data to the concrete types +// that we will use as parameters. + +struct MyStrategy : IRandomNumberGenerationStrategy +{ + int globalSeed; + + struct Generator : IRandomNumberGenerator + { + int state; + + [mutating] + int randomInt() + { + return state++; + } + } + + Generator makeGenerator(int seed) + { + Generator generator = { seed ^ globalSeed }; + return generator; + } +} + +struct MyModifier : IModifier +{ + int localModifier; + + int modify(int val) + { + return val ^ localModifier; + } +} + +//TEST_INPUT: globalExistentialType MyStrategy +//TEST_INPUT: entryPointExistentialType MyModifier |
