@@ -120,9 +120,10 @@ template <typename T> struct ViewArray {
120120namespace DirectX {
121121struct RootParameterView {
122122 const dxbc::RootParameterHeader &Header;
123+ uint32_t Version;
123124 StringRef ParamData;
124- RootParameterView (const dxbc::RootParameterHeader &H, StringRef P)
125- : Header(H), ParamData(P) {}
125+ RootParameterView (uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
126+ : Header(H), Version(V), ParamData(P) {}
126127
127128 template <typename T> Expected<T> readParameter () {
128129 T Struct;
@@ -149,6 +150,38 @@ struct RootConstantView : RootParameterView {
149150 }
150151};
151152
153+ struct RootDescriptorView_V1_0 : RootParameterView {
154+ static bool classof (const RootParameterView *V) {
155+ return (V->Version == 1 &&
156+ (V->Header .ParameterType ==
157+ llvm::to_underlying (dxbc::RootParameterType::CBV) ||
158+ V->Header .ParameterType ==
159+ llvm::to_underlying (dxbc::RootParameterType::SRV) ||
160+ V->Header .ParameterType ==
161+ llvm::to_underlying (dxbc::RootParameterType::UAV)));
162+ }
163+
164+ llvm::Expected<dxbc::RST0::v0::RootDescriptor> read () {
165+ return readParameter<dxbc::RST0::v0::RootDescriptor>();
166+ }
167+ };
168+
169+ struct RootDescriptorView_V1_1 : RootParameterView {
170+ static bool classof (const RootParameterView *V) {
171+ return (V->Version == 2 &&
172+ (V->Header .ParameterType ==
173+ llvm::to_underlying (dxbc::RootParameterType::CBV) ||
174+ V->Header .ParameterType ==
175+ llvm::to_underlying (dxbc::RootParameterType::SRV) ||
176+ V->Header .ParameterType ==
177+ llvm::to_underlying (dxbc::RootParameterType::UAV)));
178+ }
179+
180+ llvm::Expected<dxbc::RST0::v1::RootDescriptor> read () {
181+ return readParameter<dxbc::RST0::v1::RootDescriptor>();
182+ }
183+ };
184+
152185static Error parseFailed (const Twine &Msg) {
153186 return make_error<GenericBinaryError>(Msg.str (), object_error::parse_failed);
154187}
@@ -192,6 +225,14 @@ class RootSignature {
192225 case dxbc::RootParameterType::Constants32Bit:
193226 DataSize = sizeof (dxbc::RootConstants);
194227 break ;
228+ case dxbc::RootParameterType::CBV:
229+ case dxbc::RootParameterType::SRV:
230+ case dxbc::RootParameterType::UAV:
231+ if (Version == 1 )
232+ DataSize = sizeof (dxbc::RST0::v0::RootDescriptor);
233+ else
234+ DataSize = sizeof (dxbc::RST0::v1::RootDescriptor);
235+ break ;
195236 }
196237 size_t EndOfSectionByte = getNumStaticSamplers () == 0
197238 ? PartData.size ()
@@ -201,7 +242,7 @@ class RootSignature {
201242 return parseFailed (" Reading structure out of file bounds" );
202243
203244 StringRef Buff = PartData.substr (Header.ParameterOffset , DataSize);
204- RootParameterView View = RootParameterView (Header, Buff);
245+ RootParameterView View = RootParameterView (Version, Header, Buff);
205246 return View;
206247 }
207248};
0 commit comments