Skip to content

Commit 9c10e07

Browse files
simplify metadata memory allocations and reduce LoC in the API
1 parent b23e2b8 commit 9c10e07

File tree

15 files changed

+97
-99
lines changed

15 files changed

+97
-99
lines changed

examples_tests/06.MeshLoaders/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ int main()
9292

9393
size_t neededDS1UBOsz = 0ull;
9494
{
95-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
95+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
9696
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
9797
neededDS1UBOsz = std::max<size_t>(neededDS1UBOsz, shdrIn.descriptorSection.uniformBufferObject.relByteoffset+shdrIn.descriptorSection.uniformBufferObject.bytesize);
9898
}
@@ -140,7 +140,7 @@ int main()
140140
camera->render();
141141

142142
core::vector<uint8_t> uboData(gpuubo->getSize());
143-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
143+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
144144
{
145145
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
146146
{

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,12 @@ int main()
383383
break;
384384
}
385385

386-
386+
//scene bound
387+
core::aabbox3df sceneBound(FLT_MAX,FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX);
387388
//point lights
388389
core::vector<SLight> lights;
389-
core::vector<const ext::MitsubaLoader::IMeshMetadata*> meshmetas;
390-
meshmetas.reserve(cpumeshes.size());
391390
for (const auto& cpumesh : cpumeshes)
392391
{
393-
meshmetas.push_back(static_cast<const ext::MitsubaLoader::IMeshMetadata*>(cpumesh->getMetadata()));
394-
const auto& instances = meshmetas.back()->getInstances();
395-
396392
auto computeAreaAndAvgPos = [](const asset::ICPUMeshBuffer* mb, const core::matrix3x4SIMD& tform, core::vectorSIMDf& _outAvgPos) {
397393
uint32_t triCount = 0u;
398394
asset::IMeshManipulator::getPolyCount(triCount, mb);
@@ -422,18 +418,25 @@ int main()
422418

423419
return 0.5f*core::length(differentialElementCrossProdcut).x;
424420
};
425-
for (const auto& inst : instances)
421+
422+
const auto* mesh_meta = static_cast<const ext::MitsubaLoader::CMitsubaMetadata::CMesh*>(globalMeta->getAssetSpecificMetadata(cpumesh.get()));
423+
const auto instances = mesh_meta->getInstances();
424+
for (size_t i=0u; i<instances.size(); i++)
426425
{
427-
if (inst.emitter.type==ext::MitsubaLoader::CElementEmitter::AREA)
426+
const auto& inst = instances.begin()[i];
427+
for (const auto& inst : instances)
428+
sceneBound.addInternalBox(core::transformBoxEx(cpumesh->getBoundingBox(),inst.worldTform));
429+
const auto& aux = mesh_meta->m_instanceAuxData->operator[](i);
430+
if (aux.emitter.type==ext::MitsubaLoader::CElementEmitter::AREA)
428431
{
429432
core::vectorSIMDf pos;
430433
assert(cpumesh->getMeshBuffers().size()==1u);
431-
const float area = computeAreaAndAvgPos(cpumesh->getMeshBuffers().begin()[0], inst.tform, pos);
434+
const float area = computeAreaAndAvgPos(cpumesh->getMeshBuffers().begin()[0], inst.worldTform, pos);
432435
assert(area>0.f);
433-
inst.tform.pseudoMulWith4x1(pos);
436+
inst.worldTform.pseudoMulWith4x1(pos);
434437

435438
SLight l;
436-
l.intensity = inst.emitter.area.radiance*area*2.f*core::PI<float>();
439+
l.intensity = aux.emitter.area.radiance*area*2.f*core::PI<float>();
437440
l.position = pos;
438441

439442
lights.push_back(l);
@@ -482,26 +485,10 @@ int main()
482485
}
483486
modifiedShaders.clear();
484487

485-
core::aabbox3df sceneBound;
486-
auto gpumeshes = driver->getGPUObjectsFromAssets(cpumeshes.data(), cpumeshes.data()+cpumeshes.size());
487-
{
488-
auto metait = meshmetas.begin();
489-
for (auto gpuit = gpumeshes->begin(); gpuit != gpumeshes->end(); gpuit++, metait++)
490-
{
491-
auto* meta = *metait;
492-
const auto* meshmeta = static_cast<const ext::MitsubaLoader::IMeshMetadata*>(meta);
493-
const auto& instances = meshmeta->getInstances();
494488

495-
auto bb = (*gpuit)->getBoundingBox();
496-
for (const auto& inst : instances)
497-
{
498-
sceneBound.addInternalBox(core::transformBoxEx(bb, inst.tform));
499-
}
500-
}
501-
}
489+
auto gpumeshes = driver->getGPUObjectsFromAssets(cpumeshes.data(), cpumeshes.data()+cpumeshes.size());
502490

503491
auto gpuds0 = driver->getGPUObjectsFromAssets(&cpuds0.get(), &cpuds0.get()+1)->front();
504-
505492
auto gpuds1layout = driver->getGPUObjectsFromAssets(&ds1layout, &ds1layout+1)->front();
506493

507494
auto gpuubo = driver->createDeviceLocalGPUBufferOnDedMem(sizeof(asset::SBasicViewParameters));

examples_tests/20.Megatexture/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ int main()
446446

447447
size_t neededDS1UBOsz = 0ull;
448448
{
449-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
449+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
450450
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
451451
neededDS1UBOsz = std::max<size_t>(neededDS1UBOsz, shdrIn.descriptorSection.uniformBufferObject.relByteoffset+shdrIn.descriptorSection.uniformBufferObject.bytesize);
452452
}
@@ -518,7 +518,7 @@ int main()
518518
camera->render();
519519

520520
core::vector<uint8_t> uboData(gpuubo->getSize());
521-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
521+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
522522
{
523523
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
524524
{

examples_tests/21.DynamicTextureIndexing/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ int main()
5757

5858
asset::IAssetLoader::SAssetLoadParams lp;
5959
auto meshes_bundle = am->getAsset("sponza.obj", lp);
60-
assert(!meshes_bundle.isEmpty());
60+
assert(!meshes_bundle.getContents().empty());
6161
auto mesh = meshes_bundle.getContents().begin()[0];
6262
auto mesh_raw = static_cast<asset::ICPUMesh*>(mesh.get());
6363

examples_tests/44.LevelCurveExtraction/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ int main()
465465

466466
size_t neededDS1UBOsz = 0ull;
467467
{
468-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
468+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
469469
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
470470
neededDS1UBOsz = std::max<size_t>(neededDS1UBOsz, shdrIn.descriptorSection.uniformBufferObject.relByteoffset+shdrIn.descriptorSection.uniformBufferObject.bytesize);
471471
}
@@ -545,7 +545,7 @@ int main()
545545

546546

547547
core::vector<uint8_t> uboData(gpuubo->getSize());
548-
for (const auto& shdrIn : pipelineMetadata->getRequiredShaderInputs())
548+
for (const auto& shdrIn : pipelineMetadata->m_inputSemantics)
549549
{
550550
if (shdrIn.descriptorSection.type==asset::IRenderpassIndependentPipelineMetadata::ShaderInput::ET_UNIFORM_BUFFER && shdrIn.descriptorSection.uniformBufferObject.set==1u && shdrIn.descriptorSection.uniformBufferObject.binding==ds1UboBinding)
551551
{

include/nbl/asset/interchange/IRenderpassIndependentPipelineLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class IRenderpassIndependentPipelineLoader : public IAssetLoader
2222

2323
protected:
2424
IAssetManager* m_assetMgr;
25-
core::smart_refctd_ptr<IRenderpassIndependentPipelineMetadata::semantics_container_t> m_basicViewParamsSemantics;
25+
core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_basicViewParamsSemantics;
2626

2727
inline IRenderpassIndependentPipelineLoader(IAssetManager* _am) : m_assetMgr(_am) {}
2828
virtual ~IRenderpassIndependentPipelineLoader() = 0;

include/nbl/asset/metadata/CMTLMetadata.h

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,28 @@ class CMTLMetadata final : public IAssetMetadata
8989
static_assert(sizeof(SMaterialParameters) == 128ull, "Something went wrong");
9090

9191

92-
using IRenderpassIndependentPipelineMetadata::IRenderpassIndependentPipelineMetadata;
92+
CRenderpassIndependentPipeline() : IRenderpassIndependentPipelineMetadata(), m_descriptorSet3(), m_materialParams(), m_name(), m_hash(0xdeadbeefu) {}
93+
CRenderpassIndependentPipeline(CRenderpassIndependentPipeline&& other)
94+
{
95+
operator=(std::move(other));
96+
}
97+
CRenderpassIndependentPipeline(
98+
core::SRange<const ShaderInputSemantic>&& _inputSemantics,
99+
core::smart_refctd_ptr<ICPUDescriptorSet>&& _descriptorSet3,
100+
const SMaterialParameters& _materialParams,
101+
std::string&& _name, const uint32_t _hash) :
102+
IRenderpassIndependentPipelineMetadata(std::move(_inputSemantics)),
103+
m_descriptorSet3(std::move(_descriptorSet3)), m_materialParams(_materialParams),
104+
m_name(std::move(_name)), m_hash(_hash)
105+
{
106+
}
93107

94108
inline CRenderpassIndependentPipeline& operator=(CRenderpassIndependentPipeline&& other)
95109
{
96110
IRenderpassIndependentPipelineMetadata::operator=(std::move(other));
111+
std::swap(m_descriptorSet3,other.m_descriptorSet3);
112+
std::swap(m_materialParams,other.m_materialParams);
113+
std::swap(m_name,other.m_name);
97114
std::swap(m_hash,other.m_hash);
98115
return *this;
99116
}
@@ -108,7 +125,8 @@ class CMTLMetadata final : public IAssetMetadata
108125
uint32_t m_hash;
109126
};
110127

111-
CMTLMetadata(uint32_t pplnCount) : IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(pplnCount))
128+
CMTLMetadata(uint32_t pplnCount, core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage) :
129+
IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(pplnCount)), m_semanticStorage(std::move(_semanticStorage))
112130
{
113131
}
114132

@@ -124,22 +142,21 @@ class CMTLMetadata final : public IAssetMetadata
124142

125143
private:
126144
meta_container_t<CRenderpassIndependentPipeline> m_metaStorage;
145+
core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
127146

128147
friend class CGraphicsPipelineLoaderMTL;
129-
template<typename... Args>
130148
inline void placeMeta(
131149
uint32_t offset, const ICPURenderpassIndependentPipeline* ppln,
132150
core::smart_refctd_ptr<ICPUDescriptorSet>&& _descriptorSet3,
133151
const CRenderpassIndependentPipeline::SMaterialParameters& _materialParams,
134-
std::string&& _name, uint32_t _hash,
135-
Args&&... args)
152+
std::string&& _name, uint32_t _hash)
136153
{
137154
auto& meta = m_metaStorage->operator[](offset);
138-
meta = CRenderpassIndependentPipeline(std::forward<Args>(args)...);
139-
meta.m_descriptorSet3 = std::move(_descriptorSet3);
140-
meta.m_materialParams = _materialParams;
141-
meta.m_name = std::move(_name);
142-
meta.m_hash = _hash;
155+
meta = CRenderpassIndependentPipeline(
156+
core::SRange<const IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>(m_semanticStorage->begin(),m_semanticStorage->end()),
157+
std::move(_descriptorSet3),_materialParams,
158+
std::move(_name),_hash
159+
);
143160

144161
IAssetMetadata::insertAssetSpecificMetadata(ppln, &meta);
145162
}

include/nbl/asset/metadata/CPLYMetadata.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,12 @@ class CPLYMetadata final : public IAssetMetadata
1818
class CRenderpassIndependentPipeline : public IRenderpassIndependentPipelineMetadata
1919
{
2020
public:
21-
CRenderpassIndependentPipeline() = default;
22-
CRenderpassIndependentPipeline(const CRenderpassIndependentPipeline&) = delete;
21+
CRenderpassIndependentPipeline() : IRenderpassIndependentPipelineMetadata(), m_hash(0xdeadbeefu) {}
2322
CRenderpassIndependentPipeline(CRenderpassIndependentPipeline&& other)
2423
{
2524
operator=(std::move(other));
2625
}
2726

28-
template<typename... Args>
29-
CRenderpassIndependentPipeline(uint32_t _hash, Args&&... args) : IRenderpassIndependentPipelineMetadata(std::forward<Args>(args)...), m_hash(_hash)
30-
{
31-
}
32-
3327
CRenderpassIndependentPipeline& operator=(const CRenderpassIndependentPipeline&) = delete;
3428
inline CRenderpassIndependentPipeline& operator=(CRenderpassIndependentPipeline&& other)
3529
{
@@ -42,21 +36,33 @@ class CPLYMetadata final : public IAssetMetadata
4236
};
4337

4438
template<class InContainer>
45-
CPLYMetadata(InContainer&& inContainer) : IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(inContainer.size()))
39+
CPLYMetadata(InContainer&& hashContainer, core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage) :
40+
IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(hashContainer.size())), m_semanticStorage(std::move(_semanticStorage))
4641
{
47-
std::move(inContainer.begin(),inContainer.end(),m_metaStorage->begin());
42+
auto metaIt = m_metaStorage->begin();
43+
for (auto hash : hashContainer)
44+
(metaIt++)->m_hash = hash;
4845
}
4946

5047
_NBL_STATIC_INLINE_CONSTEXPR const char* LoaderName = "CPLYMeshFileLoader";
5148
const char* getLoaderName() const override { return LoaderName; }
5249

50+
//!
51+
inline const CRenderpassIndependentPipeline* getAssetSpecificMetadata(const ICPURenderpassIndependentPipeline* asset) const
52+
{
53+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
54+
return static_cast<const CRenderpassIndependentPipeline*>(found);
55+
}
56+
5357
private:
5458
meta_container_t<CRenderpassIndependentPipeline> m_metaStorage;
59+
core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
5560

5661
friend class CPLYMeshFileLoader;
5762
inline void placeMeta(uint32_t offset, const ICPURenderpassIndependentPipeline* ppln)
5863
{
5964
auto& meta = m_metaStorage->operator[](offset);
65+
meta.m_inputSemantics = {m_semanticStorage->begin(),m_semanticStorage->end()};
6066
IAssetMetadata::insertAssetSpecificMetadata(ppln,&meta);
6167
}
6268
};

include/nbl/asset/metadata/CSTLMetadata.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ class CSTLMetadata final : public IAssetMetadata
1818
class CRenderpassIndependentPipeline : public IRenderpassIndependentPipelineMetadata
1919
{
2020
public:
21-
using IRenderpassIndependentPipelineMetadata::IRenderpassIndependentPipelineMetadata;
21+
CRenderpassIndependentPipeline(CRenderpassIndependentPipeline&& _other) : CRenderpassIndependentPipeline()
22+
{
23+
CRenderpassIndependentPipeline::operator=(std::move(_other));
24+
}
25+
template<typename... Args>
26+
CRenderpassIndependentPipeline(Args&&... args) : IRenderpassIndependentPipelineMetadata(std::forward<Args>(args)...) {}
2227

2328
inline CRenderpassIndependentPipeline& operator=(CRenderpassIndependentPipeline&& other)
2429
{
@@ -27,22 +32,30 @@ class CSTLMetadata final : public IAssetMetadata
2732
}
2833
};
2934

30-
CSTLMetadata(uint32_t pplnCount) : IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(pplnCount))
35+
CSTLMetadata(uint32_t pplnCount, core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage) :
36+
IAssetMetadata(), m_metaStorage(createContainer<CRenderpassIndependentPipeline>(pplnCount)), m_semanticStorage(std::move(_semanticStorage))
3137
{
3238
}
3339

3440
_NBL_STATIC_INLINE_CONSTEXPR const char* LoaderName = "CSTLMeshFileLoader";
3541
const char* getLoaderName() const override { return LoaderName; }
3642

43+
//!
44+
inline const CRenderpassIndependentPipeline* getAssetSpecificMetadata(const ICPURenderpassIndependentPipeline* asset) const
45+
{
46+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
47+
return static_cast<const CRenderpassIndependentPipeline*>(found);
48+
}
49+
3750
private:
3851
meta_container_t<CRenderpassIndependentPipeline> m_metaStorage;
52+
core::smart_refctd_dynamic_array<IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
3953

4054
friend class CSTLMeshFileLoader;
41-
template<typename... Args>
42-
inline void placeMeta(uint32_t offset, const ICPURenderpassIndependentPipeline* ppln, Args&&... args)
55+
inline void placeMeta(uint32_t offset, const ICPURenderpassIndependentPipeline* ppln)
4356
{
4457
auto& meta = m_metaStorage->operator[](offset);
45-
meta = CRenderpassIndependentPipeline(std::forward<Args>(args)...);
58+
meta = CRenderpassIndependentPipeline(core::SRange<const IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>(m_semanticStorage->begin(),m_semanticStorage->end()));
4659

4760
IAssetMetadata::insertAssetSpecificMetadata(ppln,&meta);
4861
}

include/nbl/asset/metadata/IMeshMetadata.h

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,17 @@ class IMeshMetadata : public core::Interface
2020
{
2121
core::matrix3x4SIMD worldTform;
2222
};
23-
using instances_container_t = core::refctd_dynamic_array<SInstance>;
24-
25-
//!
26-
inline IMeshMetadata() : m_instances(nullptr) {}
27-
inline IMeshMetadata(core::smart_refctd_ptr<instances_container_t>&& _instances) : m_instances(std::move(_instances)) {}
28-
29-
//!
30-
inline core::SRange<const SInstance> getInstances() const
31-
{
32-
if (m_instances)
33-
return {m_instances->begin(),m_instances->end()};
34-
return {nullptr,nullptr};
35-
}
23+
core::SRange<const SInstance> m_instances;
3624

3725
protected:
26+
IMeshMetadata() = default;
3827
virtual ~IMeshMetadata() = default;
3928

4029
inline IMeshMetadata& operator=(IMeshMetadata&& other)
4130
{
42-
std::swap(m_instances,other.m_instances);
31+
m_instances = other.m_instances;
4332
return *this;
4433
}
45-
46-
core::smart_refctd_ptr<instances_container_t> m_instances;
4734
};
4835

4936
}

0 commit comments

Comments
 (0)