@@ -61,6 +61,14 @@ struct BatchInstanceData
61
61
const auto invalid_tex = STextureData::invalid ();
62
62
std::fill_n (map_data,TEX_OF_INTEREST_CNT,reinterpret_cast <const uint64_t &>(invalid_tex));
63
63
}
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
+ }
64
72
~BatchInstanceData ()
65
73
{
66
74
}
@@ -72,7 +80,7 @@ struct BatchInstanceData
72
80
struct
73
81
{
74
82
uint32_t invalid_0[3 ];
75
- uint32_t baseVertex ;
83
+ uint32_t baseTriangle ;
76
84
};
77
85
};
78
86
union
@@ -140,7 +148,6 @@ struct SceneData
140
148
core::vector<uint32_t > pushConstantsData;
141
149
142
150
smart_refctd_ptr<IGPUBuffer> ubo;
143
-
144
151
};
145
152
146
153
using MeshPacker = CCPUMeshPackerV2<DrawElementsIndirectCommand_t>;
@@ -166,53 +173,7 @@ STextureData getTextureData(core::vector<commit_t>& _out_commits, const asset::I
166
173
return addr;
167
174
}
168
175
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 ;
216
177
217
178
int main ()
218
179
{
@@ -490,6 +451,7 @@ int main()
490
451
491
452
// the vertex packing
492
453
smart_refctd_ptr<GPUMeshPacker> gpump;
454
+ smart_refctd_ptr<IGPUBuffer> batchDataSSBO;
493
455
{
494
456
assert (ranges.size ()>=2u );
495
457
@@ -532,10 +494,10 @@ int main()
532
494
}
533
495
mp->shrinkOutputBuffersSize ();
534
496
mp->instantiateDataStorage ();
535
- #if 0
536
- core::vector<BatchInstanceData> batchData;
537
- batchData.reserve(mdiCntTotal);
538
497
498
+ core::vector<BatchInstanceData> batchData;
499
+ batchData.reserve (mdiCntBound);
500
+ #if 0
539
501
core::vector<uint32_t> mdiCntForMeshBuffer;
540
502
mdiCntForMeshBuffer.reserve(meshBufferCnt);
541
503
@@ -597,11 +559,13 @@ int main()
597
559
598
560
i++;
599
561
}
600
-
601
- sceneData.vtDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem(batchData.size()*sizeof(BatchInstanceData),batchData.data());
602
562
}
603
563
#endif
564
+ batchDataSSBO = driver->createFilledDeviceLocalGPUBufferOnDedMem (batchData.size ()*sizeof (BatchInstanceData),batchData.data ());
565
+
604
566
gpump = core::make_smart_refctd_ptr<CGPUMeshPackerV2<>>(driver,mp.get ());
567
+ sceneData.mdiBuffer = gpump->getPackerDataStore ().MDIDataBuffer ;
568
+ sceneData.idxBuffer = gpump->getPackerDataStore ().indexBuffer ;
605
569
}
606
570
am->clearAllAssetCache ();
607
571
@@ -626,7 +590,7 @@ int main()
626
590
// write
627
591
sceneData.vtDS = driver->createGPUDescriptorSet (smart_refctd_ptr (vtDSLayout));
628
592
629
- auto sizesVT = gpuvt->getDescriptorSetWrites (nullptr ,nullptr ,nullptr );
593
+ const auto sizesVT = gpuvt->getDescriptorSetWrites (nullptr ,nullptr ,nullptr );
630
594
core::vector<video::IGPUDescriptorSet::SWriteDescriptorSet> writesVT (sizesVT.first +1u );
631
595
core::vector<video::IGPUDescriptorSet::SDescriptorInfo> infoVT (sizesVT.second +1u );
632
596
gpuvt->getDescriptorSetWrites (writesVT.data (),infoVT.data (),sceneData.vtDS .get (),PGTAB_BINDING,PHYSICAL_STORAGE_VIEWS_BINDING);
@@ -646,30 +610,52 @@ int main()
646
610
}
647
611
smart_refctd_ptr<IGPUDescriptorSetLayout> vgDSLayout;
648
612
{
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 ;
664
621
if constexpr (useSSBO)
665
- mp. getDSlayoutBindingsForSSBO(vgBindings.data() );
622
+ gpump-> getDSlayoutBindingsForSSBO (actualVGBindings );
666
623
else
667
- mp. getDSlayoutBindingsForUTB(vgBindings.data() );
624
+ gpump-> getDSlayoutBindingsForUTB (actualVGBindings );
668
625
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);
670
627
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 );
673
659
}
674
660
675
661
//
0 commit comments