diff --git a/test/M3/RootSignatures/Defaults.test b/test/M3/RootSignatures/Defaults.test new file mode 100644 index 000000000..ac3463605 --- /dev/null +++ b/test/M3/RootSignatures/Defaults.test @@ -0,0 +1,94 @@ +#--- source.hlsl + +cbuffer RootConstants : register(b0) { + float4 C; +}; + +struct Input { + float4 A; + float4 B; +}; + +struct Output { + float4 A; +}; + +StructuredBuffer In : register(t0); +RWStructuredBuffer Out1 : register(u1); +RWStructuredBuffer Out2 : register(u2); + +// Root signature to sanity test the default values that are given to optional +// parameters (`space = 0`, `offset = DESCRIPTOR_RANGE_OFFSET_APPEND`, etc) + +#define RootSig \ + "RootConstants(num32BitConstants = 4, b0), " \ + "DescriptorTable( " \ + " SRV(t0), " \ + " UAV(u1) " \ + "), " \ + "UAV(u2) " + +[RootSignature(RootSig)] +[numthreads(1,1,1)] +void main(uint GI : SV_GroupIndex) { + Out1[GI].A = In[GI].A * In[GI].B * C; + Out2[GI].A = In[GI].A * In[GI].B * C * 2; +} + +//--- pipeline.yaml +--- +Shaders: + - Stage: Compute + Entry: main + DispatchSize: [1, 1, 1] +RuntimeSettings: + DirectX: + RootParameters: + - Kind: Constant + Name: Root + - Kind: DescriptorTable + - Kind: RootDescriptor + Resource: + Name: Out2 + Kind: RWStructuredBuffer +Buffers: + - Name: Root + Format: Float32 + Data: [ 2, 4, 6, 8 ] + - Name: In + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: Out1 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 + - Name: Out2 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 +DescriptorSets: + - Resources: + - Name: In + Kind: StructuredBuffer + DirectXBinding: + Register: 0 + Space: 0 + - Name: Out1 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 +... +#--- end + +# UNSUPPORTED: Clang + +# RUN: split-file %s %t +# RUN: %dxc_target -T cs_6_0 -Fo %t.o %t/source.hlsl +# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s + +# CHECK-LABEL: Name: Out1 +# CHECK: Data: [ 40, 192, 504, 1024 ] +# CHECK-LABEL: Name: Out2 +# CHECK: Data: [ 80, 384, 1008, 2048 ] diff --git a/test/M3/RootSignatures/Flags.test b/test/M3/RootSignatures/Flags.test new file mode 100644 index 000000000..deee95ee6 --- /dev/null +++ b/test/M3/RootSignatures/Flags.test @@ -0,0 +1,104 @@ +#--- source.hlsl + +struct Input { + float4 A; + float4 B; +}; + +struct Output { + float4 A; +}; + +StructuredBuffer In : register(t0); +StructuredBuffer InExtra : register(t1); +RWStructuredBuffer Out1 : register(u1); +RWStructuredBuffer Out2 : register(u2); + +// Root signature to test specifying various flags: +// - Edge-case value of '0' +// - Demonstrate setting of non-sampler root flags +// - Demonstrate setting of all descriptor flags +// - Demonstrate '|' of applicable flags + +#define RootSig \ + "RootFlags( " \ + " ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | " \ + " CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | " \ + " ALLOW_STREAM_OUTPUT " \ + "), " \ + "DescriptorTable( " \ + " SRV(t0, flags = DATA_STATIC), " \ + " SRV(t1, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE), " \ + " UAV(u1, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE), " \ + " UAV(u2, flags = 0)" \ + ")" + +[RootSignature(RootSig)] +[numthreads(1,1,1)] +void main(uint GI : SV_GroupIndex) { + Out1[GI].A = In[GI].A * InExtra[GI].B; + Out2[GI].A = In[GI].A * InExtra[GI].B * 2; +} + +//--- pipeline.yaml +--- +Shaders: + - Stage: Compute + Entry: main + DispatchSize: [1, 1, 1] +RuntimeSettings: + DirectX: + RootParameters: + - Kind: DescriptorTable +Buffers: + - Name: In + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: InExtra + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: Out1 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 + - Name: Out2 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 +DescriptorSets: + - Resources: + - Name: In + Kind: StructuredBuffer + DirectXBinding: + Register: 0 + Space: 0 + - Name: InExtra + Kind: StructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 + - Name: Out1 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 + - Name: Out2 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 2 + Space: 0 +... +#--- end + +# UNSUPPORTED: Clang + +# RUN: split-file %s %t +# RUN: %dxc_target -T cs_6_0 -Fo %t.o %t/source.hlsl +# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s + +# CHECK-LABEL: Name: Out1 +# CHECK: Data: [ 20, 48, 84, 128 ] +# CHECK-LABEL: Name: Out2 +# CHECK: Data: [ 40, 96, 168, 256 ] diff --git a/test/M3/RootSignatures/ManualDescriptors.test b/test/M3/RootSignatures/ManualDescriptors.test new file mode 100644 index 000000000..1470858ac --- /dev/null +++ b/test/M3/RootSignatures/ManualDescriptors.test @@ -0,0 +1,100 @@ +#--- source.hlsl + +struct Input { + float4 A; + float4 B; +}; + +struct Output { + float4 A; +}; + +StructuredBuffer In : register(t0); +StructuredBuffer InExtra : register(t1); +RWStructuredBuffer Out1 : register(u1); +RWStructuredBuffer Out2 : register(u2); + +// Root signature to test manual `offset` and `numDescriptor` specification: +// - Demonstrate manually describing the offsets and numDescriptors +// - Edge-case value of `offset` = `DESCRIPTOR_RANGE_OFFSET_APPEND` +// - Edge-case value of `numDescriptors` = `unbounded` + +#define RootSig \ + "DescriptorTable( " \ + " UAV(u2, offset = 3, numDescriptors = unbounded), " \ + " SRV(t0, offset = 0, numDescriptors = 2), " \ + " UAV(u1, " \ + " offset = DESCRIPTOR_RANGE_OFFSET_APPEND, " \ + " numDescriptors = 1 " \ + " ) " \ + ")" + +[RootSignature(RootSig)] +[numthreads(1,1,1)] +void main(uint GI : SV_GroupIndex) { + Out1[GI].A = In[GI].A * InExtra[GI].B; + Out2[GI].A = In[GI].A * InExtra[GI].B * 2; +} + +//--- pipeline.yaml +--- +Shaders: + - Stage: Compute + Entry: main + DispatchSize: [1, 1, 1] +RuntimeSettings: + DirectX: + RootParameters: + - Kind: DescriptorTable +Buffers: + - Name: In + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: InExtra + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: Out1 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 + - Name: Out2 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 +DescriptorSets: + - Resources: + - Name: In + Kind: StructuredBuffer + DirectXBinding: + Register: 0 + Space: 0 + - Name: InExtra + Kind: StructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 + - Name: Out1 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 + - Name: Out2 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 2 + Space: 0 +... +#--- end + +# UNSUPPORTED: Clang + +# RUN: split-file %s %t +# RUN: %dxc_target -T cs_6_0 -Fo %t.o %t/source.hlsl +# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s + +# CHECK-LABEL: Name: Out1 +# CHECK: Data: [ 20, 48, 84, 128 ] +# CHECK-LABEL: Name: Out2 +# CHECK: Data: [ 40, 96, 168, 256 ] diff --git a/test/M3/RootSignatures/NumberParameters.test b/test/M3/RootSignatures/NumberParameters.test new file mode 100644 index 000000000..851d09949 --- /dev/null +++ b/test/M3/RootSignatures/NumberParameters.test @@ -0,0 +1,99 @@ +#--- source.hlsl + +cbuffer RootConstants : register(b0) { + float4 C; +}; + +struct Input { + float4 A; + float4 B; +}; + +struct Output { + float4 A; +}; + +StructuredBuffer In : register(t4294967294); +RWStructuredBuffer Out1 : register(u1, space4294967279); +RWStructuredBuffer Out2 : register(u2); + +// Root signature to test edge-cases of specify number arguments: +// - Maximum valid register value (0xfffffffe = 4294967294) +// - Maximum valid register space value (0x7fffffff = 2147483647) +// - Maximum valid num32BitConstants value +// (61 = 64 - # of used DWORDS for other params) +// - Using (un)signed integer parameter values + + +#define RootSig \ + "RootConstants(num32BitConstants = +61, b0), " \ + "DescriptorTable( " \ + " SRV(t4294967294), " \ + " UAV(u1, space = 4294967279) " \ + "), " \ + "UAV(u2) " + +[RootSignature(RootSig)] +[numthreads(1,1,1)] +void main(uint GI : SV_GroupIndex) { + Out1[GI].A = In[GI].A * In[GI].B * C; + Out2[GI].A = In[GI].A * In[GI].B * C * 2; +} + +//--- pipeline.yaml +--- +Shaders: + - Stage: Compute + Entry: main + DispatchSize: [1, 1, 1] +RuntimeSettings: + DirectX: + RootParameters: + - Kind: Constant + Name: Root + - Kind: DescriptorTable + - Kind: RootDescriptor + Resource: + Name: Out2 + Kind: RWStructuredBuffer +Buffers: + - Name: Root + Format: Float32 + Data: [ 2, 4, 6, 8 ] + - Name: In + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: Out1 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 + - Name: Out2 + Format: Float32 + Channels: 4 + ZeroInitSize: 16 +DescriptorSets: + - Resources: + - Name: In + Kind: StructuredBuffer + DirectXBinding: + Register: 4294967294 + Space: 0 + - Name: Out1 + Kind: RWStructuredBuffer + DirectXBinding: + Register: 1 + Space: 4294967279 +... +#--- end + +# UNSUPPORTED: Clang + +# RUN: split-file %s %t +# RUN: %dxc_target -T cs_6_0 -Fo %t.o %t/source.hlsl +# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s + +# CHECK-LABEL: Name: Out1 +# CHECK: Data: [ 40, 192, 504, 1024 ] +# CHECK-LABEL: Name: Out2 +# CHECK: Data: [ 80, 384, 1008, 2048 ] diff --git a/test/M3/RootSignatures/ParameterInsensitivity.test b/test/M3/RootSignatures/ParameterInsensitivity.test new file mode 100644 index 000000000..a121765ae --- /dev/null +++ b/test/M3/RootSignatures/ParameterInsensitivity.test @@ -0,0 +1,85 @@ +#--- source.hlsl + +cbuffer RootConstants : register(b0, space2) { + float4 C; +}; + +struct Input { + float4 A; + float4 B; +}; + +struct Output { + float4 A; +}; + +StructuredBuffer In : register(t0); +RWStructuredBuffer Out : register(u1); + +// Root signature to demonstrate: +// - All keywords and enums are case in-sensitive +// - Registers are case sensitive +// - Mandatory and optional arguments can be specified in any order + +#define RootSig \ + "rootflags(allow_input_assembler_input_layout)," \ + "rootconstants(space = 2, b0, num32bitconstants = 4), " \ + "DESCRIPTORTABLE( " \ + " SRV(FLAGS = DATA_STATIC, t0, SPACE = 0), " \ + " VisibilitY = ShadeR_VisibilitY_AlL, " \ + " uav(u1, NumDescriptors = UNBOUNDED) " \ + ")" + +[RootSignature(RootSig)] +[numthreads(1,1,1)] +void main(uint GI : SV_GroupIndex) { + Out[GI].A = In[GI].A * In[GI].B * C; +} + +//--- pipeline.yaml +--- +Shaders: + - Stage: Compute + Entry: main + DispatchSize: [1, 1, 1] +RuntimeSettings: + DirectX: + RootParameters: + - Kind: Constant + Name: Root + - Kind: DescriptorTable +Buffers: + - Name: Root + Format: Float32 + Data: [ 2, 4, 6, 8 ] + - Name: In + Format: Float32 + Stride: 32 + Data: [ 2, 4, 6, 8, 10, 12, 14, 16] + - Name: Out + Format: Float32 + Channels: 4 + ZeroInitSize: 16 +DescriptorSets: + - Resources: + - Name: In + Kind: StructuredBuffer + DirectXBinding: + Register: 0 + Space: 0 + - Name: Out + Kind: RWStructuredBuffer + DirectXBinding: + Register: 1 + Space: 0 +... +#--- end + +# UNSUPPORTED: Clang + +# RUN: split-file %s %t +# RUN: %dxc_target -T cs_6_0 -Fo %t.o %t/source.hlsl +# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s + +# CHECK-LABEL: Name: Out +# CHECK: Data: [ 40, 192, 504, 1024 ]