Browse Source

Some refactoring

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
fd6378ee36

+ 13 - 3
AnKi/Renderer/GBuffer.cpp

@@ -9,6 +9,7 @@
 #include <AnKi/Renderer/VrsSriGeneration.h>
 #include <AnKi/Renderer/Scale.h>
 #include <AnKi/Renderer/GpuVisibility.h>
+#include <AnKi/Renderer/Hzb.h>
 #include <AnKi/Util/Logger.h>
 #include <AnKi/Util/Tracer.h>
 #include <AnKi/Core/ConfigSet.h>
@@ -21,7 +22,13 @@ GBuffer::~GBuffer()
 
 Error GBuffer::init()
 {
-	const Error err = initInternal();
+	Error err = initInternal();
+
+	if(!err)
+	{
+		err = m_visibility.init();
+	}
+
 	if(err)
 	{
 		ANKI_R_LOGE("Failed to initialize g-buffer pass");
@@ -111,7 +118,7 @@ void GBuffer::runInThread(const RenderingContext& ctx, RenderPassWorkContext& rg
 	args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get();
 	args.m_renderingTechinuqe = RenderingTechnique::kGBuffer;
 
-	const GpuVisibility& gpuVis = getRenderer().getGpuVisibility();
+	const GpuVisibility& gpuVis = m_visibility;
 	rgraphCtx.getBufferState(gpuVis.getMdiDrawCountsBufferHandle(), args.m_mdiDrawCountsBuffer, args.m_mdiDrawCountsBufferOffset,
 							 args.m_mdiDrawCountsBufferRange);
 	rgraphCtx.getBufferState(gpuVis.getDrawIndexedIndirectArgsBufferHandle(), args.m_drawIndexedIndirectArgsBuffer,
@@ -147,6 +154,9 @@ void GBuffer::populateRenderGraph(RenderingContext& ctx)
 
 	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
 
+	m_visibility.populateRenderGraph(RenderingTechnique::kGBuffer, ctx.m_matrices.m_viewProjection,
+									 ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz(), getRenderer().getHzb().getHzbRt(), rgraph);
+
 	const Bool enableVrs =
 		GrManager::getSingleton().getDeviceCapabilities().m_vrs && ConfigSet::getSingleton().getRVrs() && ConfigSet::getSingleton().getRGBufferVrs();
 	const Bool fbDescrHasVrs = m_fbDescr.m_shadingRateAttachmentTexelWidth > 0;
@@ -208,7 +218,7 @@ void GBuffer::populateRenderGraph(RenderingContext& ctx)
 	pass.newBufferDependency(getRenderer().getGpuSceneBufferHandle(), BufferUsageBit::kStorageGeometryRead | BufferUsageBit::kStorageFragmentRead);
 
 	// Only add one depedency to the GPU visibility. No need to track all buffers
-	pass.newBufferDependency(getRenderer().getGpuVisibility().getMdiDrawCountsBufferHandle(), BufferUsageBit::kIndirectDraw);
+	pass.newBufferDependency(m_visibility.getMdiDrawCountsBufferHandle(), BufferUsageBit::kIndirectDraw);
 }
 
 } // end namespace anki

+ 3 - 0
AnKi/Renderer/GBuffer.h

@@ -6,6 +6,7 @@
 #pragma once
 
 #include <AnKi/Renderer/RendererObject.h>
+#include <AnKi/Renderer/GpuVisibility.h>
 #include <AnKi/Gr.h>
 
 namespace anki {
@@ -74,6 +75,8 @@ private:
 	Array<TexturePtr, 2> m_depthRts;
 	FramebufferDescription m_fbDescr;
 
+	GpuVisibility m_visibility;
+
 	class
 	{
 	public:

+ 38 - 23
AnKi/Renderer/GpuVisibility.cpp

@@ -17,6 +17,25 @@
 
 namespace anki {
 
+static GpuSceneContiguousArrayType techniqueToArrayType(RenderingTechnique technique)
+{
+	GpuSceneContiguousArrayType arrayType;
+	switch(technique)
+	{
+	case RenderingTechnique::kGBuffer:
+		arrayType = GpuSceneContiguousArrayType::kRenderableBoundingVolumesGBuffer;
+		break;
+	case RenderingTechnique::kDepth:
+		arrayType = GpuSceneContiguousArrayType::kRenderableBoundingVolumesDepth;
+		break;
+	default:
+		ANKI_ASSERT(0);
+		arrayType = GpuSceneContiguousArrayType::kCount;
+	}
+
+	return arrayType;
+}
+
 Error GpuVisibility::init()
 {
 	ANKI_CHECK(loadShaderProgram("ShaderBinaries/GpuVisibility.ankiprogbin", m_prog, m_grProg));
@@ -24,12 +43,11 @@ Error GpuVisibility::init()
 	return Error::kNone;
 }
 
-void GpuVisibility::populateRenderGraph(RenderingContext& ctx)
+void GpuVisibility::populateRenderGraph(RenderingTechnique technique, const Mat4& viewProjectionMat, Vec3 cameraPosition, RenderTargetHandle hzbRt,
+										RenderGraphDescription& rgraph)
 {
-	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
-
-	const U32 aabbCount = GpuSceneContiguousArrays::getSingleton().getElementCount(GpuSceneContiguousArrayType::kRenderableBoundingVolumesGBuffer);
-	const U32 bucketCount = RenderStateBucketContainer::getSingleton().getBucketCount(RenderingTechnique::kGBuffer);
+	const U32 aabbCount = GpuSceneContiguousArrays::getSingleton().getElementCount(techniqueToArrayType(technique));
+	const U32 bucketCount = RenderStateBucketContainer::getSingleton().getBucketCount(technique);
 
 	// Allocate memory for the indirect commands
 	const GpuVisibleTransientMemoryAllocation indirectArgs =
@@ -51,24 +69,23 @@ void GpuVisibility::populateRenderGraph(RenderingContext& ctx)
 												   mdiDrawCounts.m_offset, mdiDrawCounts.m_range);
 
 	// Create the renderpass
-	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("GPU occlusion GBuffer");
+	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("GPU occlusion");
 
 	pass.newBufferDependency(getRenderer().getGpuSceneBufferHandle(), BufferUsageBit::kStorageComputeRead);
-	pass.newTextureDependency(getRenderer().getHzb().getHzbRt(), TextureUsageBit::kSampledCompute);
+	pass.newTextureDependency(hzbRt, TextureUsageBit::kSampledCompute);
 	pass.newBufferDependency(m_runCtx.m_instanceRateRenderables, BufferUsageBit::kStorageComputeWrite);
 	pass.newBufferDependency(m_runCtx.m_drawIndexedIndirectArgs, BufferUsageBit::kStorageComputeWrite);
 	pass.newBufferDependency(m_runCtx.m_mdiDrawCounts, BufferUsageBit::kStorageComputeWrite);
 
-	pass.setWork([this, &ctx](RenderPassWorkContext& rpass) {
+	pass.setWork([this, viewProjectionMat, cameraPosition, technique, hzbRt](RenderPassWorkContext& rpass) {
 		CommandBuffer& cmdb = *rpass.m_commandBuffer;
 
 		cmdb.bindShaderProgram(m_grProg.get());
 
-		cmdb.bindStorageBuffer(
-			0, 0, &GpuSceneBuffer::getSingleton().getBuffer(),
-			GpuSceneContiguousArrays::getSingleton().getArrayBase(GpuSceneContiguousArrayType::kRenderableBoundingVolumesGBuffer),
-			GpuSceneContiguousArrays::getSingleton().getElementCount(GpuSceneContiguousArrayType::kRenderableBoundingVolumesGBuffer)
-				* sizeof(GpuSceneRenderableAabb));
+		const GpuSceneContiguousArrayType type = techniqueToArrayType(technique);
+
+		cmdb.bindStorageBuffer(0, 0, &GpuSceneBuffer::getSingleton().getBuffer(), GpuSceneContiguousArrays::getSingleton().getArrayBase(type),
+							   GpuSceneContiguousArrays::getSingleton().getElementCount(type) * sizeof(GpuSceneRenderableAabb));
 
 		cmdb.bindStorageBuffer(0, 1, &GpuSceneBuffer::getSingleton().getBuffer(),
 							   GpuSceneContiguousArrays::getSingleton().getArrayBase(GpuSceneContiguousArrayType::kRenderables),
@@ -77,36 +94,34 @@ void GpuVisibility::populateRenderGraph(RenderingContext& ctx)
 
 		cmdb.bindStorageBuffer(0, 2, &GpuSceneBuffer::getSingleton().getBuffer(), 0, kMaxPtrSize);
 
-		rpass.bindColorTexture(0, 3, getRenderer().getHzb().getHzbRt());
+		rpass.bindColorTexture(0, 3, hzbRt);
 		cmdb.bindSampler(0, 4, getRenderer().getSamplers().m_nearestNearestClamp.get());
 
 		rpass.bindStorageBuffer(0, 5, m_runCtx.m_instanceRateRenderables);
 		rpass.bindStorageBuffer(0, 6, m_runCtx.m_drawIndexedIndirectArgs);
 
-		U32* offsets = allocateAndBindStorage<U32*>(
-			sizeof(U32) * RenderStateBucketContainer::getSingleton().getBucketCount(RenderingTechnique::kGBuffer), cmdb, 0, 7);
+		U32* offsets = allocateAndBindStorage<U32*>(sizeof(U32) * RenderStateBucketContainer::getSingleton().getBucketCount(technique), cmdb, 0, 7);
 		U32 bucketCount = 0;
 		U32 userCount = 0;
-		RenderStateBucketContainer::getSingleton().iterateBuckets(RenderingTechnique::kGBuffer, [&](const RenderStateInfo&, U32 userCount_) {
+		RenderStateBucketContainer::getSingleton().iterateBuckets(technique, [&](const RenderStateInfo&, U32 userCount_) {
 			offsets[bucketCount] = userCount;
 			userCount += userCount_;
 			++bucketCount;
 		});
-		ANKI_ASSERT(userCount == RenderStateBucketContainer::getSingleton().getBucketsItemCount(RenderingTechnique::kGBuffer));
+		ANKI_ASSERT(userCount == RenderStateBucketContainer::getSingleton().getBucketsItemCount(technique));
 
 		rpass.bindStorageBuffer(0, 8, m_runCtx.m_mdiDrawCounts);
 
 		GpuVisibilityUniforms* unis = allocateAndBindUniforms<GpuVisibilityUniforms*>(sizeof(GpuVisibilityUniforms), cmdb, 0, 9);
 
 		Array<Plane, 6> planes;
-		extractClipPlanes(ctx.m_matrices.m_viewProjection, planes);
+		extractClipPlanes(viewProjectionMat, planes);
 		for(U32 i = 0; i < 6; ++i)
 		{
 			unis->m_clipPlanes[i] = Vec4(planes[i].getNormal().xyz(), planes[i].getOffset());
 		}
 
-		const U32 aabbCount =
-			GpuSceneContiguousArrays::getSingleton().getElementCount(GpuSceneContiguousArrayType::kRenderableBoundingVolumesGBuffer);
+		const U32 aabbCount = GpuSceneContiguousArrays::getSingleton().getElementCount(type);
 		unis->m_aabbCount = aabbCount;
 
 		ANKI_ASSERT(kMaxLodCount == 3);
@@ -115,8 +130,8 @@ void GpuVisibility::populateRenderGraph(RenderingContext& ctx)
 		unis->m_maxLodDistances[2] = kMaxF32;
 		unis->m_maxLodDistances[3] = kMaxF32;
 
-		unis->m_cameraOrigin = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
-		unis->m_viewProjectionMat = ctx.m_matrices.m_viewProjection;
+		unis->m_cameraOrigin = cameraPosition;
+		unis->m_viewProjectionMat = viewProjectionMat;
 
 		dispatchPPCompute(cmdb, 64, 1, aabbCount, 1);
 	});

+ 4 - 2
AnKi/Renderer/GpuVisibility.h

@@ -6,20 +6,22 @@
 #pragma once
 
 #include <AnKi/Renderer/RendererObject.h>
+#include <AnKi/Resource/RenderingKey.h>
 
 namespace anki {
 
 /// @addtogroup renderer
 /// @{
 
-/// XXX
+/// Performs GPU visibility for some pass.
 class GpuVisibility : public RendererObject
 {
 public:
 	Error init();
 
 	/// Populate the rendergraph.
-	void populateRenderGraph(RenderingContext& ctx);
+	void populateRenderGraph(RenderingTechnique technique, const Mat4& viewProjectionMat, Vec3 cameraPosition, RenderTargetHandle hzbRt,
+							 RenderGraphDescription& rgraph);
 
 	BufferHandle getMdiDrawCountsBufferHandle() const
 	{

+ 0 - 5
AnKi/Renderer/Renderer.cpp

@@ -45,7 +45,6 @@
 #include <AnKi/Renderer/VrsSriGeneration.h>
 #include <AnKi/Renderer/PackVisibleClusteredObjects.h>
 #include <AnKi/Renderer/Hzb.h>
-#include <AnKi/Renderer/GpuVisibility.h>
 
 namespace anki {
 
@@ -250,9 +249,6 @@ Error Renderer::initInternal(UVec2 swapchainResolution)
 	m_hzb.reset(newInstance<Hzb>(RendererMemoryPool::getSingleton()));
 	ANKI_CHECK(m_hzb->init());
 
-	m_gpuVisibility.reset(newInstance<GpuVisibility>(RendererMemoryPool::getSingleton()));
-	ANKI_CHECK(m_gpuVisibility->init());
-
 	// Init samplers
 	{
 		SamplerInitInfo sinit("NearestNearestClamp");
@@ -349,7 +345,6 @@ Error Renderer::populateRenderGraph(RenderingContext& ctx)
 	// Populate render graph. WARNING Watch the order
 	m_hzb->populateRenderGraph(ctx);
 	gpuSceneCopy(ctx);
-	m_gpuVisibility->populateRenderGraph(ctx);
 	m_packVisibleClustererObjects->populateRenderGraph(ctx);
 	m_genericCompute->populateRenderGraph(ctx);
 	m_clusterBinning->populateRenderGraph(ctx);

+ 0 - 1
AnKi/Renderer/RendererObject.defs.h

@@ -33,4 +33,3 @@ ANKI_RENDERER_OBJECT_DEF(IndirectDiffuse, indirectDiffuse)
 ANKI_RENDERER_OBJECT_DEF(VrsSriGeneration, vrsSriGeneration)
 ANKI_RENDERER_OBJECT_DEF(PackVisibleClusteredObjects, packVisibleClustererObjects)
 ANKI_RENDERER_OBJECT_DEF(Hzb, hzb)
-ANKI_RENDERER_OBJECT_DEF(GpuVisibility, gpuVisibility)