173 {
175
177
178 RenderBehaveBuilder builder{ this ,frameInfo.m_FrameIndex, frameInfo.m_ImageIndex };
179
180 builder.BeginRenderPassAsync();
181
183 {
184 builder.Await([&](const VkCommandBuffer& cmdBuffer) {
185
186 builder.SetViewPort(cmdBuffer);
187
189
191
192 builder.RunDGC(cmdBuffer);
193
194 });
195 }
196 else
197 {
198 const size_t nThreads =
ThreadModel::Get()->GetRHIThreadPool()->GetThreadsCount();
199 const size_t nTask =
m_View ? (
m_View->size() > 40 ? nThreads : 1) : 0;
200 const size_t nCount =
m_View ?
m_View->size() / nTask : 0;
201
202 std::vector<std::future<VkCommandBuffer>> futureCmdBuffers;
203 for(size_t i = 0; i < nTask; i++)
204 {
205 futureCmdBuffers.push_back(
206
207 builder.Async([&, i](const VkCommandBuffer& cmdBuffer) {
208
209 builder.SetViewPort(cmdBuffer);
210
211 builder.BindDescriptorSet(DescriptorSetManager::GetByName("PreRenderer"), cmdBuffer);
212
213 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "Mesh" }), cmdBuffer);
214
215 IterWorldCompWithRange<MeshComponent>(frameInfo, *
m_View, i * nCount, std::min((i + 1) * nCount,
m_View->size() - 1), [&](
int entityId, TransformComponent& transComp, MeshComponent& meshComp) {
216
217 meshComp.GetMesh()->DrawMeshTasks(cmdBuffer, [&](const uint32_t& meshpackId, const auto& meshPack) {
218
219 builder.BindPipeline(meshPack->GetMaterial()->GetName(), cmdBuffer);
220
221 builder.UpdatePushConstant<uint64_t>([&](auto& push) {
222 push = meshPack->GetMeshDesc().GetBufferAddress();
223 }, cmdBuffer);
224 });
225 });
226 })
227 );
228 }
229
230 if (nTask > 0)
231 {
232 builder.Wait(futureCmdBuffers);
233 }
234 }
235
236 builder.BeginNextSubPass("SkyBox");
237
238 builder.SetViewPort();
239
241
243
244 IterWorldCompWithBreak<SkyBoxComponent>(frameInfo, [&](int entityId, TransformComponent& transComp, SkyBoxComponent& skyboxComp) {
245
247
248 builder.BindPipeline(meshPack->GetMaterial()->GetName());
249
250 builder.UpdatePushConstant<uint64_t>([&](auto& push) {
251 push = meshPack->GetMeshDesc().GetBufferAddress();
252 });
253 });
254
255 return true;
256 });
257
258 builder.EndRenderPass();
259 }
#define SPICES_PROFILE_ZONE
std::shared_ptr< std::vector< uint32_t > > m_View
World entities view.
static DescriptorSetInfo & GetByName(const String2 &name)
Get a DescriptorSetInfo by owner's name.
std::shared_ptr< RendererPass > m_Pass
RendererPass.
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
static std::shared_ptr< ThreadModel > Get()
Get ThreadModel single instance.
constexpr bool m_IsUseDGC
Use DGC or not.
std::array< VkCommandBuffer, MaxFrameInFlight > m_GraphicCommandBuffer