23
23
#include " llvm/Support/MemoryBufferRef.h"
24
24
#include " llvm/TargetParser/Triple.h"
25
25
#include < array>
26
+ #include < cstddef>
27
+ #include < cstdint>
28
+ #include < memory>
26
29
#include < variant>
27
30
28
31
namespace llvm {
@@ -127,99 +130,132 @@ struct RootParameter {
127
130
RootParameter () = default ;
128
131
};
129
132
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
+ };
219
250
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
+ }
221
255
222
- bool isEmpty () const { return HeaderView.isEmpty (); }
256
+ llvm::Expected<dxbc::RootConstants> read () {
257
+ return readParameter<dxbc::RootConstants>();
258
+ }
223
259
};
224
260
225
261
class RootSignature {
@@ -231,9 +267,11 @@ class RootSignature {
231
267
uint32_t StaticSamplersOffset = 0 ;
232
268
uint32_t Flags = 0 ;
233
269
234
- ViewRootParameter Parameters;
270
+ ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
271
+ size_t ParameterSpaceOffset;
272
+ StringRef ParameterSpace;
235
273
236
- using param_iterator = ViewRootParameter ::iterator;
274
+ using param_header_iterator = ViewArray<dxbc::RootParameterHeader> ::iterator;
237
275
238
276
public:
239
277
RootSignature () {}
@@ -244,12 +282,34 @@ class RootSignature {
244
282
uint32_t getRootParametersOffset () const { return RootParametersOffset; }
245
283
uint32_t getNumStaticSamplers () const { return NumStaticSamplers; }
246
284
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 ();
249
290
}
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 (); }
252
292
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
+ }
253
313
};
254
314
255
315
class PSVRuntimeInfo {
0 commit comments