Add profiler event to GPU particles indirect args setup
This commit is contained in:
@@ -716,71 +716,74 @@ void DrawEmittersGPU(RenderContextBatch& renderContextBatch)
|
|||||||
|
|
||||||
// Build indirect arguments
|
// Build indirect arguments
|
||||||
uint32 indirectArgsOffset = 0;
|
uint32 indirectArgsOffset = 0;
|
||||||
for (GPUEmitterDraw& draw : GPUEmitterDraws)
|
|
||||||
{
|
{
|
||||||
ParticleEmitter* emitter = draw.Buffer->Emitter;
|
PROFILE_GPU_CPU_NAMED("Init Indirect Args");
|
||||||
for (int32 moduleIndex = 0; moduleIndex < emitter->Graph.RenderModules.Count(); moduleIndex++)
|
for (GPUEmitterDraw& draw : GPUEmitterDraws)
|
||||||
{
|
{
|
||||||
if ((draw.RenderModulesIndices & (1u << moduleIndex)) == 0)
|
ParticleEmitter* emitter = draw.Buffer->Emitter;
|
||||||
continue;
|
for (int32 moduleIndex = 0; moduleIndex < emitter->Graph.RenderModules.Count(); moduleIndex++)
|
||||||
auto module = emitter->Graph.RenderModules.Get()[moduleIndex];
|
|
||||||
draw.DrawCall.Particle.Module = module;
|
|
||||||
switch (module->TypeID)
|
|
||||||
{
|
{
|
||||||
// Sprite Rendering
|
if ((draw.RenderModulesIndices & (1u << moduleIndex)) == 0)
|
||||||
case 400:
|
continue;
|
||||||
{
|
auto module = emitter->Graph.RenderModules.Get()[moduleIndex];
|
||||||
const auto material = (MaterialBase*)module->Assets[0].Get();
|
draw.DrawCall.Particle.Module = module;
|
||||||
const auto moduleDrawModes = module->Values.Count() > 3 ? (DrawPass)module->Values[3].AsInt : DrawPass::Default;
|
switch (module->TypeID)
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
Mesh& mesh = lod.Meshes[meshIndex];
|
// Sprite Rendering
|
||||||
if (!mesh.IsInitialized())
|
case 400:
|
||||||
continue;
|
{
|
||||||
|
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
|
// Draw sprite for each particle
|
||||||
GPUDrawIndexedIndirectArgs args { (uint32)mesh.GetTriangleCount() * 3, 1, 0, 0, 0 };
|
GPUDrawIndexedIndirectArgs args{ SpriteParticleRenderer::IndexCount, 1, 0, 0, 0 };
|
||||||
context->UpdateBuffer(GPUIndirectArgsBuffer, &args, sizeof(args), indirectArgsOffset);
|
context->UpdateBuffer(GPUIndirectArgsBuffer, &args, sizeof(args), indirectArgsOffset);
|
||||||
context->CopyBuffer(GPUIndirectArgsBuffer, draw.Buffer->GPU.Buffer, 4, indirectArgsOffset + 4, draw.Buffer->GPU.ParticleCounterOffset);
|
context->CopyBuffer(GPUIndirectArgsBuffer, draw.Buffer->GPU.Buffer, 4, indirectArgsOffset + 4, draw.Buffer->GPU.ParticleCounterOffset);
|
||||||
indirectArgsOffset += sizeof(GPUDrawIndexedIndirectArgs);
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user