@@ -38,8 +38,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
3838 const object::DirectX::RootSignature &Data) {
3939
4040 RootSignatureYamlDesc RootSigDesc;
41+ uint32_t Version = Data.getVersion ();
4142
42- RootSigDesc.Version = Data. getVersion () ;
43+ RootSigDesc.Version = Version ;
4344 RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers ();
4445 RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset ();
4546 RootSigDesc.NumRootParameters = Data.getNumRootParameters ();
@@ -48,13 +49,12 @@ DXContainerYAML::RootSignatureYamlDesc::create(
4849 uint32_t Flags = Data.getFlags ();
4950 for (const dxbc::RootParameterHeader &PH : Data.param_headers ()) {
5051
51- RootParameterYamlDesc NewP;
52- NewP.Offset = PH.ParameterOffset ;
53-
5452 if (!dxbc::isValidParameterType (PH.ParameterType ))
5553 return createStringError (std::errc::invalid_argument,
5654 " Invalid value for parameter type" );
5755
56+ RootParameterYamlDesc NewP (PH.ParameterType );
57+ NewP.Offset = PH.ParameterOffset ;
5858 NewP.Type = PH.ParameterType ;
5959
6060 if (!dxbc::isValidShaderVisibility (PH.ShaderVisibility ))
@@ -79,7 +79,24 @@ DXContainerYAML::RootSignatureYamlDesc::create(
7979 NewP.Constants .Num32BitValues = Constants.Num32BitValues ;
8080 NewP.Constants .ShaderRegister = Constants.ShaderRegister ;
8181 NewP.Constants .RegisterSpace = Constants.RegisterSpace ;
82+ } else if (auto *RDV =
83+ dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
84+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
85+ RDV->read (Version);
86+ if (Error E = DescriptorOrErr.takeError ())
87+ return std::move (E);
88+ auto Descriptor = *DescriptorOrErr;
89+ NewP.Descriptor .ShaderRegister = Descriptor.ShaderRegister ;
90+ NewP.Descriptor .RegisterSpace = Descriptor.RegisterSpace ;
91+ if (Version > 1 ) {
92+ #define ROOT_DESCRIPTOR_FLAG (Num, Val ) \
93+ NewP.Descriptor .Val = \
94+ (Descriptor.Flags & \
95+ llvm::to_underlying (dxbc::RootDescriptorFlag::Val)) > 0 ;
96+ #include " llvm/BinaryFormat/DXContainerConstants.def"
97+ }
8298 }
99+
83100 RootSigDesc.Parameters .push_back (NewP);
84101 }
85102#define ROOT_ELEMENT_FLAG (Num, Val ) \
@@ -89,6 +106,15 @@ DXContainerYAML::RootSignatureYamlDesc::create(
89106 return RootSigDesc;
90107}
91108
109+ uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags () const {
110+ uint64_t Flag = 0 ;
111+ #define ROOT_DESCRIPTOR_FLAG (Num, Val ) \
112+ if (Val) \
113+ Flag |= (uint32_t )dxbc::RootDescriptorFlag::Val;
114+ #include " llvm/BinaryFormat/DXContainerConstants.def"
115+ return Flag;
116+ }
117+
92118uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags () {
93119 uint64_t Flag = 0 ;
94120#define ROOT_ELEMENT_FLAG (Num, Val ) \
@@ -276,6 +302,14 @@ void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
276302 IO.mapRequired (" ShaderRegister" , C.ShaderRegister );
277303}
278304
305+ void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
306+ IO &IO, llvm::DXContainerYAML::RootDescriptorYaml &D) {
307+ IO.mapRequired (" RegisterSpace" , D.RegisterSpace );
308+ IO.mapRequired (" ShaderRegister" , D.ShaderRegister );
309+ #define ROOT_DESCRIPTOR_FLAG (Num, Val ) IO.mapOptional(#Val, D.Val, false );
310+ #include " llvm/BinaryFormat/DXContainerConstants.def"
311+ }
312+
279313void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
280314 IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
281315 IO.mapRequired (" ParameterType" , P.Type );
@@ -285,6 +319,11 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
285319 case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit):
286320 IO.mapRequired (" Constants" , P.Constants );
287321 break ;
322+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
323+ case llvm::to_underlying (dxbc::RootParameterType::SRV):
324+ case llvm::to_underlying (dxbc::RootParameterType::UAV):
325+ IO.mapRequired (" Descriptor" , P.Descriptor );
326+ break ;
288327 }
289328}
290329
0 commit comments