@@ -223,6 +223,28 @@ static Error parseFailed(const Twine &Msg) {
223
223
224
224
class RootSignature {
225
225
private:
226
+ struct samplers_iterator {
227
+ const RootSignature *Parent = nullptr ;
228
+ uint32_t Index = 0 ;
229
+
230
+ llvm::Expected<dxbc::RTS0::v3::StaticSampler> operator *() const {
231
+ return Parent->getSampler (Index);
232
+ }
233
+
234
+ samplers_iterator &operator ++() {
235
+ ++Index;
236
+ return *this ;
237
+ }
238
+
239
+ bool operator ==(const samplers_iterator &Other) const {
240
+ return Parent == Other.Parent && Index == Other.Index ;
241
+ }
242
+
243
+ bool operator !=(const samplers_iterator &Other) const {
244
+ return !(*this == Other);
245
+ }
246
+ };
247
+
226
248
uint32_t Version;
227
249
uint32_t NumParameters;
228
250
uint32_t RootParametersOffset;
@@ -233,23 +255,6 @@ class RootSignature {
233
255
StringRef PartData;
234
256
ViewArray<dxbc::RTS0::v1::StaticSampler> StaticSamplers;
235
257
236
- using param_header_iterator =
237
- ViewArray<dxbc::RTS0::v1::RootParameterHeader>::iterator;
238
- using samplers_iterator = ViewArray<dxbc::RTS0::v1::StaticSampler>::iterator;
239
-
240
- public:
241
- RootSignature (StringRef PD) : PartData(PD) {}
242
-
243
- LLVM_ABI Error parse ();
244
- uint32_t getVersion () const { return Version; }
245
- uint32_t getNumParameters () const { return NumParameters; }
246
- uint32_t getRootParametersOffset () const { return RootParametersOffset; }
247
- uint32_t getNumStaticSamplers () const { return NumStaticSamplers; }
248
- uint32_t getStaticSamplersOffset () const { return StaticSamplersOffset; }
249
- uint32_t getNumRootParameters () const { return ParametersHeaders.size (); }
250
- llvm::iterator_range<param_header_iterator> param_headers () const {
251
- return llvm::make_range (ParametersHeaders.begin (), ParametersHeaders.end ());
252
- }
253
258
llvm::Expected<dxbc::RTS0::v3::StaticSampler> getSampler (uint32_t Loc) const {
254
259
if (Loc >= getNumStaticSamplers ())
255
260
return parseFailed (" Static sampler index out of range" );
@@ -271,6 +276,37 @@ class RootSignature {
271
276
object_error::parse_failed);
272
277
return readParameter<dxbc::RTS0::v3::StaticSampler>(Buff);
273
278
}
279
+
280
+ using param_header_iterator =
281
+ ViewArray<dxbc::RTS0::v1::RootParameterHeader>::iterator;
282
+
283
+ public:
284
+ RootSignature (StringRef PD) : PartData(PD) {}
285
+
286
+ LLVM_ABI Error parse ();
287
+ uint32_t getVersion () const { return Version; }
288
+ uint32_t getNumParameters () const { return NumParameters; }
289
+ uint32_t getRootParametersOffset () const { return RootParametersOffset; }
290
+ uint32_t getNumStaticSamplers () const { return NumStaticSamplers; }
291
+ uint32_t getStaticSamplersOffset () const { return StaticSamplersOffset; }
292
+ uint32_t getNumRootParameters () const { return ParametersHeaders.size (); }
293
+
294
+ samplers_iterator samplers_begin () const {
295
+ return samplers_iterator{this , 0 };
296
+ }
297
+
298
+ samplers_iterator samplers_end () const {
299
+ return samplers_iterator{this , getNumStaticSamplers ()};
300
+ }
301
+
302
+ llvm::iterator_range<samplers_iterator> samplers () const {
303
+ return llvm::make_range (samplers_begin (), samplers_end ());
304
+ }
305
+
306
+ llvm::iterator_range<param_header_iterator> param_headers () const {
307
+ return llvm::make_range (ParametersHeaders.begin (), ParametersHeaders.end ());
308
+ }
309
+
274
310
uint32_t getFlags () const { return Flags; }
275
311
276
312
llvm::Expected<RootParameterView>
0 commit comments