Переглянути джерело

Fix a bug that was hanging AMD. Optimize some passes by using lower LODs

Panagiotis Christopoulos Charitos 6 роки тому
батько
коміт
667cf34550

+ 1 - 1
shaders/GBufferCommonFrag.glsl

@@ -95,7 +95,7 @@ Vec2 computeTextureCoordParallax(texture2D heightMap, sampler sampl, Vec2 uv, F3
 
 
 	const F32 factor0 = -dot(E, normTangentSpace);
 	const F32 factor0 = -dot(E, normTangentSpace);
 	const F32 factor1 = in_distFromTheCamera / -MAX_EFFECTIVE_DISTANCE;
 	const F32 factor1 = in_distFromTheCamera / -MAX_EFFECTIVE_DISTANCE;
-	const F32 factor = (1.0 - factor0) * (1.0 - factor1);
+	const F32 factor = saturate((1.0 - factor0) * (1.0 - factor1));
 	const F32 sampleCountf = mix(F32(MIN_SAMPLES), F32(MAX_SAMPLES), factor);
 	const F32 sampleCountf = mix(F32(MIN_SAMPLES), F32(MAX_SAMPLES), factor);
 
 
 	const F32 stepSize = 1.0 / sampleCountf;
 	const F32 stepSize = 1.0 / sampleCountf;

+ 8 - 10
src/anki/renderer/Drawer.cpp

@@ -26,6 +26,7 @@ public:
 	Array<U8, MAX_INSTANCES> m_cachedRenderElementLods;
 	Array<U8, MAX_INSTANCES> m_cachedRenderElementLods;
 	Array<const void*, MAX_INSTANCES> m_userData;
 	Array<const void*, MAX_INSTANCES> m_userData;
 	U m_cachedRenderElementCount = 0;
 	U m_cachedRenderElementCount = 0;
+	U m_minLod = 0;
 };
 };
 
 
 /// Check if the drawcalls can be merged.
 /// Check if the drawcalls can be merged.
@@ -45,7 +46,8 @@ void RenderableDrawer::drawRange(Pass pass,
 	CommandBufferPtr cmdb,
 	CommandBufferPtr cmdb,
 	SamplerPtr sampler,
 	SamplerPtr sampler,
 	const RenderableQueueElement* begin,
 	const RenderableQueueElement* begin,
-	const RenderableQueueElement* end)
+	const RenderableQueueElement* end,
+	U minLod)
 {
 {
 	ANKI_ASSERT(begin && end && begin < end);
 	ANKI_ASSERT(begin && end && begin < end);
 
 
@@ -61,6 +63,9 @@ void RenderableDrawer::drawRange(Pass pass,
 	ctx.m_queueCtx.m_key = RenderingKey(pass, 0, 1, false, false);
 	ctx.m_queueCtx.m_key = RenderingKey(pass, 0, 1, false, false);
 	ctx.m_queueCtx.m_debugDraw = false;
 	ctx.m_queueCtx.m_debugDraw = false;
 
 
+	ANKI_ASSERT(minLod < MAX_LOD_COUNT);
+	ctx.m_minLod = minLod;
+
 	for(; begin != end; ++begin)
 	for(; begin != end; ++begin)
 	{
 	{
 		ctx.m_renderableElement = begin;
 		ctx.m_renderableElement = begin;
@@ -97,15 +102,8 @@ void RenderableDrawer::drawSingle(DrawContext& ctx)
 
 
 	const RenderableQueueElement& rqel = *ctx.m_renderableElement;
 	const RenderableQueueElement& rqel = *ctx.m_renderableElement;
 
 
-	U8 lod;
-	if(ctx.m_queueCtx.m_key.m_pass == Pass::SM)
-	{
-		lod = MAX_LOD_COUNT - 1;
-	}
-	else
-	{
-		lod = min<U8>(m_r->calculateLod(rqel.m_distanceFromCamera), MAX_LOD_COUNT - 1);
-	}
+	U8 lod = min<U8>(m_r->calculateLod(rqel.m_distanceFromCamera), MAX_LOD_COUNT - 1);
+	lod = max<U8>(lod, ctx.m_minLod);
 
 
 	const Bool shouldFlush =
 	const Bool shouldFlush =
 		ctx.m_cachedRenderElementCount > 0
 		ctx.m_cachedRenderElementCount > 0

+ 2 - 1
src/anki/renderer/Drawer.h

@@ -39,7 +39,8 @@ public:
 		CommandBufferPtr cmdb,
 		CommandBufferPtr cmdb,
 		SamplerPtr sampler,
 		SamplerPtr sampler,
 		const RenderableQueueElement* begin,
 		const RenderableQueueElement* begin,
-		const RenderableQueueElement* end);
+		const RenderableQueueElement* end,
+		U minLod = 0);
 
 
 private:
 private:
 	Renderer* m_r;
 	Renderer* m_r;

+ 4 - 2
src/anki/renderer/GlobalIllumination.cpp

@@ -598,7 +598,8 @@ void GlobalIllumination::runGBufferInThread(RenderPassWorkContext& rgraphCtx, In
 			cmdb,
 			cmdb,
 			m_r->getSamplers().m_trilinearRepeat,
 			m_r->getSamplers().m_trilinearRepeat,
 			rqueue.m_renderables.getBegin(),
 			rqueue.m_renderables.getBegin(),
-			rqueue.m_renderables.getEnd());
+			rqueue.m_renderables.getEnd(),
+			MAX_LOD_COUNT - 1);
 	}
 	}
 
 
 	// It's secondary, no need to restore the state
 	// It's secondary, no need to restore the state
@@ -634,7 +635,8 @@ void GlobalIllumination::runShadowmappingInThread(RenderPassWorkContext& rgraphC
 			cmdb,
 			cmdb,
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			cascadeRenderQueue.m_renderables.getBegin(),
 			cascadeRenderQueue.m_renderables.getBegin(),
-			cascadeRenderQueue.m_renderables.getEnd());
+			cascadeRenderQueue.m_renderables.getEnd(),
+			MAX_LOD_COUNT - 1);
 	}
 	}
 
 
 	// It's secondary, no need to restore the state
 	// It's secondary, no need to restore the state

+ 4 - 2
src/anki/renderer/ProbeReflections.cpp

@@ -360,7 +360,8 @@ void ProbeReflections::runGBuffer(U32 faceIdx, CommandBufferPtr& cmdb)
 			cmdb,
 			cmdb,
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			rqueue.m_renderables.getBegin(),
 			rqueue.m_renderables.getBegin(),
-			rqueue.m_renderables.getEnd());
+			rqueue.m_renderables.getEnd(),
+			MAX_LOD_COUNT - 1);
 	}
 	}
 
 
 	// Restore state
 	// Restore state
@@ -760,7 +761,8 @@ void ProbeReflections::runShadowMapping(U32 faceIdx, CommandBufferPtr& cmdb)
 		cmdb,
 		cmdb,
 		m_r->getSamplers().m_trilinearRepeatAniso,
 		m_r->getSamplers().m_trilinearRepeatAniso,
 		cascadeRenderQueue.m_renderables.getBegin(),
 		cascadeRenderQueue.m_renderables.getBegin(),
-		cascadeRenderQueue.m_renderables.getEnd());
+		cascadeRenderQueue.m_renderables.getEnd(),
+		MAX_LOD_COUNT - 1);
 
 
 	cmdb->setPolygonOffset(0.0f, 0.0f);
 	cmdb->setPolygonOffset(0.0f, 0.0f);
 }
 }

+ 2 - 1
src/anki/renderer/ShadowMapping.cpp

@@ -229,7 +229,8 @@ void ShadowMapping::runShadowMapping(RenderPassWorkContext& rgraphCtx)
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			m_r->getSamplers().m_trilinearRepeatAniso,
 			work.m_renderQueue->m_renderables.getBegin() + work.m_firstRenderableElement,
 			work.m_renderQueue->m_renderables.getBegin() + work.m_firstRenderableElement,
 			work.m_renderQueue->m_renderables.getBegin() + work.m_firstRenderableElement
 			work.m_renderQueue->m_renderables.getBegin() + work.m_firstRenderableElement
-				+ work.m_renderableElementCount);
+				+ work.m_renderableElementCount,
+			MAX_LOD_COUNT - 1);
 	}
 	}
 }
 }