Skip to content

Commit 165eebc

Browse files
author
kevyuu
committed
Implement visitDependents
1 parent 1707b84 commit 165eebc

21 files changed

+171
-2
lines changed

include/nbl/asset/IAsset.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,25 @@ class IAsset : virtual public core::IReferenceCounted
156156
//!
157157
inline bool isMutable() const {return m_mutable;}
158158

159+
inline void visitDependents(std::function<bool(const IAsset*)> visit) const
160+
{
161+
visitDependentsImpl([&visit](const IAsset* dep)->bool
162+
{
163+
if (dep)
164+
return visit(dep);
165+
return true;
166+
});
167+
}
168+
169+
inline void visitDependents(std::function<bool(IAsset*)> visit)
170+
{
171+
assert(isMutable());
172+
visitDependents([&](const IAsset* dependent) -> bool
173+
{
174+
return visit(const_cast<IAsset*>(dependent));
175+
});
176+
}
177+
159178
virtual core::unordered_set<const IAsset*> computeDependants() const = 0;
160179

161180
virtual core::unordered_set<IAsset*> computeDependants() = 0;
@@ -174,6 +193,8 @@ class IAsset : virtual public core::IReferenceCounted
174193
private:
175194
friend IAssetManager;
176195
bool m_mutable = true;
196+
197+
virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const = 0;
177198
};
178199

179200
template<typename T>

include/nbl/asset/ICPUAccelerationStructure.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class ICPUBottomLevelAccelerationStructure final : public IPreHashed, public IBo
135135
return cp;
136136
}
137137

138+
138139
// Do not report anything as a dependant, we'll simply drop the data instead of discarding its contents
139140
inline core::unordered_set<const IAsset*> computeDependants() const override
140141
{
@@ -257,6 +258,8 @@ class ICPUBottomLevelAccelerationStructure final : public IPreHashed, public IBo
257258
core::smart_refctd_dynamic_array<AABBs<ICPUBuffer>> m_AABBGeoms = nullptr;
258259
core::smart_refctd_dynamic_array<uint32_t> m_geometryPrimitiveCount = nullptr;
259260
core::bitflag<BUILD_FLAGS> m_buildFlags = BUILD_FLAGS::PREFER_FAST_TRACE_BIT;
261+
262+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override {}
260263
};
261264

262265
class ICPUTopLevelAccelerationStructure final : public IAsset, public ITopLevelAccelerationStructure
@@ -386,6 +389,12 @@ class ICPUTopLevelAccelerationStructure final : public IAsset, public ITopLevelA
386389
for (const auto& instance : *self->m_instances)
387390
dependants.insert(instance.getBase().blas.get());
388391
return dependants;
392+
}
393+
394+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
395+
{
396+
for (const auto& instance : *m_instances)
397+
if (!visit(instance.getBase().blas.get())) return;
389398
}
390399
};
391400

include/nbl/asset/ICPUAnimationLibrary.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ class ICPUAnimationLibrary final : public IAnimationLibrary<ICPUBuffer>, public
113113
static auto computeDependantsImpl(Self* self) {
114114
using asset_ptr_t = std::conditional_t<std::is_const_v<Self>, const IAsset*, IAsset*>;
115115
return core::unordered_set<asset_ptr_t>{ self->m_keyframeStorageBinding.buffer.get(), self->m_timestampStorageBinding.buffer.get(), self->m_animationStorageRange.buffer.get() };
116+
}
117+
118+
virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
119+
{
120+
if (!visit(m_keyframeStorageBinding.buffer.get())) return;
121+
if (!visit(m_timestampStorageBinding.buffer.get())) return;
122+
if (!visit(m_animationStorageRange.buffer.get())) return;
116123
}
117124
};
118125

include/nbl/asset/ICPUBuffer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ class ICPUBuffer final : public asset::IBuffer, public IPreHashed
139139
discardContent_impl();
140140
}
141141

142+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override {}
143+
142144
void* m_data;
143145
core::smart_refctd_ptr<core::refctd_memory_resource> m_mem_resource;
144146
size_t m_alignment;

include/nbl/asset/ICPUBufferView.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class ICPUBufferView : public IBufferView<ICPUBuffer>, public IAsset
2828
constexpr static inline auto AssetType = ET_BUFFER_VIEW;
2929
inline IAsset::E_TYPE getAssetType() const override { return AssetType; }
3030

31+
3132
inline core::unordered_set<const IAsset*> computeDependants() const override
3233
{
3334
return computeDependantsImpl(this);
@@ -66,6 +67,11 @@ class ICPUBufferView : public IBufferView<ICPUBuffer>, public IAsset
6667
using asset_ptr_t = std::conditional_t<std::is_const_v<Self>, const IAsset*, IAsset*>;
6768
return core::unordered_set<asset_ptr_t>{ self->m_buffer.get() };
6869
}
70+
71+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
72+
{
73+
if (!visit(m_buffer.get())) return;
74+
}
6975
};
7076

7177
}

include/nbl/asset/ICPUComputePipeline.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ class ICPUComputePipeline final : public ICPUPipeline<IComputePipeline<ICPUPipel
105105
using asset_ptr_t = std::conditional_t<std::is_const_v<Self>, const IAsset*, IAsset*>;
106106
return core::unordered_set<asset_ptr_t>{ self->m_layout.get(), self->m_specInfo.shader.get() };
107107
}
108+
109+
virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
110+
{
111+
if (!visit(m_layout.get())) return;
112+
if (!visit(m_specInfo.shader.get())) return;
113+
}
108114
};
109115

110116
}

include/nbl/asset/ICPUDescriptorSet.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,35 @@ class NBL_API2 ICPUDescriptorSet final : public IDescriptorSet<ICPUDescriptorSet
127127
}
128128
return dependants;
129129
}
130+
131+
virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
132+
{
133+
for (auto i = 0u; i < static_cast<uint32_t>(IDescriptor::E_TYPE::ET_COUNT); i++)
134+
{
135+
if (!m_descriptorInfos[i]) continue;
136+
const auto size = m_descriptorInfos[i]->size();
137+
for (auto desc_i = 0u; desc_i < size; desc_i++)
138+
{
139+
auto* desc = m_descriptorInfos[i]->operator[](desc_i).desc.get();
140+
if (!desc) continue;
141+
switch (IDescriptor::GetTypeCategory(static_cast<IDescriptor::E_TYPE>(i)))
142+
{
143+
case IDescriptor::EC_BUFFER:
144+
if (!visit(static_cast<const ICPUBuffer*>(desc))) return;
145+
case IDescriptor::EC_SAMPLER:
146+
if (!visit(static_cast<const ICPUSampler*>(desc))) return;
147+
case IDescriptor::EC_IMAGE:
148+
if (!visit(static_cast<const ICPUImageView*>(desc))) return;
149+
case IDescriptor::EC_BUFFER_VIEW:
150+
if (!visit(static_cast<ICPUBufferView*>(desc))) return;
151+
case IDescriptor::EC_ACCELERATION_STRUCTURE:
152+
if (!visit(static_cast<ICPUTopLevelAccelerationStructure*>(desc))) return;
153+
default:
154+
break;
155+
}
156+
}
157+
}
158+
}
130159
};
131160

132161
}

include/nbl/asset/ICPUDescriptorSetLayout.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ class ICPUDescriptorSetLayout : public IDescriptorSetLayout<ICPUSampler>, public
8585
return dependants;
8686
}
8787

88+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
89+
{
90+
if (m_immutableSamplers) return;
91+
for (const auto& sampler : *m_immutableSamplers)
92+
if (!visit(sampler.get())) return;
93+
}
8894
};
8995

9096
}

include/nbl/asset/ICPUGraphicsPipeline.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ class ICPUGraphicsPipeline final : public ICPUPipeline<IGraphicsPipeline<ICPUPip
146146

147147
return core::smart_refctd_ptr<base_t>(newPipeline, core::dont_grab);
148148
}
149+
150+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
151+
{
152+
if (!visit(m_layout.get())) return;
153+
if (!visit(m_renderpass.get())) return;
154+
for (const auto& info : m_specInfos)
155+
if (!visit(info.shader.get())) return;
156+
}
149157
};
150158

151159
}

include/nbl/asset/ICPUImage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ class NBL_API2 ICPUImage final : public IImage, public IPreHashed
227227
return _a.imageSubresource.mipLevel < _b.imageSubresource.mipLevel;
228228
}
229229
};
230+
231+
inline virtual void visitDependentsImpl(std::function<bool(const IAsset*)> visit) const override
232+
{
233+
}
230234
};
231235

232236
} // end namespace nbl::asset

0 commit comments

Comments
 (0)