@@ -150,129 +150,6 @@ struct SceneData
150
150
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
151
151
using GPUMeshPacker = CGPUMeshPackerV2<DrawElementsIndirectCommand_t>;
152
152
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
-
276
153
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)
277
154
{
278
155
const auto & extent = _img->getCreationParameters ().extent ;
@@ -583,6 +460,128 @@ int main()
583
460
return output;
584
461
}();
585
462
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
586
585
smart_refctd_ptr<IGPUVirtualTexture> gpuvt;
587
586
{
588
587
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()
651
650
652
651
gpuvt = core::make_smart_refctd_ptr<IGPUVirtualTexture>(driver, vt.get ());
653
652
}
654
- #if 0
655
- // the vertex packing
656
- GPUMeshPacker mp = packMeshBuffers(driver,pipelineMeshBufferRanges,sceneData);
657
- #endif
653
+ am->clearAllAssetCache ();
658
654
659
655
//
660
656
smart_refctd_ptr<IGPUDescriptorSetLayout> vtDSLayout,vgDSLayout;
0 commit comments