From 6aca3813c4ccc496c0f9b2db293acb546aa11d2d Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 1 Nov 2023 21:42:12 -0700 Subject: Parameter binding and gfx fixes. (#3302) * Parameter binding and gfx fixes. * Add diagnostics on entry point parameters. * Fix. --------- Co-authored-by: Yong He --- tests/bindings/nested-parameter-block-2.slang | 42 +++++++++++++++++ .../generics/generic-shader-object-cbuffer.slang | 53 ++++++++++++++++++++++ .../generics/generic-shader-object-cbuffer2.slang | 46 +++++++++++++++++++ .../generics/generic-shader-object.slang | 48 ++++++++++++++++++++ tests/reflection/default-space.slang.expected | 4 +- ...mix-explicit-and-implicit-spaces.slang.expected | 12 ++--- .../parameter-block-explicit-space.slang.expected | 8 ++-- tests/reflection/parameter-block.slang.2.expected | 4 +- tests/reflection/parameter-block.slang.expected | 4 +- tests/reflection/unbounded-arrays.hlsl.1.expected | 2 +- 10 files changed, 206 insertions(+), 17 deletions(-) create mode 100644 tests/bindings/nested-parameter-block-2.slang create mode 100644 tests/language-feature/generics/generic-shader-object-cbuffer.slang create mode 100644 tests/language-feature/generics/generic-shader-object-cbuffer2.slang create mode 100644 tests/language-feature/generics/generic-shader-object.slang (limited to 'tests') diff --git a/tests/bindings/nested-parameter-block-2.slang b/tests/bindings/nested-parameter-block-2.slang new file mode 100644 index 000000000..38ce9232e --- /dev/null +++ b/tests/bindings/nested-parameter-block-2.slang @@ -0,0 +1,42 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -use-dxil -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type +// nested-parameter-block-2.slang + +struct CB +{ + uint4 value; +} + +struct MaterialSystem +{ + CB cb; + RWStructuredBuffer data; +} + +struct Scene +{ + CB sceneCb; + RWStructuredBuffer data; + ParameterBlock material; +} + +//TEST_INPUT: set scene = new Scene { { {1,2,3,4} }, ubuffer(data=[1 2 3 4], stride=4), new MaterialSystem {{ {1,2,3,4} }, ubuffer(data=[1 2 3 4], stride=4)} } +ParameterBlock scene; + +struct MyBuffer +{ + RWStructuredBuffer resultBuffer; +} +//TEST_INPUT: set pb2 = new MyBuffer { out ubuffer(data=[0 0 0 0], stride=4) } +ParameterBlock pb2; + +// Main entry-point. Applies the transformation encoded by `transformer` +// to all elements in `buffer`. +[shader("compute")] +[numthreads(4,1,1)] +void computeMain(uint3 sv_dispatchThreadID : SV_DispatchThreadID) +{ + // CHECK: 4 + pb2.resultBuffer[sv_dispatchThreadID.x] = scene.sceneCb.value.x + scene.data[0].x + scene.material.cb.value.x + scene.material.data[0].x; +} diff --git a/tests/language-feature/generics/generic-shader-object-cbuffer.slang b/tests/language-feature/generics/generic-shader-object-cbuffer.slang new file mode 100644 index 000000000..eaaca7097 --- /dev/null +++ b/tests/language-feature/generics/generic-shader-object-cbuffer.slang @@ -0,0 +1,53 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d11 -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -shaderobj -output-using-type -use-dxil +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu -shaderobj -output-using-type + +interface IFoo +{ + float getVal(); +} +interface IElement +{ + float getElementVal(); +} + +struct Elem : IElement +{ + float x; + float getElementVal() + { + return x; + } +} + +struct Impl : IFoo +{ + float v1; + RWStructuredBuffer buffer0; + RWStructuredBuffer buffer1; + + float getVal() + { + return buffer0[0].getElementVal() + buffer1[0].getElementVal() + v1; + } +} + +//TEST_INPUT:set cparams = new Params { new Impl{2.0, ubuffer(data=[1.0], stride = 4), ubuffer(data=[2.0], stride = 4)}, 1.0, ubuffer(data=[1.0], stride=4) } +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer + +struct Params +{ + ParameterBlock> gFoo; + float v; + RWStructuredBuffer buffer; +} + +ConstantBuffer cparams; +RWStructuredBuffer outputBuffer; +[numthreads(1, 1, 1)] +void computeMain() +{ + // CHECK: 7.0 + outputBuffer[0] = cparams.gFoo.getVal() + cparams.v + cparams.buffer[0]; +} diff --git a/tests/language-feature/generics/generic-shader-object-cbuffer2.slang b/tests/language-feature/generics/generic-shader-object-cbuffer2.slang new file mode 100644 index 000000000..57b175418 --- /dev/null +++ b/tests/language-feature/generics/generic-shader-object-cbuffer2.slang @@ -0,0 +1,46 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d11 -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -shaderobj -output-using-type -use-dxil +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu -shaderobj -output-using-type + +interface IFoo +{ + float getVal(); +} +interface IElement +{ + float getElementVal(); +} + +struct Elem : IElement +{ + float x; + float getElementVal() + { + return x; + } +} + +struct Impl : IFoo +{ + float v1; + RWStructuredBuffer buffer0; + RWStructuredBuffer buffer1; + + float getVal() + { + return buffer0[0].getElementVal() + buffer1[0].getElementVal() + v1; + } +} +//TEST_INPUT:set gFoo = new Impl{2.0, ubuffer(data=[1.0], stride = 4), ubuffer(data=[2.0], stride = 4)} +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +//TEST_INPUT:set v = 1.0; + +[numthreads(1, 1, 1)] +void computeMain(uniform ParameterBlock> gFoo, + uniform float v, + uniform RWStructuredBuffer outputBuffer) +{ + // CHECK: 6.0 + outputBuffer[0] = gFoo.getVal() + v; +} diff --git a/tests/language-feature/generics/generic-shader-object.slang b/tests/language-feature/generics/generic-shader-object.slang new file mode 100644 index 000000000..746a0d0a7 --- /dev/null +++ b/tests/language-feature/generics/generic-shader-object.slang @@ -0,0 +1,48 @@ +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d11 -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -shaderobj -output-using-type -use-dxil +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu -shaderobj -output-using-type + +interface IFoo +{ + float getVal(); +} +interface IElement +{ + float getElementVal(); +} + +struct Elem : IElement +{ + float x; + float getElementVal() + { + return x; + } +} + +struct Impl : IFoo +{ + RWStructuredBuffer buffer0; + RWStructuredBuffer buffer1; + + float getVal() + { + return buffer0[0].getElementVal() + buffer1[0].getElementVal(); + } +} + +//TEST_INPUT:set gFoo = new Impl{ubuffer(data=[1.0], stride = 4), ubuffer(data=[2.0], stride = 4)} +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer +//TEST_INPUT:set v = 1.0; + +[numthreads(1, 1, 1)] +void computeMain( + uniform ParameterBlock> gFoo, + uniform float v, + uniform RWStructuredBuffer outputBuffer +) +{ + // CHECK: 4.0 + outputBuffer[0] = gFoo.getVal() + v; +} diff --git a/tests/reflection/default-space.slang.expected b/tests/reflection/default-space.slang.expected index 5ba17790c..2667ae96e 100644 --- a/tests/reflection/default-space.slang.expected +++ b/tests/reflection/default-space.slang.expected @@ -14,7 +14,7 @@ standard output = { }, { "name": "b", - "binding": {"kind": "registerSpace", "index": 0}, + "binding": {"kind": "subElementRegisterSpace", "index": 0}, "type": { "kind": "parameterBlock", "elementType": { @@ -32,7 +32,7 @@ standard output = { ] }, "containerVarLayout": { - "binding": {"kind": "registerSpace", "index": 0} + "binding": {"kind": "subElementRegisterSpace", "index": 0} }, "elementVarLayout": { "type": { diff --git a/tests/reflection/mix-explicit-and-implicit-spaces.slang.expected b/tests/reflection/mix-explicit-and-implicit-spaces.slang.expected index 63fe23551..36943df02 100644 --- a/tests/reflection/mix-explicit-and-implicit-spaces.slang.expected +++ b/tests/reflection/mix-explicit-and-implicit-spaces.slang.expected @@ -6,7 +6,7 @@ standard output = { "parameters": [ { "name": "a", - "binding": {"kind": "registerSpace", "index": 0}, + "binding": {"kind": "subElementRegisterSpace", "index": 0}, "type": { "kind": "parameterBlock", "elementType": { @@ -26,7 +26,7 @@ standard output = { "containerVarLayout": { "bindings": [ {"kind": "constantBuffer", "index": 0}, - {"kind": "registerSpace", "index": 0} + {"kind": "subElementRegisterSpace", "index": 0} ] }, "elementVarLayout": { @@ -50,7 +50,7 @@ standard output = { }, { "name": "b", - "binding": {"kind": "registerSpace", "index": 1}, + "binding": {"kind": "subElementRegisterSpace", "index": 1}, "type": { "kind": "parameterBlock", "elementType": { @@ -70,7 +70,7 @@ standard output = { "containerVarLayout": { "bindings": [ {"kind": "constantBuffer", "index": 0}, - {"kind": "registerSpace", "index": 0} + {"kind": "subElementRegisterSpace", "index": 0} ] }, "elementVarLayout": { @@ -94,7 +94,7 @@ standard output = { }, { "name": "c", - "binding": {"kind": "registerSpace", "index": 2}, + "binding": {"kind": "subElementRegisterSpace", "index": 2}, "type": { "kind": "parameterBlock", "elementType": { @@ -114,7 +114,7 @@ standard output = { "containerVarLayout": { "bindings": [ {"kind": "constantBuffer", "index": 0}, - {"kind": "registerSpace", "index": 0} + {"kind": "subElementRegisterSpace", "index": 0} ] }, "elementVarLayout": { diff --git a/tests/reflection/parameter-block-explicit-space.slang.expected b/tests/reflection/parameter-block-explicit-space.slang.expected index 1aa41519d..6a0c1467a 100644 --- a/tests/reflection/parameter-block-explicit-space.slang.expected +++ b/tests/reflection/parameter-block-explicit-space.slang.expected @@ -6,7 +6,7 @@ standard output = { "parameters": [ { "name": "a", - "binding": {"kind": "registerSpace", "index": 2}, + "binding": {"kind": "subElementRegisterSpace", "index": 2}, "type": { "kind": "parameterBlock", "elementType": { @@ -53,7 +53,7 @@ standard output = { "containerVarLayout": { "bindings": [ {"kind": "constantBuffer", "index": 0}, - {"kind": "registerSpace", "index": 0} + {"kind": "subElementRegisterSpace", "index": 0} ] }, "elementVarLayout": { @@ -108,7 +108,7 @@ standard output = { }, { "name": "b", - "binding": {"kind": "registerSpace", "index": 3}, + "binding": {"kind": "subElementRegisterSpace", "index": 3}, "type": { "kind": "parameterBlock", "elementType": { @@ -147,7 +147,7 @@ standard output = { "containerVarLayout": { "bindings": [ {"kind": "constantBuffer", "index": 0}, - {"kind": "registerSpace", "index": 0} + {"kind": "subElementRegisterSpace", "index": 0} ] }, "elementVarLayout": { diff --git a/tests/reflection/parameter-block.slang.2.expected b/tests/reflection/parameter-block.slang.2.expected index e4bf9b6cb..fdcc428e9 100644 --- a/tests/reflection/parameter-block.slang.2.expected +++ b/tests/reflection/parameter-block.slang.2.expected @@ -6,7 +6,7 @@ standard output = { "parameters": [ { "name": "a", - "binding": {"kind": "registerSpace", "index": 1}, + "binding": {"kind": "subElementRegisterSpace", "index": 1}, "type": { "kind": "parameterBlock", "elementType": { @@ -31,7 +31,7 @@ standard output = { ] }, "containerVarLayout": { - "binding": {"kind": "registerSpace", "index": 0} + "binding": {"kind": "subElementRegisterSpace", "index": 0} }, "elementVarLayout": { "type": { diff --git a/tests/reflection/parameter-block.slang.expected b/tests/reflection/parameter-block.slang.expected index 0909dc8cf..1d0feaa77 100644 --- a/tests/reflection/parameter-block.slang.expected +++ b/tests/reflection/parameter-block.slang.expected @@ -6,7 +6,7 @@ standard output = { "parameters": [ { "name": "a", - "binding": {"kind": "registerSpace", "index": 1}, + "binding": {"kind": "subElementRegisterSpace", "index": 1}, "type": { "kind": "parameterBlock", "elementType": { @@ -31,7 +31,7 @@ standard output = { ] }, "containerVarLayout": { - "binding": {"kind": "registerSpace", "index": 0} + "binding": {"kind": "subElementRegisterSpace", "index": 0} }, "elementVarLayout": { "type": { diff --git a/tests/reflection/unbounded-arrays.hlsl.1.expected b/tests/reflection/unbounded-arrays.hlsl.1.expected index 60d894ba7..daa1cb789 100644 --- a/tests/reflection/unbounded-arrays.hlsl.1.expected +++ b/tests/reflection/unbounded-arrays.hlsl.1.expected @@ -65,7 +65,7 @@ standard output = { }, { "name": "ee", - "binding": {"kind": "registerSpace", "index": 3, "count": 2}, + "binding": {"kind": "subElementRegisterSpace", "index": 3, "count": 2}, "type": { "kind": "array", "elementCount": 0, -- cgit v1.2.3