From 545df6ce3531d9f485f56cfdcebc52bb370eb7e0 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 7 Aug 2025 18:57:39 +0200 Subject: [PATCH] Add profiler event to GPU particles indirect args setup --- Source/Engine/Particles/Particles.cpp | 115 +++++++++++++------------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/Source/Engine/Particles/Particles.cpp b/Source/Engine/Particles/Particles.cpp index da2e612d9..3ae9e1aea 100644 --- a/Source/Engine/Particles/Particles.cpp +++ b/Source/Engine/Particles/Particles.cpp @@ -716,71 +716,74 @@ void DrawEmittersGPU(RenderContextBatch& renderContextBatch) // Build indirect arguments uint32 indirectArgsOffset = 0; - for (GPUEmitterDraw& draw : GPUEmitterDraws) { - ParticleEmitter* emitter = draw.Buffer->Emitter; - for (int32 moduleIndex = 0; moduleIndex < emitter->Graph.RenderModules.Count(); moduleIndex++) + PROFILE_GPU_CPU_NAMED("Init Indirect Args"); + for (GPUEmitterDraw& draw : GPUEmitterDraws) { - if ((draw.RenderModulesIndices & (1u << moduleIndex)) == 0) - continue; - auto module = emitter->Graph.RenderModules.Get()[moduleIndex]; - draw.DrawCall.Particle.Module = module; - switch (module->TypeID) + ParticleEmitter* emitter = draw.Buffer->Emitter; + for (int32 moduleIndex = 0; moduleIndex < emitter->Graph.RenderModules.Count(); moduleIndex++) { - // Sprite Rendering - case 400: - { - const auto material = (MaterialBase*)module->Assets[0].Get(); - const auto moduleDrawModes = module->Values.Count() > 3 ? (DrawPass)module->Values[3].AsInt : DrawPass::Default; - auto dp = draw.DrawModes & moduleDrawModes & material->GetDrawModes(); - if (dp == DrawPass::None || SpriteRenderer.Init()) - break; - - // Draw sprite for each particle - GPUDrawIndexedIndirectArgs args { SpriteParticleRenderer::IndexCount, 1, 0, 0, 0 }; - context->UpdateBuffer(GPUIndirectArgsBuffer, &args, sizeof(args), indirectArgsOffset); - context->CopyBuffer(GPUIndirectArgsBuffer, draw.Buffer->GPU.Buffer, 4, indirectArgsOffset + 4, draw.Buffer->GPU.ParticleCounterOffset); - indirectArgsOffset += sizeof(GPUDrawIndexedIndirectArgs); - break; - } - // Model Rendering - case 403: - { - const auto model = (Model*)module->Assets[0].Get(); - const auto material = (MaterialBase*)module->Assets[1].Get(); - const auto moduleDrawModes = module->Values.Count() > 4 ? (DrawPass)module->Values[4].AsInt : DrawPass::Default; - auto dp = draw.DrawModes & moduleDrawModes & material->GetDrawModes(); - if (dp == DrawPass::None) - break; - // TODO: model LOD picking for particles? - int32 lodIndex = 0; - ModelLOD& lod = model->LODs[lodIndex]; - for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++) + if ((draw.RenderModulesIndices & (1u << moduleIndex)) == 0) + continue; + auto module = emitter->Graph.RenderModules.Get()[moduleIndex]; + draw.DrawCall.Particle.Module = module; + switch (module->TypeID) { - Mesh& mesh = lod.Meshes[meshIndex]; - if (!mesh.IsInitialized()) - continue; + // Sprite Rendering + case 400: + { + const auto material = (MaterialBase*)module->Assets[0].Get(); + const auto moduleDrawModes = module->Values.Count() > 3 ? (DrawPass)module->Values[3].AsInt : DrawPass::Default; + auto dp = draw.DrawModes & moduleDrawModes & material->GetDrawModes(); + if (dp == DrawPass::None || SpriteRenderer.Init()) + break; - // Draw mesh for each particle - GPUDrawIndexedIndirectArgs args { (uint32)mesh.GetTriangleCount() * 3, 1, 0, 0, 0 }; + // Draw sprite for each particle + GPUDrawIndexedIndirectArgs args{ SpriteParticleRenderer::IndexCount, 1, 0, 0, 0 }; context->UpdateBuffer(GPUIndirectArgsBuffer, &args, sizeof(args), indirectArgsOffset); context->CopyBuffer(GPUIndirectArgsBuffer, draw.Buffer->GPU.Buffer, 4, indirectArgsOffset + 4, draw.Buffer->GPU.ParticleCounterOffset); indirectArgsOffset += sizeof(GPUDrawIndexedIndirectArgs); + break; + } + // Model Rendering + case 403: + { + const auto model = (Model*)module->Assets[0].Get(); + const auto material = (MaterialBase*)module->Assets[1].Get(); + const auto moduleDrawModes = module->Values.Count() > 4 ? (DrawPass)module->Values[4].AsInt : DrawPass::Default; + auto dp = draw.DrawModes & moduleDrawModes & material->GetDrawModes(); + if (dp == DrawPass::None) + break; + // TODO: model LOD picking for particles? + int32 lodIndex = 0; + ModelLOD& lod = model->LODs[lodIndex]; + for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++) + { + Mesh& mesh = lod.Meshes[meshIndex]; + if (!mesh.IsInitialized()) + continue; + + // Draw mesh for each particle + GPUDrawIndexedIndirectArgs args{ (uint32)mesh.GetTriangleCount() * 3, 1, 0, 0, 0 }; + context->UpdateBuffer(GPUIndirectArgsBuffer, &args, sizeof(args), indirectArgsOffset); + context->CopyBuffer(GPUIndirectArgsBuffer, draw.Buffer->GPU.Buffer, 4, indirectArgsOffset + 4, draw.Buffer->GPU.ParticleCounterOffset); + indirectArgsOffset += sizeof(GPUDrawIndexedIndirectArgs); + } + break; + } + // Ribbon Rendering + case 404: + { + // Not supported + break; + } + // Volumetric Fog Rendering + case 405: + { + // Not supported + break; + } } - break; - } - // Ribbon Rendering - case 404: - { - // Not supported - break; - } - // Volumetric Fog Rendering - case 405: - { - // Not supported - break; - } } } }