Browse Source

Fix the build and fix a serious bug in command buffer re-use

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
39507a4c2f

+ 7 - 1
src/anki/core/App.cpp

@@ -80,6 +80,7 @@ public:
 
 
 	U64 m_vkCpuMem = 0;
 	U64 m_vkCpuMem = 0;
 	U64 m_vkGpuMem = 0;
 	U64 m_vkGpuMem = 0;
+	U32 m_vkCmdbCount = 0;
 
 
 	static const U32 BUFFERED_FRAMES = 16;
 	static const U32 BUFFERED_FRAMES = 16;
 	U32 m_bufferedFrames = 0;
 	U32 m_bufferedFrames = 0;
@@ -107,7 +108,7 @@ public:
 
 
 		nk_style_push_style_item(ctx, &ctx->style.window.fixed_background, nk_style_item_color(nk_rgba(0, 0, 0, 128)));
 		nk_style_push_style_item(ctx, &ctx->style.window.fixed_background, nk_style_item_color(nk_rgba(0, 0, 0, 128)));
 
 
-		if(nk_begin(ctx, "Stats", nk_rect(5, 5, 230, 290), 0))
+		if(nk_begin(ctx, "Stats", nk_rect(5, 5, 230, 350), 0))
 		{
 		{
 			nk_layout_row_dynamic(ctx, 17, 1);
 			nk_layout_row_dynamic(ctx, 17, 1);
 
 
@@ -125,6 +126,10 @@ public:
 			labelUint(ctx, m_freeCount, "Total frees");
 			labelUint(ctx, m_freeCount, "Total frees");
 			labelBytes(ctx, m_vkCpuMem, "Vulkan CPU");
 			labelBytes(ctx, m_vkCpuMem, "Vulkan CPU");
 			labelBytes(ctx, m_vkGpuMem, "Vulkan GPU");
 			labelBytes(ctx, m_vkGpuMem, "Vulkan GPU");
+
+			nk_label(ctx, " ", NK_TEXT_ALIGN_LEFT);
+			nk_label(ctx, "Vulkan:", NK_TEXT_ALIGN_LEFT);
+			labelUint(ctx, m_vkCmdbCount, "Cmd buffers");
 		}
 		}
 
 
 		nk_style_pop_style_item(ctx);
 		nk_style_pop_style_item(ctx);
@@ -666,6 +671,7 @@ Error App::mainLoop()
 			GrManagerStats grStats = m_gr->getStats();
 			GrManagerStats grStats = m_gr->getStats();
 			statsUi.m_vkCpuMem = grStats.m_cpuMemory;
 			statsUi.m_vkCpuMem = grStats.m_cpuMemory;
 			statsUi.m_vkGpuMem = grStats.m_gpuMemory;
 			statsUi.m_vkGpuMem = grStats.m_gpuMemory;
+			statsUi.m_vkCmdbCount = grStats.m_commandBufferCount;
 		}
 		}
 
 
 		++m_globalTimestamp;
 		++m_globalTimestamp;

+ 3 - 2
src/anki/gr/GrManager.h

@@ -36,8 +36,9 @@ public:
 class GrManagerStats
 class GrManagerStats
 {
 {
 public:
 public:
-	PtrSize m_cpuMemory;
-	PtrSize m_gpuMemory;
+	PtrSize m_cpuMemory = 0;
+	PtrSize m_gpuMemory = 0;
+	U32 m_commandBufferCount = 0;
 };
 };
 
 
 /// The graphics manager, owner of all graphics objects.
 /// The graphics manager, owner of all graphics objects.

+ 5 - 0
src/anki/gr/gl/GrManager.cpp

@@ -141,4 +141,9 @@ RenderGraphPtr GrManager::newRenderGraph()
 
 
 #undef ANKI_SAFE_CONSTRUCT
 #undef ANKI_SAFE_CONSTRUCT
 
 
+GrManagerStats GrManager::getStats() const
+{
+	return GrManagerStats();
+}
+
 } // end namespace anki
 } // end namespace anki

+ 14 - 3
src/anki/gr/vulkan/CommandBufferFactory.cpp

@@ -86,9 +86,11 @@ void CommandBufferThreadAllocator::destroy()
 	ANKI_ASSERT(m_createdCmdbs.load() == 0 && "Someone still holds references to command buffers");
 	ANKI_ASSERT(m_createdCmdbs.load() == 0 && "Someone still holds references to command buffers");
 }
 }
 
 
-Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& outPtr)
+Error CommandBufferThreadAllocator::newCommandBuffer(
+	CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& outPtr, Bool& createdNew)
 {
 {
 	cmdbFlags = cmdbFlags & (CommandBufferFlag::SECOND_LEVEL | CommandBufferFlag::SMALL_BATCH);
 	cmdbFlags = cmdbFlags & (CommandBufferFlag::SECOND_LEVEL | CommandBufferFlag::SMALL_BATCH);
+	createdNew = false;
 
 
 	const Bool secondLevel = !!(cmdbFlags & CommandBufferFlag::SECOND_LEVEL);
 	const Bool secondLevel = !!(cmdbFlags & CommandBufferFlag::SECOND_LEVEL);
 	const Bool smallBatch = !!(cmdbFlags & CommandBufferFlag::SMALL_BATCH);
 	const Bool smallBatch = !!(cmdbFlags & CommandBufferFlag::SMALL_BATCH);
@@ -132,7 +134,7 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 				// Can re-use it
 				// Can re-use it
 				if(out)
 				if(out)
 				{
 				{
-					type.m_readyCmdbs.pushBack(mcmdb);
+					inUseCmdbs.pushBack(mcmdb);
 				}
 				}
 				else
 				else
 				{
 				{
@@ -188,6 +190,8 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 		newCmdb->m_flags = cmdbFlags;
 		newCmdb->m_flags = cmdbFlags;
 
 
 		out = newCmdb;
 		out = newCmdb;
+
+		createdNew = true;
 	}
 	}
 	else
 	else
 	{
 	{
@@ -195,6 +199,8 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 	}
 	}
 
 
 	ANKI_ASSERT(out && out->m_refcount.load() == 0);
 	ANKI_ASSERT(out && out->m_refcount.load() == 0);
+	ANKI_ASSERT(!!(out->m_flags & CommandBufferFlag::SECOND_LEVEL) == secondLevel);
+	ANKI_ASSERT(!!(out->m_flags & CommandBufferFlag::SMALL_BATCH) == smallBatch);
 	outPtr.reset(out);
 	outPtr.reset(out);
 	return Error::NONE;
 	return Error::NONE;
 }
 }
@@ -291,7 +297,12 @@ Error CommandBufferFactory::newCommandBuffer(ThreadId tid, CommandBufferFlag cmd
 	}
 	}
 
 
 	ANKI_ASSERT(alloc);
 	ANKI_ASSERT(alloc);
-	ANKI_CHECK(alloc->newCommandBuffer(cmdbFlags, ptr));
+	Bool createdNew;
+	ANKI_CHECK(alloc->newCommandBuffer(cmdbFlags, ptr, createdNew));
+	if(createdNew)
+	{
+		m_createdCmdBufferCount.fetchAdd(1);
+	}
 
 
 	return Error::NONE;
 	return Error::NONE;
 }
 }

+ 9 - 1
src/anki/gr/vulkan/CommandBufferFactory.h

@@ -113,7 +113,7 @@ public:
 	GrAllocator<U8>& getAllocator();
 	GrAllocator<U8>& getAllocator();
 
 
 	/// Request a new command buffer.
 	/// Request a new command buffer.
-	ANKI_USE_RESULT Error newCommandBuffer(CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& ptr);
+	ANKI_USE_RESULT Error newCommandBuffer(CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& ptr, Bool& createdNew);
 
 
 	/// It will recycle it.
 	/// It will recycle it.
 	void deleteCommandBuffer(MicroCommandBuffer* ptr);
 	void deleteCommandBuffer(MicroCommandBuffer* ptr);
@@ -161,6 +161,12 @@ public:
 	/// Request a new command buffer.
 	/// Request a new command buffer.
 	ANKI_USE_RESULT Error newCommandBuffer(ThreadId tid, CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& ptr);
 	ANKI_USE_RESULT Error newCommandBuffer(ThreadId tid, CommandBufferFlag cmdbFlags, MicroCommandBufferPtr& ptr);
 
 
+	/// Stats.
+	U32 getCreatedCommandBufferCount() const
+	{
+		return m_createdCmdBufferCount.load();
+	}
+
 private:
 private:
 	GrAllocator<U8> m_alloc;
 	GrAllocator<U8> m_alloc;
 	VkDevice m_dev = VK_NULL_HANDLE;
 	VkDevice m_dev = VK_NULL_HANDLE;
@@ -168,6 +174,8 @@ private:
 
 
 	DynamicArray<CommandBufferThreadAllocator*> m_threadAllocs;
 	DynamicArray<CommandBufferThreadAllocator*> m_threadAllocs;
 	SpinLock m_threadAllocMtx;
 	SpinLock m_threadAllocMtx;
+
+	Atomic<U32> m_createdCmdBufferCount = {0};
 };
 };
 /// @}
 /// @}
 
 

+ 1 - 0
src/anki/gr/vulkan/GrManager.cpp

@@ -86,6 +86,7 @@ GrManagerStats GrManager::getStats() const
 	GrManagerStats out;
 	GrManagerStats out;
 
 
 	self.getGpuMemoryManager().getAllocatedMemory(out.m_gpuMemory, out.m_cpuMemory);
 	self.getGpuMemoryManager().getAllocatedMemory(out.m_gpuMemory, out.m_cpuMemory);
+	out.m_commandBufferCount = self.getCommandBufferFactory().getCreatedCommandBufferCount();
 
 
 	return out;
 	return out;
 }
 }

+ 5 - 0
src/anki/gr/vulkan/GrManagerImpl.h

@@ -80,6 +80,11 @@ public:
 		return m_cmdbFactory;
 		return m_cmdbFactory;
 	}
 	}
 
 
+	const CommandBufferFactory& getCommandBufferFactory() const
+	{
+		return m_cmdbFactory;
+	}
+
 	MicroFencePtr newFence()
 	MicroFencePtr newFence()
 	{
 	{
 		return m_fences.newInstance();
 		return m_fences.newInstance();