2323#include " llvm/Support/MemoryBufferRef.h"
2424#include " llvm/TargetParser/Triple.h"
2525#include < array>
26+ #include < cstddef>
27+ #include < cstdint>
28+ #include < memory>
2629#include < variant>
2730
2831namespace llvm {
@@ -127,99 +130,132 @@ struct RootParameter {
127130 RootParameter () = default ;
128131};
129132
130- struct ViewRootParameter {
131- ViewArray<dxbc::RootParameterHeader> HeaderView;
132- StringRef Data;
133-
134- ViewRootParameter () = default ;
135- ViewRootParameter (ViewArray<dxbc::RootParameterHeader> HV, StringRef D)
136- : HeaderView(HV), Data(D) {}
137-
138- using value_type = DirectX::RootParameter;
139- struct iterator {
140- const ViewArray<dxbc::RootParameterHeader> HeaderView;
141- ViewArray<dxbc::RootParameterHeader>::iterator Current;
142- StringRef Data;
143-
144- iterator (const ViewRootParameter &VRP,
145- ViewArray<dxbc::RootParameterHeader>::iterator C)
146- : HeaderView(VRP.HeaderView), Current(C), Data(VRP.Data) {}
147- iterator (const iterator &) = default ;
148-
149- template <typename T>
150- static Error readParameter (StringRef Buffer, const char *Src, T &Struct) {
151- // Don't read before the beginning or past the end of the file
152- if (Src < Buffer.begin () || Src + sizeof (T) > Buffer.end ())
153- return make_error<GenericBinaryError>(
154- " Reading structure out of file bounds" , object_error::parse_failed);
155-
156- memcpy (&Struct, Src, sizeof (T));
157- // DXContainer is always little endian
158- if (sys::IsBigEndianHost)
159- Struct.swapBytes ();
160- return Error::success ();
161- }
162-
163- static Error validationFailed (const Twine &Msg) {
164- return make_error<StringError>(Msg.str (), inconvertibleErrorCode ());
165- }
166-
167- llvm::Expected<value_type> operator *() {
168- value_type Parameter;
169- std::memset (&Parameter.Header , 0 , sizeof (dxbc::RootParameterHeader));
170- memcpy (&Parameter.Header , Current.Current ,
171- sizeof (dxbc::RootParameterHeader));
172-
173- switch (Parameter.Header .ParameterType ) {
174- case dxbc::RootParameterType::Constants32Bit:
175- std::memset (&Parameter.Constants , 0 , sizeof (dxbc::RootConstants));
176- if (Error Err = readParameter (
177- Data, Data.begin () + Parameter.Header .ParameterOffset ,
178- Parameter.Constants ))
179- return Err;
180- break ;
181- }
182-
183- return Parameter;
184- }
185-
186- iterator operator ++() {
187- if (Current != HeaderView.end ())
188- Current++;
189- return *this ;
190- }
191-
192- iterator operator ++(int I) {
193- iterator Tmp = *this ;
194- for (; I > 0 ; I--)
195- ++Tmp;
196- return Tmp;
197- }
198-
199- iterator operator --() {
200- if (Current != HeaderView.begin ())
201- Current--;
202- return *this ;
203- }
204-
205- iterator operator --(int I) {
206- iterator Tmp = *this ;
207- for (; I > 0 ; I--)
208- --Tmp;
209- return Tmp;
210- }
211-
212- bool operator ==(iterator I) { return I.Current == Current; }
213- bool operator !=(const iterator I) { return !(*this == I); }
214- };
215-
216- iterator begin () const { return iterator (*this , this ->HeaderView .begin ()); }
217-
218- iterator end () const { return iterator (*this , this ->HeaderView .end ()); }
133+ // struct ViewRootParameter {
134+ // ViewArray<dxbc::RootParameterHeader> HeaderView;
135+ // StringRef Data;
136+
137+ // ViewRootParameter() = default;
138+ // ViewRootParameter(ViewArray<dxbc::RootParameterHeader> HV, StringRef D)
139+ // : HeaderView(HV), Data(D) {}
140+
141+ // using value_type = DirectX::RootParameter;
142+ // struct iterator {
143+ // const ViewArray<dxbc::RootParameterHeader> HeaderView;
144+ // ViewArray<dxbc::RootParameterHeader>::iterator Current;
145+ // StringRef Data;
146+
147+ // iterator(const ViewRootParameter &VRP,
148+ // ViewArray<dxbc::RootParameterHeader>::iterator C)
149+ // : HeaderView(VRP.HeaderView), Current(C), Data(VRP.Data) {}
150+ // iterator(const iterator &) = default;
151+
152+ // template <typename T>
153+ // static Error readParameter(StringRef Buffer, const char *Src, T &Struct)
154+ // {
155+ // // Don't read before the beginning or past the end of the file
156+ // if (Src < Buffer.begin() || Src + sizeof(T) > Buffer.end())
157+ // return make_error<GenericBinaryError>(
158+ // "Reading structure out of file bounds",
159+ // object_error::parse_failed);
160+
161+ // memcpy(&Struct, Src, sizeof(T));
162+ // // DXContainer is always little endian
163+ // if (sys::IsBigEndianHost)
164+ // Struct.swapBytes();
165+ // return Error::success();
166+ // }
167+
168+ // static Error validationFailed(const Twine &Msg) {
169+ // return make_error<StringError>(Msg.str(), inconvertibleErrorCode());
170+ // }
171+
172+ // llvm::Expected<value_type> operator*() {
173+ // value_type Parameter;
174+ // std::memset(&Parameter.Header, 0, sizeof(dxbc::RootParameterHeader));
175+ // memcpy(&Parameter.Header, Current.Current,
176+ // sizeof(dxbc::RootParameterHeader));
177+
178+ // switch (Parameter.Header.ParameterType) {
179+ // case dxbc::RootParameterType::Constants32Bit:
180+ // std::memset(&Parameter.Constants, 0, sizeof(dxbc::RootConstants));
181+ // if (Error Err = readParameter(
182+ // Data, Data.begin() + Parameter.Header.ParameterOffset,
183+ // Parameter.Constants))
184+ // return Err;
185+ // break;
186+ // }
187+
188+ // return Parameter;
189+ // }
190+
191+ // iterator operator++() {
192+ // if (Current != HeaderView.end())
193+ // Current++;
194+ // return *this;
195+ // }
196+
197+ // iterator operator++(int I) {
198+ // iterator Tmp = *this;
199+ // for (; I > 0; I--)
200+ // ++Tmp;
201+ // return Tmp;
202+ // }
203+
204+ // iterator operator--() {
205+ // if (Current != HeaderView.begin())
206+ // Current--;
207+ // return *this;
208+ // }
209+
210+ // iterator operator--(int I) {
211+ // iterator Tmp = *this;
212+ // for (; I > 0; I--)
213+ // --Tmp;
214+ // return Tmp;
215+ // }
216+
217+ // bool operator==(iterator I) { return I.Current == Current; }
218+ // bool operator!=(const iterator I) { return !(*this == I); }
219+ // };
220+
221+ // iterator begin() const { return iterator(*this, this->HeaderView.begin());
222+ // }
223+
224+ // iterator end() const { return iterator(*this, this->HeaderView.end()); }
225+
226+ // size_t size() const { return HeaderView.size(); }
227+
228+ // bool isEmpty() const { return HeaderView.isEmpty(); }
229+ // };
230+
231+ struct RootParameterView {
232+ const dxbc::RootParameterHeader &Header;
233+ StringRef ParamData;
234+ RootParameterView (const dxbc::RootParameterHeader &H, StringRef P)
235+ : Header(H), ParamData(P) {}
236+
237+ template <typename T> Expected<T> readParameter () {
238+ T Struct;
239+ if (sizeof (T) > ParamData.size ())
240+ return make_error<GenericBinaryError>(
241+ " Reading structure out of file bounds" , object_error::parse_failed);
242+
243+ memcpy (&Struct, ParamData.data (), sizeof (T));
244+ // DXContainer is always little endian
245+ if (sys::IsBigEndianHost)
246+ Struct.swapBytes ();
247+ return Struct;
248+ }
249+ };
219250
220- size_t size () const { return HeaderView.size (); }
251+ struct RootConstantView : RootParameterView {
252+ static bool classof (const RootParameterView *V) {
253+ return V->Header .ParameterType == dxbc::RootParameterType::Constants32Bit;
254+ }
221255
222- bool isEmpty () const { return HeaderView.isEmpty (); }
256+ llvm::Expected<dxbc::RootConstants> read () {
257+ return readParameter<dxbc::RootConstants>();
258+ }
223259};
224260
225261class RootSignature {
@@ -231,9 +267,11 @@ class RootSignature {
231267 uint32_t StaticSamplersOffset = 0 ;
232268 uint32_t Flags = 0 ;
233269
234- ViewRootParameter Parameters;
270+ ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
271+ size_t ParameterSpaceOffset;
272+ StringRef ParameterSpace;
235273
236- using param_iterator = ViewRootParameter ::iterator;
274+ using param_header_iterator = ViewArray<dxbc::RootParameterHeader> ::iterator;
237275
238276public:
239277 RootSignature () {}
@@ -244,12 +282,34 @@ class RootSignature {
244282 uint32_t getRootParametersOffset () const { return RootParametersOffset; }
245283 uint32_t getNumStaticSamplers () const { return NumStaticSamplers; }
246284 uint32_t getStaticSamplersOffset () const { return StaticSamplersOffset; }
247- llvm::iterator_range<param_iterator> params () const {
248- return llvm::make_range (Parameters.begin (), Parameters.end ());
285+ llvm::iterator_range<param_header_iterator> param_header () const {
286+ return llvm::make_range (ParametersHeaders.begin (), ParametersHeaders.end ());
287+ }
288+ param_header_iterator param_header_begin () {
289+ return ParametersHeaders.begin ();
249290 }
250- param_iterator param_begin () { return Parameters.begin (); }
251- param_iterator param_end () { return Parameters.end (); }
291+ param_header_iterator param_header_end () { return ParametersHeaders.end (); }
252292 uint32_t getFlags () const { return Flags; }
293+ RootParameterView
294+ getParameter (const dxbc::RootParameterHeader &Header) const {
295+ size_t CorrectOffset = Header.ParameterOffset - ParameterSpaceOffset;
296+ StringRef Data;
297+
298+ size_t DataSize = 0 ;
299+
300+ switch (Header.ParameterType ) {
301+ case dxbc::RootParameterType::Constants32Bit:
302+ DataSize = sizeof (dxbc::RootConstants);
303+ if (CorrectOffset + DataSize > ParameterSpace.size ()) {
304+ // throw
305+ }
306+ Data = ParameterSpace.substr (CorrectOffset, DataSize);
307+ break ;
308+ }
309+
310+ RootParameterView View = RootParameterView (Header, Data);
311+ return View;
312+ }
253313};
254314
255315class PSVRuntimeInfo {
0 commit comments