Skip to content

Commit 1d0cbd3

Browse files
committed
adding samplers_iterator
1 parent 13d945d commit 1d0cbd3

File tree

3 files changed

+56
-21
lines changed

3 files changed

+56
-21
lines changed

llvm/include/llvm/Object/DXContainer.h

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,28 @@ static Error parseFailed(const Twine &Msg) {
223223

224224
class RootSignature {
225225
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+
226248
uint32_t Version;
227249
uint32_t NumParameters;
228250
uint32_t RootParametersOffset;
@@ -233,23 +255,6 @@ class RootSignature {
233255
StringRef PartData;
234256
ViewArray<dxbc::RTS0::v1::StaticSampler> StaticSamplers;
235257

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-
}
253258
llvm::Expected<dxbc::RTS0::v3::StaticSampler> getSampler(uint32_t Loc) const {
254259
if (Loc >= getNumStaticSamplers())
255260
return parseFailed("Static sampler index out of range");
@@ -271,6 +276,37 @@ class RootSignature {
271276
object_error::parse_failed);
272277
return readParameter<dxbc::RTS0::v3::StaticSampler>(Buff);
273278
}
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+
274310
uint32_t getFlags() const { return Flags; }
275311

276312
llvm::Expected<RootParameterView>

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
163163
}
164164
}
165165

166-
for (uint32_t Loc = 0; Loc < Data.getNumStaticSamplers(); ++Loc) {
167-
llvm::Expected<dxbc::RTS0::v3::StaticSampler> MaybeSampler =
168-
Data.getSampler(Loc);
166+
for (llvm::Expected<dxbc::RTS0::v3::StaticSampler> MaybeSampler :
167+
Data.samplers()) {
169168
if (Error E = MaybeSampler.takeError())
170169
return std::move(E);
171170
const llvm::dxbc::RTS0::v3::StaticSampler &S = *MaybeSampler;

llvm/unittests/Object/DXContainerTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ TEST(RootSignature, ParseStaticSamplers) {
11841184
ASSERT_EQ(RS.getStaticSamplersOffset(), 24u);
11851185
ASSERT_EQ(RS.getFlags(), 17u);
11861186

1187-
auto MaybeSamplerView = RS.getSampler(0);
1187+
auto MaybeSamplerView = *RS.samplers().begin();
11881188
ASSERT_THAT_ERROR(MaybeSamplerView.takeError(), Succeeded());
11891189
const auto &Sampler = *MaybeSamplerView;
11901190

0 commit comments

Comments
 (0)