@@ -36,12 +36,13 @@ class RootSignatureBindingValidation {
3636 MapT CRegBindingsMap;
3737 MapT TRegBindingsMap;
3838 MapT URegBindingsMap;
39+ MapT SamplersBindingsMap;
3940
4041 void addRange (const dxbc::RTS0::v2::RootDescriptor &Desc, uint32_t Type) {
4142 assert ((Type == llvm::to_underlying (dxbc::RootParameterType::CBV) ||
4243 Type == llvm::to_underlying (dxbc::RootParameterType::SRV) ||
4344 Type == llvm::to_underlying (dxbc::RootParameterType::UAV)) &&
44- " Invalid Type" );
45+ " Invalid Type in add Range Method " );
4546
4647 llvm::dxil::ResourceInfo::ResourceBinding Binding;
4748 Binding.LowerBound = Desc.ShaderRegister ;
@@ -53,19 +54,20 @@ class RootSignatureBindingValidation {
5354 uint64_t HighRange = combineUint32ToUint64 (
5455 Binding.Space , Binding.LowerBound + Binding.Size - 1 );
5556
57+ assert (LowRange <= HighRange && " Invalid range configuration" );
58+
5659 switch (Type) {
5760
5861 case llvm::to_underlying (dxbc::RootParameterType::CBV):
5962 CRegBindingsMap.insert (LowRange, HighRange, Binding);
60- return ;
63+ break ;
6164 case llvm::to_underlying (dxbc::RootParameterType::SRV):
6265 TRegBindingsMap.insert (LowRange, HighRange, Binding);
63- return ;
66+ break ;
6467 case llvm::to_underlying (dxbc::RootParameterType::UAV):
6568 URegBindingsMap.insert (LowRange, HighRange, Binding);
66- return ;
69+ break ;
6770 }
68- llvm_unreachable (" Invalid Type in add Range Method" );
6971 }
7072
7173 void addRange (const dxbc::RTS0::v2::DescriptorRange &Range) {
@@ -80,33 +82,59 @@ class RootSignatureBindingValidation {
8082 uint64_t HighRange = combineUint32ToUint64 (
8183 Binding.Space , Binding.LowerBound + Binding.Size - 1 );
8284
85+ assert (LowRange <= HighRange && " Invalid range configuration" );
86+
8387 switch (Range.RangeType ) {
8488 case llvm::to_underlying (dxbc::DescriptorRangeType::CBV):
8589 CRegBindingsMap.insert (LowRange, HighRange, Binding);
86- return ;
90+ break ;
8791 case llvm::to_underlying (dxbc::DescriptorRangeType::SRV):
8892 TRegBindingsMap.insert (LowRange, HighRange, Binding);
89- return ;
93+ break ;
9094 case llvm::to_underlying (dxbc::DescriptorRangeType::UAV):
9195 URegBindingsMap.insert (LowRange, HighRange, Binding);
92- return ;
96+ break ;
97+ case llvm::to_underlying (dxbc::DescriptorRangeType::Sampler):
98+ SamplersBindingsMap.insert (LowRange, HighRange, Binding);
99+ break ;
93100 }
94- llvm_unreachable (" Invalid Type in add Range Method" );
95101 }
96102
97103public:
98104 RootSignatureBindingValidation ()
99105 : Allocator(), CRegBindingsMap(Allocator), TRegBindingsMap(Allocator),
100- URegBindingsMap (Allocator) {}
106+ URegBindingsMap (Allocator), SamplersBindingsMap(Allocator) {}
101107
102108 void addRsBindingInfo (mcdxbc::RootSignatureDesc &RSD,
103109 dxbc::ShaderVisibility Visibility);
104110
105- bool checkCregBinding (dxil::ResourceInfo::ResourceBinding Binding);
111+ bool checkCRegBinding (dxil::ResourceInfo::ResourceBinding Binding) {
112+ return CRegBindingsMap.overlaps (
113+ combineUint32ToUint64 (Binding.Space , Binding.LowerBound ),
114+ combineUint32ToUint64 (Binding.Space ,
115+ Binding.LowerBound + Binding.Size - 1 ));
116+ }
106117
107- bool checkTRegBinding (dxil::ResourceInfo::ResourceBinding Binding);
118+ bool checkTRegBinding (dxil::ResourceInfo::ResourceBinding Binding) {
119+ return TRegBindingsMap.overlaps (
120+ combineUint32ToUint64 (Binding.Space , Binding.LowerBound ),
121+ combineUint32ToUint64 (Binding.Space ,
122+ Binding.LowerBound + Binding.Size - 1 ));
123+ }
108124
109- bool checkURegBinding (dxil::ResourceInfo::ResourceBinding Binding);
125+ bool checkURegBinding (dxil::ResourceInfo::ResourceBinding Binding) {
126+ return URegBindingsMap.overlaps (
127+ combineUint32ToUint64 (Binding.Space , Binding.LowerBound ),
128+ combineUint32ToUint64 (Binding.Space ,
129+ Binding.LowerBound + Binding.Size - 1 ));
130+ }
131+
132+ bool checkSamplerBinding (dxil::ResourceInfo::ResourceBinding Binding) {
133+ return SamplersBindingsMap.overlaps (
134+ combineUint32ToUint64 (Binding.Space , Binding.LowerBound ),
135+ combineUint32ToUint64 (Binding.Space ,
136+ Binding.LowerBound + Binding.Size - 1 ));
137+ }
110138};
111139
112140class DXILPostOptimizationValidation
0 commit comments