Browse Source

Add some trace events

Panagiotis Christopoulos Charitos 11 months ago
parent
commit
c30234c5c3

+ 7 - 0
AnKi/Renderer/Bloom.cpp

@@ -7,6 +7,7 @@
 #include <AnKi/Renderer/Renderer.h>
 #include <AnKi/Renderer/LightShading.h>
 #include <AnKi/Renderer/Tonemapping.h>
+#include <AnKi/Util/Tracer.h>
 
 namespace anki {
 
@@ -115,6 +116,8 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 			}
 
 			ppass->setWork([this, passIdx = i](RenderPassWorkContext& rgraphCtx) {
+				ANKI_TRACE_SCOPED_EVENT(BoomPyramid);
+
 				CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 				cmdb.bindShaderProgram(m_downscaleGrProg.get());
@@ -183,6 +186,8 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 		}
 
 		prpass->setWork([this, exposureRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(BoomExposure);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_exposureGrProg.get());
@@ -241,6 +246,8 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 		}
 
 		prpass->setWork([this, exposureRt, upscaledRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(BoomUpscale);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_upscaleGrProg.get());

+ 6 - 0
AnKi/Renderer/ClusterBinning.cpp

@@ -72,6 +72,8 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(m_runCtx.m_dep, BufferUsageBit::kCopyDestination | BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, indirectArgsBuff](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(ClusterBinningSetup);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_jobSetupGrProg.get());
@@ -102,6 +104,8 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(m_runCtx.m_dep, BufferUsageBit::kUavCompute | BufferUsageBit::kIndirectCompute);
 
 		rpass.setWork([this, &ctx, indirectArgsBuff](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(ClusterBinning);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			PtrSize indirectArgsBuffOffset = indirectArgsBuff.getOffset();
@@ -211,6 +215,8 @@ void ClusterBinning::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(m_runCtx.m_dep, BufferUsageBit::kIndirectCompute | BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, indirectArgsBuff](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(ClusterBinningObjectPacking);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			PtrSize indirectArgsBuffOffset =

+ 4 - 0
AnKi/Renderer/DepthDownscale.cpp

@@ -94,6 +94,8 @@ void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 		pass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kUavCompute);
 
 		pass.setWork([this](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(DepthDownscale);
+
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_grProg.get());
@@ -159,6 +161,8 @@ void DepthDownscale::populateRenderGraph(RenderingContext& ctx)
 			pass.newTextureDependency(m_runCtx.m_rt, TextureUsageBit::kRtvDsvWrite, TextureSubresourceDesc::surface(mip, 0, 0));
 
 			pass.setWork([this, mip](RenderPassWorkContext& rgraphCtx) {
+				ANKI_TRACE_SCOPED_EVENT(DepthDownscale);
+
 				CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 				cmdb.bindShaderProgram(m_grProg.get());

+ 2 - 2
AnKi/Renderer/IndirectDiffuse.cpp

@@ -95,7 +95,7 @@ void IndirectDiffuse::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(sbtHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, buildSbtIndirectArgsBuff, sbtBuffer, visibleRenderableIndicesBuff](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(IndirectDiffuse);
+			ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseSbtBuild);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_sbtBuildGrProg.get());
@@ -136,7 +136,7 @@ void IndirectDiffuse::populateRenderGraph(RenderingContext& ctx)
 												 AccelerationStructureUsageBit::kTraceRaysSrv);
 
 		rpass.setWork([this, sbtBuffer, &ctx, transientRt1](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseRayGen);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_libraryGrProg.get());

+ 4 - 4
AnKi/Renderer/IndirectDiffuseProbes.cpp

@@ -243,7 +243,7 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 
 				pass.setWork([this, visOut, viewProjMat = frustum.getViewProjectionMatrix(),
 							  viewMat = frustum.getViewMatrix()](RenderPassWorkContext& rgraphCtx) {
-					ANKI_TRACE_SCOPED_EVENT(RIndirectDiffuse);
+					ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseGBuffer);
 					CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 					cmdb.setViewport(0, 0, m_tileSize, m_tileSize);
@@ -309,7 +309,7 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 				pass.newBufferDependency(shadowVisOut.m_dependency, BufferUsageBit::kIndirectDraw);
 
 				pass.setWork([this, shadowVisOut, cascadeViewProjMat, cascadeViewMat](RenderPassWorkContext& rgraphCtx) {
-					ANKI_TRACE_SCOPED_EVENT(RIndirectDiffuse);
+					ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseShadows);
 					CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 					cmdb.setPolygonOffset(kShadowsPolygonOffsetFactor, kShadowsPolygonOffsetUnits);
@@ -379,7 +379,7 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 				pass.setWork([this, visibleLightsBuffer = lightVis.m_visiblesBuffer, viewProjMat = frustum.getViewProjectionMatrix(), cellCenter,
 							  gbufferColorRts, gbufferDepthRt, probeToRefresh, cascadeViewProjMat, shadowsRt, faceIdx = f,
 							  &rctx](RenderPassWorkContext& rgraphCtx) {
-					ANKI_TRACE_SCOPED_EVENT(RIndirectDiffuse);
+					ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseLightShading);
 
 					const LightComponent* dirLightc = SceneGraph::getSingleton().getDirectionalLight();
 					const Bool doShadows = dirLightc && dirLightc->getShadowEnabled();
@@ -439,7 +439,7 @@ void IndirectDiffuseProbes::populateRenderGraph(RenderingContext& rctx)
 			}
 
 			pass.setWork([this, lightShadingRt, gbufferColorRts, irradianceVolume, cellIdx, probeToRefresh](RenderPassWorkContext& rgraphCtx) {
-				ANKI_TRACE_SCOPED_EVENT(RIndirectDiffuse);
+				ANKI_TRACE_SCOPED_EVENT(IndirectDiffuseIrradiance);
 
 				CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 

+ 3 - 0
AnKi/Renderer/MotionBlur.cpp

@@ -62,6 +62,7 @@ void MotionBlur::populateRenderGraph(RenderingContext& ctx)
 		pass.newTextureDependency(maxVelRt, TextureUsageBit::kUavCompute);
 
 		pass.setWork([this, maxVelRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(MotionBlurMinTileVelocity);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_maxVelocityGrProg.get());
@@ -87,6 +88,7 @@ void MotionBlur::populateRenderGraph(RenderingContext& ctx)
 		pass.newTextureDependency(maxNeighbourVelRt, TextureUsageBit::kUavCompute);
 
 		pass.setWork([this, maxVelRt, maxNeighbourVelRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(MotionBlurMaxNeighbourTileVelocity);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_maxNeightbourVelocityGrProg.get());
@@ -128,6 +130,7 @@ void MotionBlur::populateRenderGraph(RenderingContext& ctx)
 		ppass->newTextureDependency(m_runCtx.m_rt, writeUsage);
 
 		ppass->setWork([this, maxNeighbourVelRt, &ctx](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(MotionBlurReconstruct);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_reconstructGrProg.get());

+ 9 - 9
AnKi/Renderer/Reflections.cpp

@@ -180,7 +180,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(indirectArgsHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, classTileMapRt, consts](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsClassification);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_tileClassificationGrProg.get());
@@ -221,7 +221,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(indirectArgsHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, transientRt1, hitPosAndDepthRt, &ctx, pixelsFailedSsrBuff, consts, classTileMapRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsSsr);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_ssrGrProg.get());
@@ -285,7 +285,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(sbtHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, buildSbtIndirectArgsBuff, sbtBuffer, visibleRenderableIndicesBuff](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsSbtBuild);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_sbtBuildGrProg.get());
@@ -329,7 +329,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(indirectArgsHandle, BufferUsageBit::kIndirectTraceRays);
 
 		rpass.setWork([this, sbtBuffer, &ctx, transientRt1, hitPosAndDepthRt, pixelsFailedSsrBuff](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsRayGen);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_libraryGrProg.get());
@@ -420,7 +420,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		}
 
 		rpass.setWork([this, pixelsFailedSsrBuff, &ctx, transientRt1, hitPosAndDepthRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsProbeFallback);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_probeFallbackGrProg.get());
@@ -474,7 +474,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newTextureDependency(hitPosRt, TextureUsageBit::kUavCompute);
 
 		rpass.setWork([this, &ctx, transientRt1, transientRt2, hitPosAndDepthRt, hitPosRt, consts, classTileMapRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsSpatialDenoise);
 
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
@@ -514,7 +514,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 
 		rpass.setWork([this, &ctx, transientRt1, transientRt2, mainRt, readMomentsRt, writeMomentsRt, hitPosRt,
 					   classTileMapRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsTemporalDenoise);
 
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
@@ -550,7 +550,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newTextureDependency(transientRt2, TextureUsageBit::kUavCompute);
 
 		rpass.setWork([this, transientRt1, transientRt2, writeMomentsRt, consts, classTileMapRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsHorizontalDenoise);
 
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
@@ -579,7 +579,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 		rpass.newTextureDependency(classTileMapRt, TextureUsageBit::kSrvCompute);
 
 		rpass.setWork([this, transientRt2, mainRt, classTileMapRt](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(Reflections);
+			ANKI_TRACE_SCOPED_EVENT(ReflectionsVerticalDenoise);
 
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 

+ 2 - 0
AnKi/Renderer/Renderer.cpp

@@ -678,6 +678,7 @@ void Renderer::gpuSceneCopy(RenderingContext& ctx)
 		rpass.newBufferDependency(m_runCtx.m_gpuSceneHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(GpuSceneCopy);
 			GpuSceneMicroPatcher::getSingleton().patchGpuScene(*rgraphCtx.m_commandBuffer);
 		});
 	}
@@ -782,6 +783,7 @@ Error Renderer::render(Texture* presentTex)
 		pass.newTextureDependency(m_finalComposite->getRenderTarget(), TextureUsageBit::kSrvPixel);
 
 		pass.setWork([this](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(BlitAndUi);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 			cmdb.setViewport(0, 0, m_swapchainResolution.x(), m_swapchainResolution.y());
 

+ 2 - 2
AnKi/Renderer/RtMaterialFetchDbg.cpp

@@ -80,7 +80,7 @@ void RtMaterialFetchDbg::populateRenderGraph(RenderingContext& ctx)
 		rpass.newBufferDependency(sbtHandle, BufferUsageBit::kUavCompute);
 
 		rpass.setWork([this, sbtBuildIndirectArgsBuff, sbtBuffer, visibleRenderableIndicesBuff](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(RtShadows);
+			ANKI_TRACE_SCOPED_EVENT(RtMaterialFetchSbtBuild);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_sbtBuildGrProg.get());
@@ -114,7 +114,7 @@ void RtMaterialFetchDbg::populateRenderGraph(RenderingContext& ctx)
 												 AccelerationStructureUsageBit::kTraceRaysSrv);
 
 		rpass.setWork([this, sbtBuffer, &ctx](RenderPassWorkContext& rgraphCtx) {
-			ANKI_TRACE_SCOPED_EVENT(RtShadows);
+			ANKI_TRACE_SCOPED_EVENT(RtMaterialFetchRayGen);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_libraryGrProg.get());

+ 1 - 0
AnKi/Renderer/ShadowMapping.cpp

@@ -549,6 +549,7 @@ BufferView ShadowMapping::createVetVisibilityPass(CString passName, const LightC
 	pass.setWork([this, &lightc, hashBuff = visOut.m_visiblesHashBuffer, mdiBuff = visOut.m_legacy.m_mdiDrawCountsBuffer, clearTileIndirectArgs,
 				  dispatchMeshIndirectArgs = visOut.m_mesh.m_dispatchMeshIndirectArgsBuffer,
 				  drawIndirectArgs = visOut.m_mesh.m_drawIndirectArgs](RenderPassWorkContext& rpass) {
+		ANKI_TRACE_SCOPED_EVENT(ShadowmappingVet);
 		CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 		cmdb.bindShaderProgram(m_vetVisibilityGrProg.get());

+ 3 - 0
AnKi/Renderer/Ssao.cpp

@@ -106,6 +106,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 		ppass->newTextureDependency(finalRt, writeUsage);
 
 		ppass->setWork([this, &ctx, finalRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(SsaoMain);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_grProg.get());
@@ -169,6 +170,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 		ppass->newTextureDependency(bentNormalsAndSsaoTempRt, writeUsage);
 
 		ppass->setWork([this, finalRt, bentNormalsAndSsaoTempRt, &ctx](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(SsaoSpatialDenoise);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_spatialDenoiseGrProg.get());
@@ -219,6 +221,7 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
 		ppass->newTextureDependency(finalRt, writeUsage);
 
 		ppass->setWork([this, bentNormalsAndSsaoTempRt, finalRt, historyRt](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(SsaoTemporalDenoise);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_tempralDenoiseGrProg.get());

+ 9 - 0
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -15,6 +15,7 @@
 #include <AnKi/Core/GpuMemory/UnifiedGeometryBuffer.h>
 #include <AnKi/Core/StatsSet.h>
 #include <AnKi/Util/CVarSet.h>
+#include <AnKi/Util/Tracer.h>
 #include <AnKi/Core/App.h>
 
 namespace anki {
@@ -551,6 +552,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 		pass.newBufferDependency(zeroMemDep, BufferUsageBit::kCopyDestination);
 
 		pass.setWork([stage1Mem, stage2Mem, stage3Mem](RenderPassWorkContext& rpass) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVisZero);
 			CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 			constexpr Bool debugZeroing = false; // For debugging purposes zero everything
@@ -611,6 +613,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 		pass.setWork([this, frustumTestData, distTestData, lodReferencePoint = in.m_lodReferencePoint, lodDistances = in.m_lodDistances,
 					  technique = in.m_technique, stage1Mem, bLegacyRendering, bMeshletRendering](RenderPassWorkContext& rpass) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVis1stStage);
 			CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 			const Bool gatherAabbIndices = stage1Mem.m_visibleAabbIndices.isValid();
@@ -734,6 +737,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 		pass.setWork([this, stage1Mem, stage2Mem, bLegacyRendering, bMeshletRendering, bHwMeshletRendering, out, frustumTestData,
 					  lodReferencePoint = in.m_lodReferencePoint, bStoreMeshletsFailedHzb](RenderPassWorkContext& rpass) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVis2ndStage);
 			CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 			if(bLegacyRendering)
@@ -859,6 +863,7 @@ void GpuVisibility::populateRenderGraphStage3(FrustumGpuVisibilityInput& in, Gpu
 
 	pass.setWork([this, hzbRt = *in.m_hzbRt, bHwMeshletRendering, stage1And2Mem = out.m_stage1And2Mem, stage3Mem = out.m_stage3Mem,
 				  in](RenderPassWorkContext& rpass) {
+		ANKI_TRACE_SCOPED_EVENT(GpuVis3rdStage);
 		CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 		const Bool hzbTex = true;
@@ -995,6 +1000,7 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		pass.newBufferDependency(m_counterBufferZeroingHandle, BufferUsageBit::kCopyDestination);
 
 		pass.setWork([counterBuffer = m_counterBuffer](RenderPassWorkContext& rgraph) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVisNonRenderablesSetup);
 			rgraph.m_commandBuffer->fillBuffer(BufferView(counterBuffer.get()), 0);
 		});
 
@@ -1028,6 +1034,7 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 	pass.setWork([this, objType = in.m_objectType, feedbackBuffer = in.m_cpuFeedbackBuffer, viewProjectionMat = in.m_viewProjectionMat,
 				  visibleIndicesBuffHandle = out.m_visiblesBufferHandle, counterBuffer = m_counterBuffer, counterBufferOffset = m_counterBufferOffset,
 				  objCount](RenderPassWorkContext& rgraph) {
+		ANKI_TRACE_SCOPED_EVENT(GpuVisNonRenderables);
 		CommandBuffer& cmdb = *rgraph.m_commandBuffer;
 
 		const Bool needsFeedback = feedbackBuffer.isValid();
@@ -1128,6 +1135,7 @@ void GpuVisibilityAccelerationStructures::pupulateRenderGraph(GpuVisibilityAccel
 		pass.setWork([this, viewProjMat = in.m_viewProjectionMatrix, lodDistances = in.m_lodDistances, pointOfTest = in.m_pointOfTest,
 					  testRadius = in.m_testRadius, instancesBuff = out.m_instancesBuffer, visRenderablesBuff = out.m_renderablesBuffer,
 					  zeroInstancesAndSbtBuildDispatchArgsBuff](RenderPassWorkContext& rgraph) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVisibilityAccelStruct);
 			CommandBuffer& cmdb = *rgraph.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_visibilityGrProg.get());
@@ -1174,6 +1182,7 @@ void GpuVisibilityAccelerationStructures::pupulateRenderGraph(GpuVisibilityAccel
 
 		pass.setWork([this, zeroInstancesAndSbtBuildDispatchArgsBuff, instancesBuff = out.m_instancesBuffer,
 					  visRenderablesBuff = out.m_renderablesBuffer](RenderPassWorkContext& rgraph) {
+			ANKI_TRACE_SCOPED_EVENT(GpuVisibilityAccelStructZero);
 			CommandBuffer& cmdb = *rgraph.m_commandBuffer;
 
 			cmdb.bindShaderProgram(m_zeroRemainingInstancesGrProg.get());

+ 4 - 0
AnKi/Renderer/Utils/HzbGenerator.cpp

@@ -5,6 +5,7 @@
 
 #include <AnKi/Renderer/Utils/HzbGenerator.h>
 #include <AnKi/Renderer/Renderer.h>
+#include <AnKi/Util/Tracer.h>
 
 #if ANKI_COMPILER_GCC_COMPATIBLE
 #	pragma GCC diagnostic push
@@ -107,6 +108,7 @@ void HzbGenerator::populateRenderGraphInternal(ConstWeakArray<DispatchInput> dis
 	}
 
 	pass.setWork([this, dispatchInputsCopy, dispatchCount, counterBufferElement](RenderPassWorkContext& rgraphCtx) {
+		ANKI_TRACE_SCOPED_EVENT(HzbGeneration);
 		CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 		cmdb.bindShaderProgram(m_genPyramidGrProg.get());
@@ -200,6 +202,7 @@ void HzbGenerator::populateRenderGraphDirectionalLight(const HzbDirectionalLight
 		pass.newTextureDependency(maxDepthRt, TextureUsageBit::kUavCompute);
 
 		pass.setWork([this, depthBufferRt = in.m_depthBufferRt, maxDepthRt, maxDepthRtSize](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(HzbGenerationDepthTile);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			rgraphCtx.bindSrv(0, 0, depthBufferRt, TextureSubresourceDesc::firstSurface(DepthStencilAspectBit::kDepth));
@@ -268,6 +271,7 @@ void HzbGenerator::populateRenderGraphDirectionalLight(const HzbDirectionalLight
 		pass.setWork([this, maxDepthRt, invViewProjMat = in.m_cameraInverseViewProjectionMatrix,
 					  lightViewProjMat = cascade.m_projectionMatrix * Mat4(cascade.m_viewMatrix, Vec4(0.0f, 0.0f, 0.0f, 1.0f)),
 					  viewport = cascade.m_hzbRtSize * 2, maxDepthRtSize, cascadeMinDepth, cascadeMaxDepth](RenderPassWorkContext& rgraphCtx) {
+			ANKI_TRACE_SCOPED_EVENT(HzbGenerationDirLight);
 			CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
 
 			cmdb.setDepthCompareOperation(CompareOperation::kGreater);