Skip to content

Commit da35063

Browse files
fix the last of the compiler errors for UTB (but I havent tested it at runtime!)
1 parent 16fff5a commit da35063

File tree

4 files changed

+76
-81
lines changed

4 files changed

+76
-81
lines changed

examples_tests/41.VisibilityBuffer/main.cpp

Lines changed: 61 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ struct BatchInstanceData
6161
const auto invalid_tex = STextureData::invalid();
6262
std::fill_n(map_data,TEX_OF_INTEREST_CNT,reinterpret_cast<const uint64_t&>(invalid_tex));
6363
}
64+
BatchInstanceData(const BatchInstanceData& other) : shininess(other.shininess), opacity(other.opacity), IoR(other.IoR), extra(other.extra)
65+
{
66+
ambient = other.ambient;
67+
diffuse = other.diffuse;
68+
specular = other.specular;
69+
emissive = other.emissive;
70+
std::copy_n(other.map_data,TEX_OF_INTEREST_CNT,map_data);
71+
}
6472
~BatchInstanceData()
6573
{
6674
}
@@ -72,7 +80,7 @@ struct BatchInstanceData
7280
struct
7381
{
7482
uint32_t invalid_0[3];
75-
uint32_t baseVertex;
83+
uint32_t baseTriangle;
7684
};
7785
};
7886
union
@@ -140,7 +148,6 @@ struct SceneData
140148
core::vector<uint32_t> pushConstantsData;
141149

142150
smart_refctd_ptr<IGPUBuffer> ubo;
143-
144151
};
145152

146153
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
@@ -166,53 +173,7 @@ STextureData getTextureData(core::vector<commit_t>& _out_commits, const asset::I
166173
return addr;
167174
}
168175

169-
constexpr bool useSSBO = true;
170-
171-
#if 0
172-
void createDescriptorSets(IVideoDriver* driver, const IGPUPipelineLayout* pplnLayout, SceneData& sceneData, const GPUMeshPacker& mp)
173-
{
174-
auto getMpWriteAndInfoSize = [&mp]() -> std::pair<uint32_t, uint32_t>
175-
{
176-
if constexpr (useSSBO)
177-
{
178-
uint32_t writeAndInfoSize = mp.getDescriptorSetWritesForSSBO(nullptr, nullptr, nullptr);
179-
return std::make_pair(writeAndInfoSize, writeAndInfoSize);
180-
}
181-
else
182-
return mp.getDescriptorSetWritesForUTB(nullptr, nullptr, nullptr);
183-
};
184-
185-
//mesh packing stuff
186-
auto sizesMP = getMpWriteAndInfoSize();
187-
auto writesMP = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IGPUDescriptorSet::SWriteDescriptorSet>>(sizesMP.first);
188-
auto infoMP = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IGPUDescriptorSet::SDescriptorInfo>>(sizesMP.second);
189-
190-
auto writesPtr = writesMP->data();
191-
auto infoPtr = infoMP->data();
192-
193-
if constexpr (useSSBO)
194-
mp.getDescriptorSetWritesForSSBO(writesMP->data(), infoMP->data(), sceneData.ds[0].get());
195-
else
196-
mp.getDescriptorSetWritesForUTB(writesMP->data(), infoMP->data(), sceneData.ds[0].get());
197-
198-
driver->updateDescriptorSets(writesMP->size(), writesMP->data(), 0u, nullptr);
199-
200-
IGPUDescriptorSet::SWriteDescriptorSet w3;
201-
w3.arrayElement = 0u;
202-
w3.count = 1u;
203-
w3.binding = 0u;
204-
w3.descriptorType = EDT_STORAGE_BUFFER;
205-
w3.dstSet = sceneData.ds[3].get();
206-
207-
IGPUDescriptorSet::SDescriptorInfo info3;
208-
info3.buffer.offset = 0u;
209-
info3.buffer.size = sceneData.virtualAttribTable->getSize();
210-
info3.desc = core::smart_refctd_ptr(sceneData.virtualAttribTable);
211-
w3.info = &info3;
212-
213-
driver->updateDescriptorSets(1u, &w3, 0u, nullptr);
214-
}
215-
#endif
176+
constexpr bool useSSBO = false;
216177

217178
int main()
218179
{
@@ -490,6 +451,7 @@ int main()
490451

491452
// the vertex packing
492453
smart_refctd_ptr<GPUMeshPacker> gpump;
454+
smart_refctd_ptr<IGPUBuffer> batchDataSSBO;
493455
{
494456
assert(ranges.size()>=2u);
495457

@@ -532,10 +494,10 @@ int main()
532494
}
533495
mp->shrinkOutputBuffersSize();
534496
mp->instantiateDataStorage();
535-
#if 0
536-
core::vector<BatchInstanceData> batchData;
537-
batchData.reserve(mdiCntTotal);
538497

498+
core::vector<BatchInstanceData> batchData;
499+
batchData.reserve(mdiCntBound);
500+
#if 0
539501
core::vector<uint32_t> mdiCntForMeshBuffer;
540502
mdiCntForMeshBuffer.reserve(meshBufferCnt);
541503

@@ -597,11 +559,13 @@ int main()
597559

598560
i++;
599561
}
600-
601-
sceneData.vtDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem(batchData.size()*sizeof(BatchInstanceData),batchData.data());
602562
}
603563
#endif
564+
batchDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem(batchData.size()*sizeof(BatchInstanceData),batchData.data());
565+
604566
gpump = core::make_smart_refctd_ptr<CGPUMeshPackerV2<>>(driver,mp.get());
567+
sceneData.mdiBuffer = gpump->getPackerDataStore().MDIDataBuffer;
568+
sceneData.idxBuffer = gpump->getPackerDataStore().indexBuffer;
605569
}
606570
am->clearAllAssetCache();
607571

@@ -626,7 +590,7 @@ int main()
626590
// write
627591
sceneData.vtDS = driver->createGPUDescriptorSet(smart_refctd_ptr(vtDSLayout));
628592

629-
auto sizesVT = gpuvt->getDescriptorSetWrites(nullptr,nullptr,nullptr);
593+
const auto sizesVT = gpuvt->getDescriptorSetWrites(nullptr,nullptr,nullptr);
630594
core::vector<video::IGPUDescriptorSet::SWriteDescriptorSet> writesVT(sizesVT.first+1u);
631595
core::vector<video::IGPUDescriptorSet::SDescriptorInfo> infoVT(sizesVT.second+1u);
632596
gpuvt->getDescriptorSetWrites(writesVT.data(),infoVT.data(),sceneData.vtDS.get(),PGTAB_BINDING,PHYSICAL_STORAGE_VIEWS_BINDING);
@@ -646,30 +610,52 @@ int main()
646610
}
647611
smart_refctd_ptr<IGPUDescriptorSetLayout> vgDSLayout;
648612
{
649-
#if 0
650-
IGPUDescriptorSet::SWriteDescriptorSet w2[2];
651-
w2[0].arrayElement = 0u;
652-
w2[0].count = 1u;
653-
w2[0].binding = 0u;
654-
w2[0].descriptorType = EDT_STORAGE_BUFFER;
655-
w2[0].dstSet = sceneData.ds[2].get();
656-
657-
IGPUDescriptorSet::SDescriptorInfo info2[2];
658-
info2[1].buffer.offset = 0u;
659-
info2[1].buffer.size = sceneData.vtDataSSBO->getSize();
660-
info2[1].desc = sceneData.vtDataSSBO; // TODO: rename vtData to materialData
661-
662-
driver->updateDescriptorSets(2u, w2, 0u, nullptr);
663-
core::vector<IGPUDescriptorSetLayout::SBinding> vgBindings(useSSBO ? mp.getDSlayoutBindingsForSSBO(nullptr) : mp.getDSlayoutBindingsForUTB(nullptr));
613+
// layout
614+
core::vector<IGPUDescriptorSetLayout::SBinding> vgBindings((useSSBO ? gpump->getDSlayoutBindingsForSSBO(nullptr):gpump->getDSlayoutBindingsForUTB(nullptr))+1u);
615+
auto& materialDataBinding = vgBindings.front();
616+
materialDataBinding.binding = 0u;
617+
materialDataBinding.type = EDT_STORAGE_BUFFER;
618+
materialDataBinding.count = 1u;
619+
materialDataBinding.samplers = nullptr; // not sampler interpolated
620+
auto* actualVGBindings = vgBindings.data()+1u;
664621
if constexpr (useSSBO)
665-
mp.getDSlayoutBindingsForSSBO(vgBindings.data());
622+
gpump->getDSlayoutBindingsForSSBO(actualVGBindings);
666623
else
667-
mp.getDSlayoutBindingsForUTB(vgBindings.data());
624+
gpump->getDSlayoutBindingsForUTB(actualVGBindings);
668625
for (auto& binding : vgBindings)
669-
binding.stageFlags = static_cast<ISpecializedShader::E_SHADER_STAGE>(ISpecializedShader::ESS_VERTEX | ISpecializedShader::ESS_COMPUTE | ISpecializedShader::ESS_FRAGMENT); });
626+
binding.stageFlags = static_cast<ISpecializedShader::E_SHADER_STAGE>(ISpecializedShader::ESS_VERTEX|ISpecializedShader::ESS_COMPUTE|ISpecializedShader::ESS_FRAGMENT);
670627

671-
vtDSLayout = driver->createGPUDescriptorSetLayout(vtBindings.data(), vtBindings.data() + vtBindings.size());
672-
#endif
628+
vgDSLayout = driver->createGPUDescriptorSetLayout(vgBindings.data(),vgBindings.data()+vgBindings.size());
629+
630+
// write
631+
sceneData.vgDS = driver->createGPUDescriptorSet(smart_refctd_ptr(vgDSLayout));
632+
633+
uint32_t writeCount,infoCount;
634+
if constexpr (useSSBO)
635+
writeCount = infoCount = gpump->getDescriptorSetWritesForSSBO(nullptr,nullptr,nullptr);
636+
else
637+
std::tie(writeCount,infoCount) = gpump->getDescriptorSetWritesForUTB(nullptr,nullptr,nullptr);
638+
vector<IGPUDescriptorSet::SWriteDescriptorSet> writesVG(++writeCount);
639+
vector<IGPUDescriptorSet::SDescriptorInfo> infosVG(++infoCount);
640+
641+
auto writes = writesVG.data();
642+
auto infos = infosVG.data();
643+
writes->dstSet = sceneData.vgDS.get();
644+
writes->binding = 0u;
645+
writes->arrayElement = 0u;
646+
writes->count = 1u;
647+
writes->descriptorType = EDT_STORAGE_BUFFER;
648+
writes->info = infos;
649+
writes++;
650+
infos->buffer.offset = 0u;
651+
infos->buffer.size = batchDataSSBO->getSize();
652+
infos->desc = std::move(batchDataSSBO);
653+
infos++;
654+
if constexpr (useSSBO)
655+
gpump->getDescriptorSetWritesForSSBO(writes,infos,sceneData.vgDS.get());
656+
else
657+
gpump->getDescriptorSetWritesForUTB(writes,infos,sceneData.vgDS.get());
658+
driver->updateDescriptorSets(writeCount,writesVG.data(),0u,nullptr);
673659
}
674660

675661
//

include/nbl/asset/utils/IMeshPacker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class IMeshPackerBase : public virtual core::IReferenceCounted
2626
}
2727
};
2828

29+
inline uint16_t getMinTriangleCountPerMDI() const { return m_minTriangleCountPerMDIData; }
30+
inline uint16_t getMaxTriangleCountPerMDI() const { return m_maxTriangleCountPerMDIData; }
31+
2932
protected:
3033
IMeshPackerBase(uint16_t minTriangleCountPerMDIData, uint16_t maxTriangleCountPerMDIData)
3134
:m_maxTriangleCountPerMDIData(maxTriangleCountPerMDIData),
@@ -115,6 +118,7 @@ class IMeshPackerBase : public virtual core::IReferenceCounted
115118
}
116119

117120
protected:
121+
// TODO: don't hold the reserved spaces, they're held by the allocators anyway
118122
void* m_MDIDataAlctrResSpc;
119123
void* m_idxBuffAlctrResSpc;
120124
void* m_vtxBuffAlctrResSpc;

include/nbl/asset/utils/IMeshPackerV2.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ class IMeshPackerV2Base
229229
}
230230

231231
VirtualAttribConfig m_virtualAttribConfig;
232+
public:
233+
const VirtualAttribConfig& getVirtualAttribConfig() const {return m_virtualAttribConfig;}
232234
};
233235

234236
template <class BufferType, class DescriptorSetType, class MeshBufferType, typename MDIStructType = DrawElementsIndirectCommand_t>
@@ -568,8 +570,10 @@ class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public I
568570
template <typename MeshBufferIterator>
569571
uint32_t calcMDIStructMaxCount(const MeshBufferIterator mbBegin, const MeshBufferIterator mbEnd);
570572

571-
inline const PackerDataStore& getPackerDataStore() { return m_packerDataStore; };
573+
inline const PackerDataStore& getPackerDataStore() const { return m_packerDataStore; }
572574

575+
inline const AllocationParams& getAllocParams() const { return m_allocParams; }
576+
573577
protected:
574578
IMeshPackerV2(const AllocationParams& allocParams, uint16_t minTriangleCountPerMDIData, uint16_t maxTriangleCountPerMDIData)
575579
: base_t(minTriangleCountPerMDIData, maxTriangleCountPerMDIData), m_allocParams(allocParams)
@@ -578,9 +582,10 @@ class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public I
578582
};
579583
template<class OtherBufferType, class OtherDescriptorSetType, class OtherMeshBufferType>
580584
explicit IMeshPackerV2(const IMeshPackerV2<OtherBufferType,OtherDescriptorSetType,OtherMeshBufferType,MDIStructType>* otherMp)
581-
: base_t(cpuMP->m_minTriangleCountPerMDIData,cpuMP->m_maxTriangleCountPerMDIData), IMeshPackerV2Base(cpuMP->m_virtualAttribConfig), m_allocParams(otherMp->m_allocParams)
585+
: base_t(otherMp->getMinTriangleCountPerMDI(),otherMp->getMaxTriangleCountPerMDI()),
586+
IMeshPackerV2Base(otherMp->getVirtualAttribConfig()), m_allocParams(otherMp->getAllocParams())
582587
{
583-
initializeCommonAllocators(allocParams);
588+
initializeCommonAllocators(m_allocParams);
584589
};
585590

586591
PackerDataStore m_packerDataStore;

include/nbl/video/CGPUMeshPackerV2.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ class CGPUMeshPackerV2 final : public asset::IMeshPackerV2<IGPUBuffer,IGPUDescri
4040
: base_t(cpuMP), m_driver(driver)
4141
{
4242
// TODO: protect against unitiliazed storage of cpuMP
43-
auto& cpuMDIBuff = cpuMP->getPackerDataStore().MDIDataBuffer;
44-
auto& cpuIdxBuff = cpuMP->getPackerDataStore().indexBuffer;
45-
auto& cpuVtxBuff = cpuMP->getPackerDataStore().vertexBuffer;
43+
const auto& cpuMDIBuff = cpuMP->getPackerDataStore().MDIDataBuffer;
44+
const auto& cpuIdxBuff = cpuMP->getPackerDataStore().indexBuffer;
45+
const auto& cpuVtxBuff = cpuMP->getPackerDataStore().vertexBuffer;
4646

4747
// TODO: why are the allocators not copied!?
4848

0 commit comments

Comments
 (0)