Browse Source

Break the command buffers

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
b2d2537a8d

+ 12 - 4
src/anki/renderer/FinalComposite.cpp

@@ -104,11 +104,19 @@ Error FinalComposite::loadColorGradingTexture(CString filename)
 
 
 Error FinalComposite::run(RenderingContext& ctx)
 Error FinalComposite::run(RenderingContext& ctx)
 {
 {
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-
 	// Get the drawing parameters
 	// Get the drawing parameters
-	Bool drawToDefaultFb = ctx.m_outFb.isCreated();
-	Bool dbgEnabled = m_r->getDbg().getEnabled();
+	const Bool drawToDefaultFb = ctx.m_outFb.isCreated();
+	const Bool dbgEnabled = m_r->getDbg().getEnabled();
+
+	CommandBufferPtr cmdb;
+	if(drawToDefaultFb)
+	{
+		cmdb = ctx.m_defaultFbCommandBuffer;
+	}
+	else
+	{
+		cmdb = ctx.m_commandBuffer;
+	}
 
 
 	// Bind stuff
 	// Bind stuff
 	cmdb->bindTextureAndSampler(
 	cmdb->bindTextureAndSampler(

+ 15 - 9
src/anki/renderer/MainRenderer.cpp

@@ -89,12 +89,16 @@ Error MainRenderer::render(RenderQueue& rqueue)
 	// First thing, reset the temp mem pool
 	// First thing, reset the temp mem pool
 	m_frameAlloc.getMemoryPool().reset();
 	m_frameAlloc.getMemoryPool().reset();
 
 
-	GrManager& gl = m_r->getGrManager();
+	// Create command buffers
+	GrManager& gr = m_r->getGrManager();
 	CommandBufferInitInfo cinf;
 	CommandBufferInitInfo cinf;
 	cinf.m_flags =
 	cinf.m_flags =
 		CommandBufferFlag::COMPUTE_WORK | CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::TRANSFER_WORK;
 		CommandBufferFlag::COMPUTE_WORK | CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::TRANSFER_WORK;
 	cinf.m_hints = m_cbInitHints;
 	cinf.m_hints = m_cbInitHints;
-	CommandBufferPtr cmdb = gl.newInstance<CommandBuffer>(cinf);
+	CommandBufferPtr cmdb = gr.newInstance<CommandBuffer>(cinf);
+
+	cinf.m_flags = CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::SMALL_BATCH;
+	CommandBufferPtr defaultFbCmdb = gr.newInstance<CommandBuffer>(cinf);
 
 
 	// Run renderer
 	// Run renderer
 	RenderingContext ctx(m_frameAlloc);
 	RenderingContext ctx(m_frameAlloc);
@@ -107,6 +111,7 @@ Error MainRenderer::render(RenderQueue& rqueue)
 	}
 	}
 
 
 	ctx.m_commandBuffer = cmdb;
 	ctx.m_commandBuffer = cmdb;
+	ctx.m_defaultFbCommandBuffer = defaultFbCmdb;
 	ctx.m_renderQueue = &rqueue;
 	ctx.m_renderQueue = &rqueue;
 	ctx.m_unprojParams = ctx.m_renderQueue->m_projectionMatrix.extractPerspectiveUnprojectionParams();
 	ctx.m_unprojParams = ctx.m_renderQueue->m_projectionMatrix.extractPerspectiveUnprojectionParams();
 	ANKI_CHECK(m_r->render(ctx));
 	ANKI_CHECK(m_r->render(ctx));
@@ -114,18 +119,19 @@ Error MainRenderer::render(RenderQueue& rqueue)
 	// Blit renderer's result to default FB if needed
 	// Blit renderer's result to default FB if needed
 	if(!m_rDrawToDefaultFb)
 	if(!m_rDrawToDefaultFb)
 	{
 	{
-		cmdb->beginRenderPass(m_defaultFb);
-		cmdb->setViewport(0, 0, m_width, m_height);
+		defaultFbCmdb->beginRenderPass(m_defaultFb);
+		defaultFbCmdb->setViewport(0, 0, m_width, m_height);
 
 
-		cmdb->bindShaderProgram(m_blitGrProg);
-		cmdb->bindTexture(0, 0, m_r->getFinalComposite().getRt());
+		defaultFbCmdb->bindShaderProgram(m_blitGrProg);
+		defaultFbCmdb->bindTexture(0, 0, m_r->getFinalComposite().getRt());
 
 
-		m_r->drawQuad(cmdb);
-		cmdb->endRenderPass();
+		m_r->drawQuad(defaultFbCmdb);
+		defaultFbCmdb->endRenderPass();
 	}
 	}
 
 
-	// Flush the command buffer
+	// Flush the command buffers
 	cmdb->flush();
 	cmdb->flush();
+	defaultFbCmdb->flush();
 
 
 	// Set the hints
 	// Set the hints
 	m_cbInitHints = cmdb->computeInitHints();
 	m_cbInitHints = cmdb->computeInitHints();

+ 1 - 0
src/anki/renderer/Renderer.h

@@ -42,6 +42,7 @@ public:
 	Vec4 m_unprojParams;
 	Vec4 m_unprojParams;
 
 
 	CommandBufferPtr m_commandBuffer; ///< Primary command buffer.
 	CommandBufferPtr m_commandBuffer; ///< Primary command buffer.
+	CommandBufferPtr m_defaultFbCommandBuffer; ///< The default framebuffer renderpass is in a separate cmdb.
 
 
 	StackAllocator<U8> m_tempAllocator;
 	StackAllocator<U8> m_tempAllocator;