Pārlūkot izejas kodu

Moving some static state to dynamic

Panagiotis Christopoulos Charitos 10 gadi atpakaļ
vecāks
revīzija
d37bde1a13

+ 3 - 0
include/anki/gr/CommandBuffer.h

@@ -118,6 +118,9 @@ public:
 	/// Set the viewport.
 	void setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy);
 
+	/// Set depth offset and units.
+	void setPolygonOffset(F32 offset, F32 units);
+
 	/// Bind pipeline.
 	void bindPipeline(PipelinePtr ppline);
 

+ 0 - 2
include/anki/gr/Pipeline.h

@@ -70,8 +70,6 @@ public:
 	Bool8 m_depthWriteEnabled = true;
 	CompareOperation m_depthCompareFunction = CompareOperation::LESS;
 	PixelFormat m_format;
-	F32 m_polygonOffsetFactor = 0.0;
-	F32 m_polygonOffsetUnits = 0.0;
 };
 
 class ColorAttachmentStateInfo

+ 15 - 0
include/anki/gr/gl/CommandBufferImpl.h

@@ -42,6 +42,15 @@ class CommandBufferImpl
 public:
 	using InitHints = CommandBufferInitHints;
 
+#if ANKI_ASSERTS_ENABLED
+	class StateSet
+	{
+	public:
+		Bool m_viewport = false;
+		Bool m_polygonOffset = false;
+	} m_stateSet;
+#endif
+
 	/// Default constructor
 	CommandBufferImpl(GrManager* manager)
 		: m_manager(manager)
@@ -85,6 +94,12 @@ public:
 #endif
 	}
 
+	void checkDrawcall() const
+	{
+		ANKI_ASSERT(m_stateSet.m_viewport == true);
+		ANKI_ASSERT(m_stateSet.m_polygonOffset == true);
+	}
+
 	/// Make immutable
 	void makeImmutable()
 	{

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

@@ -45,7 +45,8 @@ public:
 	ANKI_USE_RESULT Error render(FrustumComponent& frc,
 		RenderingStage stage,
 		Pass pass,
-		SArray<CommandBufferPtr>& cmdbs);
+		SArray<CommandBufferPtr>& cmdbs,
+		const UVec2& screenSize);
 
 private:
 	Renderer* m_r;

+ 40 - 0
src/gr/gl/CommandBuffer.cpp

@@ -86,9 +86,45 @@ public:
 
 void CommandBuffer::setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy)
 {
+	m_impl->m_stateSet.m_viewport = true;
 	m_impl->pushBackNewCommand<ViewportCommand>(minx, miny, maxx, maxy);
 }
 
+//==============================================================================
+class SetPolygonOffsetCommand final : public GlCommand
+{
+public:
+	F32 m_offset;
+	F32 m_units;
+
+	SetPolygonOffsetCommand(F32 offset, F32 units)
+		: m_offset(offset)
+		, m_units(units)
+	{
+	}
+
+	Error operator()(GlState& state)
+	{
+		if(m_offset == 0.0 && m_units == 0.0)
+		{
+			glDisable(GL_POLYGON_OFFSET_FILL);
+		}
+		else
+		{
+			glEnable(GL_POLYGON_OFFSET_FILL);
+			glPolygonOffset(m_offset, m_units);
+		}
+
+		return ErrorCode::NONE;
+	}
+};
+
+void CommandBuffer::setPolygonOffset(F32 offset, F32 units)
+{
+	m_impl->m_stateSet.m_polygonOffset = true;
+	m_impl->pushBackNewCommand<SetPolygonOffsetCommand>(offset, units);
+}
+
 //==============================================================================
 class BindPipelineCommand final : public GlCommand
 {
@@ -234,6 +270,7 @@ void CommandBuffer::drawElements(U32 count,
 	DrawElementsIndirectInfo info(
 		count, instanceCount, firstIndex, baseVertex, baseInstance);
 
+	m_impl->checkDrawcall();
 	m_impl->pushBackNewCommand<DrawElementsCondCommand>(info);
 }
 
@@ -273,6 +310,7 @@ void CommandBuffer::drawArrays(
 {
 	DrawArraysIndirectInfo info(count, instanceCount, first, baseInstance);
 
+	m_impl->checkDrawcall();
 	m_impl->pushBackNewCommand<DrawArraysCondCommand>(info);
 }
 
@@ -287,6 +325,7 @@ void CommandBuffer::drawElementsConditional(OcclusionQueryPtr query,
 	DrawElementsIndirectInfo info(
 		count, instanceCount, firstIndex, baseVertex, baseInstance);
 
+	m_impl->checkDrawcall();
 	m_impl->pushBackNewCommand<DrawElementsCondCommand>(info, query);
 }
 
@@ -299,6 +338,7 @@ void CommandBuffer::drawArraysConditional(OcclusionQueryPtr query,
 {
 	DrawArraysIndirectInfo info(count, instanceCount, first, baseInstance);
 
+	m_impl->checkDrawcall();
 	m_impl->pushBackNewCommand<DrawArraysCondCommand>(info, query);
 }
 

+ 0 - 12
src/gr/gl/PipelineImpl.cpp

@@ -551,18 +551,6 @@ void PipelineImpl::setDepthStencilState(GlState& state) const
 		glEnable(GL_DEPTH_TEST);
 	}
 
-	if(m_in.m_depthStencil.m_polygonOffsetFactor == 0.0
-		&& m_in.m_depthStencil.m_polygonOffsetUnits == 0.0)
-	{
-		glDisable(GL_POLYGON_OFFSET_FILL);
-	}
-	else
-	{
-		glEnable(GL_POLYGON_OFFSET_FILL);
-		glPolygonOffset(m_in.m_depthStencil.m_polygonOffsetFactor,
-			m_in.m_depthStencil.m_polygonOffsetUnits);
-	}
-
 	glDepthFunc(m_cache.m_depthCompareFunction);
 }
 

+ 18 - 1
src/renderer/Drawer.cpp

@@ -38,6 +38,7 @@ struct RenderContext
 	U m_cachedTrfCount = 0;
 	F32 m_flod;
 	DynamicBufferInfo m_dynBufferInfo;
+	UVec2 m_screenSize;
 };
 
 /// Visitor that sets a uniform
@@ -210,6 +211,19 @@ public:
 		U problemSize = vis.getRenderablesEnd() - vis.getRenderablesBegin();
 		choseStartEnd(threadId, threadsCount, problemSize, start, end);
 
+		// Set the state of the command buffer
+		if(m_ctx.m_pass == Pass::SM)
+		{
+			m_ctx.m_cmdb->setPolygonOffset(1.0, 2.0);
+		}
+		else
+		{
+			m_ctx.m_cmdb->setPolygonOffset(0.0, 0.0);
+		}
+
+		m_ctx.m_cmdb->setViewport(
+			0, 0, m_ctx.m_screenSize.x(), m_ctx.m_screenSize.y());
+
 		for(U i = start; i < end; ++i)
 		{
 			m_ctx.m_visibleNode = vis.getRenderablesBegin() + i;
@@ -282,7 +296,8 @@ void RenderableDrawer::setupUniforms(RenderContext& ctx,
 Error RenderableDrawer::render(FrustumComponent& frc,
 	RenderingStage stage,
 	Pass pass,
-	SArray<CommandBufferPtr>& cmdbs)
+	SArray<CommandBufferPtr>& cmdbs,
+	const UVec2& screenSize)
 {
 	Error err = ErrorCode::NONE;
 	ANKI_ASSERT(cmdbs.getSize() == m_r->getThreadPool().getThreadsCount()
@@ -301,6 +316,7 @@ Error RenderableDrawer::render(FrustumComponent& frc,
 			task.m_ctx.m_frc = &frc;
 			task.m_ctx.m_stage = stage;
 			task.m_ctx.m_pass = pass;
+			task.m_ctx.m_screenSize = screenSize;
 
 			threadPool.assignNewTask(i, &task);
 		}
@@ -315,6 +331,7 @@ Error RenderableDrawer::render(FrustumComponent& frc,
 		task.m_ctx.m_frc = &frc;
 		task.m_ctx.m_stage = stage;
 		task.m_ctx.m_pass = pass;
+		task.m_ctx.m_screenSize = screenSize;
 
 		err = task(0, 1);
 	}

+ 2 - 1
src/renderer/Fs.cpp

@@ -82,7 +82,8 @@ Error Fs::run(CommandBufferPtr& cmdb)
 
 	SArray<CommandBufferPtr> cmdbs(&cmdb, 1);
 	ANKI_CHECK(m_r->getSceneDrawer().render(
-		camFr, RenderingStage::BLEND, Pass::MS_FS, cmdbs));
+		camFr, RenderingStage::BLEND, Pass::MS_FS, cmdbs,
+		UVec2(m_r->getWidth() / 2, m_r->getHeight() / 2)));
 
 	return ErrorCode::NONE;
 }

+ 3 - 0
src/renderer/MainRenderer.cpp

@@ -125,6 +125,9 @@ Error MainRenderer::render(SceneGraph& scene)
 	GrManager& gl = m_r->getGrManager();
 	CommandBufferPtr cmdb = gl.newInstance<CommandBuffer>(m_cbInitHints);
 
+	// Set some of the dynamic state
+	cmdb->setPolygonOffset(0.0, 0.0);
+
 	// Find where the m_r should draw
 	Bool rDrawToDefault;
 	if(m_renderingQuality == 1.0 && !m_r->getDbg().getEnabled()

+ 2 - 1
src/renderer/Ms.cpp

@@ -138,7 +138,8 @@ Error Ms::run(CommandBufferPtr& cmdb)
 	SArray<CommandBufferPtr> cmdbs(
 		&m_secondLevelCmdbs[0], m_secondLevelCmdbs.getSize());
 	ANKI_CHECK(m_r->getSceneDrawer().render(
-		frc, RenderingStage::MATERIAL, Pass::MS_FS, cmdbs));
+		frc, RenderingStage::MATERIAL, Pass::MS_FS, cmdbs, 
+		UVec2(m_r->getWidth(), m_r->getHeight())));
 
 	for(U i = 0; i < m_secondLevelCmdbs.getSize(); ++i)
 	{

+ 4 - 2
src/renderer/Sm.cpp

@@ -219,7 +219,8 @@ Error Sm::doSpotLight(SceneNode& light, CommandBufferPtr& cmdBuff)
 	FrustumComponent& fr = light.getComponent<FrustumComponent>();
 	SArray<CommandBufferPtr> cmdbs(&cmdBuff, 1);
 	ANKI_CHECK(m_r->getSceneDrawer().render(
-		fr, RenderingStage::MATERIAL, Pass::SM, cmdbs));
+		fr, RenderingStage::MATERIAL, Pass::SM, cmdbs,
+		UVec2(m_resolution, m_resolution)));
 
 	ANKI_TRACE_INC_COUNTER(RENDERER_SHADOW_PASSES, 1);
 	return ErrorCode::NONE;
@@ -245,7 +246,8 @@ Error Sm::doOmniLight(SceneNode& light, CommandBufferPtr& cmdBuff)
 
 			SArray<CommandBufferPtr> cmdbs(&cmdBuff, 1);
 			ANKI_CHECK(m_r->getSceneDrawer().render(
-				fr, RenderingStage::MATERIAL, Pass::SM, cmdbs));
+				fr, RenderingStage::MATERIAL, Pass::SM, cmdbs, 
+				UVec2(m_resolution, m_resolution)));
 
 			++frCount;
 			return ErrorCode::NONE;

+ 0 - 2
src/resource/Model.cpp

@@ -220,8 +220,6 @@ void ModelPatch::computePipelineInitInfo(
 	if(key.m_pass == Pass::SM)
 	{
 		ds.m_format = Sm::DEPTH_RT_PIXEL_FORMAT;
-		ds.m_polygonOffsetFactor = 1.0;
-		ds.m_polygonOffsetUnits = 2.0;
 	}
 	else if(m_mtl->getForwardShading())
 	{