Skip to content

Commit 51a4960

Browse files
committed
Cleanups and add immutability checks.
1 parent f5a25d4 commit 51a4960

File tree

5 files changed

+116
-71
lines changed

5 files changed

+116
-71
lines changed

include/nbl/asset/ICPUDescriptorSet.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class NBL_API ICPUDescriptorSet final : public IDescriptorSet<ICPUDescriptorSetL
7878

7979
core::SRange<SDescriptorInfo> getDescriptorInfos(const ICPUDescriptorSetLayout::CBindingRedirect::binding_number_t binding, IDescriptor::E_TYPE type = IDescriptor::E_TYPE::ET_COUNT);
8080

81+
core::SRange<const SDescriptorInfo> getDescriptorInfos(const ICPUDescriptorSetLayout::CBindingRedirect::binding_number_t binding, IDescriptor::E_TYPE type = IDescriptor::E_TYPE::ET_COUNT) const;
82+
8183
core::smart_refctd_ptr<IAsset> clone(uint32_t _depth = ~0u) const override;
8284

8385
void convertToDummyObject(uint32_t referenceLevelsBelowToConvert = 0u) override;

include/nbl/video/IGPUDescriptorSet.h

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -43,77 +43,53 @@ class NBL_API IGPUDescriptorSet : public asset::IDescriptorSet<const IGPUDescrip
4343
return false;
4444
}
4545

46-
inline core::smart_refctd_ptr<asset::IDescriptor>* getAllDescriptors(const asset::IDescriptor::E_TYPE type) const
47-
{
48-
auto* baseAddress = m_pool->getDescriptorStorage(type);
49-
if (baseAddress == nullptr)
50-
return nullptr;
46+
protected:
47+
virtual ~IGPUDescriptorSet();
5148

52-
const auto offset = m_descriptorStorageOffsets.data[static_cast<uint32_t>(type)];
53-
if (offset == ~0u)
54-
return nullptr;
49+
private:
50+
friend class ILogicalDevice;
5551

56-
return baseAddress + offset;
57-
}
52+
inline void incrementVersion() { m_version.fetch_add(1ull); }
5853

59-
inline core::smart_refctd_ptr<IGPUSampler>* getAllMutableSamplers() const
54+
// TODO(achal): Don't know yet if we want to keep these.
55+
inline void processWrite(const IGPUDescriptorSet::SWriteDescriptorSet& write)
6056
{
61-
auto* baseAddress = m_pool->getMutableSamplerStorage();
62-
if (baseAddress == nullptr)
63-
return nullptr;
57+
assert(write.dstSet == this);
6458

65-
const auto poolOffset = m_descriptorStorageOffsets.data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)];
66-
if (poolOffset == ~0u)
67-
return nullptr;
59+
auto* descriptors = getDescriptors(write.descriptorType, write.binding);
60+
auto* samplers = getMutableSamplers(write.binding);
61+
for (auto j = 0; j < write.count; ++j)
62+
{
63+
descriptors[j] = write.info[j].desc;
6864

69-
return baseAddress + poolOffset;
65+
if (samplers)
66+
samplers[j] = write.info[j].info.image.sampler;
67+
}
7068
}
7169

72-
inline uint32_t getDescriptorStorageOffset(const asset::IDescriptor::E_TYPE type) const { return m_descriptorStorageOffsets.data[static_cast<uint32_t>(type)]; }
73-
inline uint32_t getMutableSamplerStorageOffset() const { return m_descriptorStorageOffsets.data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)]; }
70+
#if 0
71+
inline void processCopy(const IGPUDescriptorSet::SCopyDescriptorSet& copy)
72+
{
73+
assert(copy.dstSet == this);
7474

75-
protected:
76-
virtual ~IGPUDescriptorSet()
77-
{
78-
if (!isZombie())
75+
for (uint32_t t = 0; t < static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT); ++t)
7976
{
80-
const bool allowsFreeing = m_pool->m_flags & IDescriptorPool::ECF_FREE_DESCRIPTOR_SET_BIT;
81-
for (auto i = 0u; i < static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT); ++i)
82-
{
83-
// There is no descriptor of such type in the set.
84-
if (m_descriptorStorageOffsets.data[i] == ~0u)
85-
continue;
86-
87-
const auto type = static_cast<asset::IDescriptor::E_TYPE>(i);
88-
89-
const uint32_t allocatedOffset = getDescriptorStorageOffset(type);
90-
assert(allocatedOffset != ~0u);
91-
92-
const uint32_t count = m_layout->getTotalDescriptorCount(type);
93-
assert(count != 0u);
94-
95-
std::destroy_n(m_pool->getDescriptorStorage(type) + allocatedOffset, count);
96-
97-
if (allowsFreeing)
98-
m_pool->m_descriptorAllocators[i]->free(allocatedOffset, count);
99-
}
100-
101-
const auto mutableSamplerCount = m_layout->getTotalMutableSamplerCount();
102-
if (mutableSamplerCount > 0)
103-
{
104-
const uint32_t allocatedOffset = getMutableSamplerStorageOffset();
105-
assert(allocatedOffset != ~0u);
106-
107-
std::destroy_n(m_pool->getMutableSamplerStorage() + allocatedOffset, mutableSamplerCount);
108-
109-
if (allowsFreeing)
110-
m_pool->m_descriptorAllocators[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)]->free(allocatedOffset, mutableSamplerCount);
111-
}
112-
}
113-
}
77+
const auto type = static_cast<asset::IDescriptor::E_TYPE>(t);
11478

115-
private:
116-
friend class ILogicalDevice;
79+
auto* srcDescriptors = srcDS->getDescriptors(type, pDescriptorCopies[i].srcBinding);
80+
auto* srcSamplers = srcDS->getMutableSamplers(pDescriptorCopies[i].srcBinding);
81+
82+
auto* dstDescriptors = dstDS->getDescriptors(type, pDescriptorCopies[i].dstBinding);
83+
auto* dstSamplers = dstDS->getMutableSamplers(pDescriptorCopies[i].dstBinding);
84+
85+
if (srcDescriptors && dstDescriptors)
86+
std::copy_n(srcDescriptors, pDescriptorCopies[i].count, dstDescriptors);
87+
88+
if (srcSamplers && dstSamplers)
89+
std::copy_n(srcSamplers, pDescriptorCopies[i].count, dstSamplers);
90+
}
91+
}
92+
#endif
11793

11894
// This assumes that descriptors of a particular type in the set will always be contiguous in pool's storage memory, regardless of which binding in the set they belong to.
11995
inline core::smart_refctd_ptr<asset::IDescriptor>* getDescriptors(const asset::IDescriptor::E_TYPE type, const uint32_t binding) const
@@ -142,7 +118,34 @@ class NBL_API IGPUDescriptorSet : public asset::IDescriptorSet<const IGPUDescrip
142118
return samplers + localOffset;
143119
}
144120

145-
inline void incrementVersion() { m_version.fetch_add(1ull); }
121+
inline core::smart_refctd_ptr<asset::IDescriptor>* getAllDescriptors(const asset::IDescriptor::E_TYPE type) const
122+
{
123+
auto* baseAddress = m_pool->getDescriptorStorage(type);
124+
if (baseAddress == nullptr)
125+
return nullptr;
126+
127+
const auto offset = m_descriptorStorageOffsets.data[static_cast<uint32_t>(type)];
128+
if (offset == ~0u)
129+
return nullptr;
130+
131+
return baseAddress + offset;
132+
}
133+
134+
inline core::smart_refctd_ptr<IGPUSampler>* getAllMutableSamplers() const
135+
{
136+
auto* baseAddress = m_pool->getMutableSamplerStorage();
137+
if (baseAddress == nullptr)
138+
return nullptr;
139+
140+
const auto poolOffset = m_descriptorStorageOffsets.data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)];
141+
if (poolOffset == ~0u)
142+
return nullptr;
143+
144+
return baseAddress + poolOffset;
145+
}
146+
147+
inline uint32_t getDescriptorStorageOffset(const asset::IDescriptor::E_TYPE type) const { return m_descriptorStorageOffsets.data[static_cast<uint32_t>(type)]; }
148+
inline uint32_t getMutableSamplerStorageOffset() const { return m_descriptorStorageOffsets.data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)]; }
146149

147150
std::atomic_uint64_t m_version;
148151
const uint32_t m_parentPoolVersion;

src/nbl/asset/ICPUDescriptorSet.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ namespace nbl::asset
44
{
55

66
core::SRange<ICPUDescriptorSet::SDescriptorInfo> ICPUDescriptorSet::getDescriptorInfos(const ICPUDescriptorSetLayout::CBindingRedirect::binding_number_t binding, IDescriptor::E_TYPE type)
7+
{
8+
assert(!isImmutable_debug());
9+
auto immutableResult = const_cast<const ICPUDescriptorSet*>(this)->getDescriptorInfos(binding, type);
10+
return {const_cast<ICPUDescriptorSet::SDescriptorInfo*>(immutableResult.begin()), const_cast<ICPUDescriptorSet::SDescriptorInfo*>(immutableResult.end())};
11+
}
12+
13+
core::SRange<const ICPUDescriptorSet::SDescriptorInfo> ICPUDescriptorSet::getDescriptorInfos(const ICPUDescriptorSetLayout::CBindingRedirect::binding_number_t binding, IDescriptor::E_TYPE type) const
714
{
815
if (type == IDescriptor::E_TYPE::ET_COUNT)
916
{

src/nbl/video/IGPUDescriptorSet.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,43 @@ IGPUDescriptorSet::IGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptor
2626
std::uninitialized_default_construct_n(m_pool->getMutableSamplerStorage() + m_descriptorStorageOffsets.data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)], mutableSamplerCount);
2727
}
2828

29+
IGPUDescriptorSet::~IGPUDescriptorSet()
30+
{
31+
if (!isZombie())
32+
{
33+
const bool allowsFreeing = m_pool->m_flags & IDescriptorPool::ECF_FREE_DESCRIPTOR_SET_BIT;
34+
for (auto i = 0u; i < static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT); ++i)
35+
{
36+
// There is no descriptor of such type in the set.
37+
if (m_descriptorStorageOffsets.data[i] == ~0u)
38+
continue;
39+
40+
const auto type = static_cast<asset::IDescriptor::E_TYPE>(i);
41+
42+
const uint32_t allocatedOffset = getDescriptorStorageOffset(type);
43+
assert(allocatedOffset != ~0u);
44+
45+
const uint32_t count = m_layout->getTotalDescriptorCount(type);
46+
assert(count != 0u);
47+
48+
std::destroy_n(m_pool->getDescriptorStorage(type) + allocatedOffset, count);
49+
50+
if (allowsFreeing)
51+
m_pool->m_descriptorAllocators[i]->free(allocatedOffset, count);
52+
}
53+
54+
const auto mutableSamplerCount = m_layout->getTotalMutableSamplerCount();
55+
if (mutableSamplerCount > 0)
56+
{
57+
const uint32_t allocatedOffset = getMutableSamplerStorageOffset();
58+
assert(allocatedOffset != ~0u);
59+
60+
std::destroy_n(m_pool->getMutableSamplerStorage() + allocatedOffset, mutableSamplerCount);
61+
62+
if (allowsFreeing)
63+
m_pool->m_descriptorAllocators[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)]->free(allocatedOffset, mutableSamplerCount);
64+
}
65+
}
66+
}
67+
2968
}

src/nbl/video/ILogicalDevice.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,18 @@ bool ILogicalDevice::updateDescriptorSets(uint32_t descriptorWriteCount, const I
3434
for (auto i = 0; i < descriptorWriteCount; ++i)
3535
{
3636
auto* ds = static_cast<IGPUDescriptorSet*>(pDescriptorWrites[i].dstSet);
37-
ds->incrementVersion();
38-
39-
auto* descriptors = ds->getDescriptors(pDescriptorWrites[i].descriptorType, pDescriptorWrites[i].binding);
40-
auto* samplers = ds->getMutableSamplers(pDescriptorWrites[i].binding);
41-
for (auto j = 0; j < pDescriptorWrites[i].count; ++j)
42-
{
43-
descriptors[j] = pDescriptorWrites[i].info[j].desc;
4437

45-
if (samplers)
46-
samplers[j] = pDescriptorWrites[i].info[j].info.image.sampler;
47-
}
38+
ds->incrementVersion();
39+
ds->processWrite(pDescriptorWrites[i]);
4840
}
4941

5042
for (auto i = 0; i < descriptorCopyCount; ++i)
5143
{
5244
const auto* srcDS = static_cast<const IGPUDescriptorSet*>(pDescriptorCopies[i].srcSet);
5345
auto* dstDS = static_cast<IGPUDescriptorSet*>(pDescriptorCopies[i].dstSet);
5446

47+
// dstDS->processCopy(pDescriptorCopies[i]);
48+
5549
for (uint32_t t = 0; t < static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT); ++t)
5650
{
5751
const auto type = static_cast<asset::IDescriptor::E_TYPE>(t);

0 commit comments

Comments
 (0)