Skip to content

Commit 7cf32f8

Browse files
Make the meshpackers reference counted
1 parent c585acc commit 7cf32f8

File tree

3 files changed

+205
-209
lines changed

3 files changed

+205
-209
lines changed

examples_tests/41.VisibilityBuffer/main.cpp

Lines changed: 123 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -150,129 +150,6 @@ struct SceneData
150150
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
151151
using GPUMeshPacker = CGPUMeshPackerV2<DrawElementsIndirectCommand_t>;
152152

153-
#if 0
154-
GPUMeshPacker packMeshBuffers(video::IVideoDriver* driver, core::vector<const core::smart_refctd_ptr<ICPUMeshBuffer>*>& ranges, SceneData& sceneData)
155-
{
156-
assert(ranges.size()>=2u);
157-
158-
constexpr uint16_t minTrisBatch = 256u;
159-
constexpr uint16_t maxTrisBatch = MAX_TRIANGLES_IN_BATCH;
160-
161-
constexpr uint32_t kVerticesPerTriangle = 3u;
162-
MeshPacker::AllocationParams allocParams;
163-
allocParams.indexBuffSupportedCnt = 32u*1024u*1024u;
164-
allocParams.indexBufferMinAllocCnt = minTrisBatch*kVerticesPerTriangle;
165-
allocParams.vertexBuffSupportedByteSize = 128u*1024u*1024u;
166-
allocParams.vertexBufferMinAllocByteSize = minTrisBatch;
167-
allocParams.MDIDataBuffSupportedCnt = 8192u;
168-
allocParams.MDIDataBuffMinAllocCnt = 1u; //so structs are adjacent in memory (TODO: WTF NO!)
169-
170-
CCPUMeshPackerV2 mp(allocParams,minTrisBatch,maxTrisBatch);
171-
172-
auto wholeMbRangeBegin = ranges.front();
173-
auto wholeMbRangeEnd = ranges.back();
174-
const uint32_t meshBufferCnt = std::distance(wholeMbRangeBegin,wholeMbRangeEnd);
175-
176-
const uint32_t mdiCntBound = mp.calcMDIStructMaxCount(wholeMbRangeBegin,wholeMbRangeEnd); // TODO rename
177-
178-
auto allocData = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<MeshPacker::ReservedAllocationMeshBuffers>>(mdiCntBound);
179-
180-
core::vector<uint32_t> allocDataOffsetForDrawCall(ranges.size());
181-
allocDataOffsetForDrawCall[0] = 0u;
182-
uint32_t i = 0u;
183-
for (auto it=ranges.begin(); it!=ranges.end()-1u; )
184-
{
185-
auto mbRangeBegin = &it->get();
186-
auto mbRangeEnd = &(++it)->get();
187-
188-
bool allocSuccessfull = mp.alloc(allocData->data() + allocDataOffsetForDrawCall[i], mbRangeBegin, mbRangeEnd);
189-
if (!allocSuccessfull)
190-
{
191-
std::cout << "Alloc failed \n";
192-
_NBL_DEBUG_BREAK_IF(true);
193-
}
194-
195-
const uint32_t mdiMaxCnt = mp.calcMDIStructMaxCount(mbRangeBegin,mbRangeEnd);
196-
allocDataOffsetForDrawCall[i + 1] = allocDataOffsetForDrawCall[i] + mdiMaxCnt;
197-
i++;
198-
}
199-
200-
mp.shrinkOutputBuffersSize();
201-
mp.instantiateDataStorage();
202-
MeshPacker::PackerDataStore packerDataStore = mp.getPackerDataStore();
203-
204-
core::vector<BatchInstanceData> batchData;
205-
batchData.reserve(mdiCntTotal);
206-
207-
core::vector<uint32_t> mdiCntForMeshBuffer;
208-
mdiCntForMeshBuffer.reserve(meshBufferCnt);
209-
210-
uint32_t offsetForDrawCall = 0u;
211-
i = 0u;
212-
for (auto it=ranges.begin(); it!=ranges.end()-1u;)
213-
{
214-
auto mbRangeBegin = &it->get();
215-
auto mbRangeEnd = &(++it)->get();
216-
217-
const uint32_t mdiMaxCnt = mp.calcMDIStructMaxCount(mbRangeBegin, mbRangeEnd);
218-
core::vector<IMeshPackerBase::PackedMeshBufferData> pmbd(mdiMaxCnt); //why mdiMaxCnt and not meshBuffersInRangeCnt??????????
219-
core::vector<MeshPacker::CombinedDataOffsetTable> cdot(mdiMaxCnt);
220-
221-
uint32_t mdiCnt = mp.commit(pmbd.data(), cdot.data(), allocData->data() + allocDataOffsetForDrawCall[i], mbRangeBegin, mbRangeEnd);
222-
if (mdiCnt == 0u)
223-
{
224-
std::cout << "Commit failed \n";
225-
_NBL_DEBUG_BREAK_IF(true);
226-
}
227-
228-
sceneData.pushConstantsData.push_back(offsetForDrawCall);
229-
offsetForDrawCall += mdiCnt;
230-
231-
DrawIndexedIndirectInput mdiCallInput;
232-
mdiCallInput.maxCount = mdiCnt;
233-
mdiCallInput.offset = pmbd[0].mdiParameterOffset * sizeof(DrawElementsIndirectCommand_t);
234-
235-
sceneData.drawIndirectInput.push_back(mdiCallInput);
236-
237-
const uint32_t mbInRangeCnt = std::distance(mbRangeBegin, mbRangeEnd);
238-
for (uint32_t j = 0u; j < mbInRangeCnt; j++)
239-
{
240-
mdiCntForMeshBuffer.push_back(pmbd[j].mdiParameterCount);
241-
}
242-
243-
//setOffsetTables
244-
for (uint32_t j = 0u; j < mdiCnt; j++)
245-
{
246-
MeshPacker::CombinedDataOffsetTable& virtualAttribTable = cdot[j];
247-
248-
offsetTableLocal.push_back(virtualAttribTable.attribInfo[0]);
249-
offsetTableLocal.push_back(virtualAttribTable.attribInfo[2]);
250-
offsetTableLocal.push_back(virtualAttribTable.attribInfo[3]);
251-
}
252-
253-
i++;
254-
}
255-
256-
//prepare data for (set = 1, binding = 0) shader ssbo
257-
{
258-
259-
uint32_t i = 0u;
260-
for (auto it = wholeMbRangeBegin; it != wholeMbRangeEnd; it++)
261-
{
262-
const uint32_t mdiCntForThisMb = mdiCntForMeshBuffer[i];
263-
for (uint32_t i = 0u; i < mdiCntForThisMb; i++)
264-
vtData.push_back(*reinterpret_cast<MaterialParams*>((*it)->getPushConstantsDataPtr()));
265-
266-
i++;
267-
}
268-
269-
sceneData.vtDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem(batchData.size()*sizeof(BatchInstanceData),batchData.data());
270-
}
271-
272-
return GPUMeshPacker(driver,std::move(mp));
273-
}
274-
#endif
275-
276153
STextureData getTextureData(core::vector<commit_t>& _out_commits, const asset::ICPUImage* _img, asset::ICPUVirtualTexture* _vt, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor)
277154
{
278155
const auto& extent = _img->getCreationParameters().extent;
@@ -583,6 +460,128 @@ int main()
583460
return output;
584461
}();
585462

463+
// the vertex packing
464+
smart_refctd_ptr<GPUMeshPacker> gpump;
465+
{
466+
assert(ranges.size()>=2u);
467+
468+
constexpr uint16_t minTrisBatch = 256u;
469+
constexpr uint16_t maxTrisBatch = MAX_TRIANGLES_IN_BATCH;
470+
471+
constexpr uint32_t kVerticesPerTriangle = 3u;
472+
MeshPacker::AllocationParams allocParams;
473+
allocParams.indexBuffSupportedCnt = 32u*1024u*1024u;
474+
allocParams.indexBufferMinAllocCnt = minTrisBatch*kVerticesPerTriangle;
475+
allocParams.vertexBuffSupportedByteSize = 128u*1024u*1024u;
476+
allocParams.vertexBufferMinAllocByteSize = minTrisBatch;
477+
allocParams.MDIDataBuffSupportedCnt = 8192u;
478+
allocParams.MDIDataBuffMinAllocCnt = 1u; //so structs are adjacent in memory (TODO: WTF NO!)
479+
480+
auto mp = core::make_smart_refctd_ptr<CCPUMeshPackerV2>(allocParams,minTrisBatch,maxTrisBatch);
481+
#if 0
482+
auto wholeMbRangeBegin = ranges.front();
483+
auto wholeMbRangeEnd = ranges.back();
484+
const uint32_t meshBufferCnt = std::distance(wholeMbRangeBegin,wholeMbRangeEnd);
485+
486+
const uint32_t mdiCntBound = mp.calcMDIStructMaxCount(wholeMbRangeBegin,wholeMbRangeEnd); // TODO rename
487+
488+
auto allocData = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<MeshPacker::ReservedAllocationMeshBuffers>>(mdiCntBound);
489+
490+
core::vector<uint32_t> allocDataOffsetForDrawCall(ranges.size());
491+
allocDataOffsetForDrawCall[0] = 0u;
492+
uint32_t i = 0u;
493+
for (auto it=ranges.begin(); it!=ranges.end()-1u; )
494+
{
495+
auto mbRangeBegin = &it->get();
496+
auto mbRangeEnd = &(++it)->get();
497+
498+
bool allocSuccessfull = mp.alloc(allocData->data() + allocDataOffsetForDrawCall[i], mbRangeBegin, mbRangeEnd);
499+
if (!allocSuccessfull)
500+
{
501+
std::cout << "Alloc failed \n";
502+
_NBL_DEBUG_BREAK_IF(true);
503+
}
504+
505+
const uint32_t mdiMaxCnt = mp.calcMDIStructMaxCount(mbRangeBegin,mbRangeEnd);
506+
allocDataOffsetForDrawCall[i + 1] = allocDataOffsetForDrawCall[i] + mdiMaxCnt;
507+
i++;
508+
}
509+
510+
mp.shrinkOutputBuffersSize();
511+
mp.instantiateDataStorage();
512+
MeshPacker::PackerDataStore packerDataStore = mp.getPackerDataStore();
513+
514+
core::vector<BatchInstanceData> batchData;
515+
batchData.reserve(mdiCntTotal);
516+
517+
core::vector<uint32_t> mdiCntForMeshBuffer;
518+
mdiCntForMeshBuffer.reserve(meshBufferCnt);
519+
520+
uint32_t offsetForDrawCall = 0u;
521+
i = 0u;
522+
for (auto it=ranges.begin(); it!=ranges.end()-1u;)
523+
{
524+
auto mbRangeBegin = &it->get();
525+
auto mbRangeEnd = &(++it)->get();
526+
527+
const uint32_t mdiMaxCnt = mp.calcMDIStructMaxCount(mbRangeBegin, mbRangeEnd);
528+
core::vector<IMeshPackerBase::PackedMeshBufferData> pmbd(mdiMaxCnt); //why mdiMaxCnt and not meshBuffersInRangeCnt??????????
529+
core::vector<MeshPacker::CombinedDataOffsetTable> cdot(mdiMaxCnt);
530+
531+
uint32_t mdiCnt = mp.commit(pmbd.data(), cdot.data(), allocData->data() + allocDataOffsetForDrawCall[i], mbRangeBegin, mbRangeEnd);
532+
if (mdiCnt == 0u)
533+
{
534+
std::cout << "Commit failed \n";
535+
_NBL_DEBUG_BREAK_IF(true);
536+
}
537+
538+
sceneData.pushConstantsData.push_back(offsetForDrawCall);
539+
offsetForDrawCall += mdiCnt;
540+
541+
DrawIndexedIndirectInput mdiCallInput;
542+
mdiCallInput.maxCount = mdiCnt;
543+
mdiCallInput.offset = pmbd[0].mdiParameterOffset * sizeof(DrawElementsIndirectCommand_t);
544+
545+
sceneData.drawIndirectInput.push_back(mdiCallInput);
546+
547+
const uint32_t mbInRangeCnt = std::distance(mbRangeBegin, mbRangeEnd);
548+
for (uint32_t j = 0u; j < mbInRangeCnt; j++)
549+
{
550+
mdiCntForMeshBuffer.push_back(pmbd[j].mdiParameterCount);
551+
}
552+
553+
//setOffsetTables
554+
for (uint32_t j = 0u; j < mdiCnt; j++)
555+
{
556+
MeshPacker::CombinedDataOffsetTable& virtualAttribTable = cdot[j];
557+
558+
offsetTableLocal.push_back(virtualAttribTable.attribInfo[0]);
559+
offsetTableLocal.push_back(virtualAttribTable.attribInfo[2]);
560+
offsetTableLocal.push_back(virtualAttribTable.attribInfo[3]);
561+
}
562+
563+
i++;
564+
}
565+
566+
//prepare data for (set = 1, binding = 0) shader ssbo
567+
{
568+
569+
uint32_t i = 0u;
570+
for (auto it = wholeMbRangeBegin; it != wholeMbRangeEnd; it++)
571+
{
572+
const uint32_t mdiCntForThisMb = mdiCntForMeshBuffer[i];
573+
for (uint32_t i = 0u; i < mdiCntForThisMb; i++)
574+
vtData.push_back(*reinterpret_cast<MaterialParams*>((*it)->getPushConstantsDataPtr()));
575+
576+
i++;
577+
}
578+
579+
sceneData.vtDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem(batchData.size()*sizeof(BatchInstanceData),batchData.data());
580+
}
581+
#endif
582+
}
583+
584+
// the texture packing
586585
smart_refctd_ptr<IGPUVirtualTexture> gpuvt;
587586
{
588587
smart_refctd_ptr<ICPUVirtualTexture> vt = core::make_smart_refctd_ptr<asset::ICPUVirtualTexture>([](asset::E_FORMAT_CLASS) -> uint32_t { return TILES_PER_DIM_LOG2; }, PAGE_SZ_LOG2, PAGE_PADDING, MAX_ALLOCATABLE_TEX_SZ_LOG2);
@@ -651,10 +650,7 @@ int main()
651650

652651
gpuvt = core::make_smart_refctd_ptr<IGPUVirtualTexture>(driver, vt.get());
653652
}
654-
#if 0
655-
// the vertex packing
656-
GPUMeshPacker mp = packMeshBuffers(driver,pipelineMeshBufferRanges,sceneData);
657-
#endif
653+
am->clearAllAssetCache();
658654

659655
//
660656
smart_refctd_ptr<IGPUDescriptorSetLayout> vtDSLayout,vgDSLayout;

include/nbl/asset/IMeshPackerV2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ class IMeshPackerV2Base
230230
};
231231

232232
template <typename BufferType, typename MeshBufferType, typename MDIStructType = DrawElementsIndirectCommand_t>
233-
class IMeshPackerV2 : public IMeshPacker<MeshBufferType, MDIStructType>, public IMeshPackerV2Base
233+
class IMeshPackerV2 : public IMeshPacker<MeshBufferType,MDIStructType>, public IMeshPackerV2Base
234234
{
235235
static_assert(std::is_base_of<IBuffer, BufferType>::value);
236236

0 commit comments

Comments
 (0)