Panagiotis Christopoulos Charitos 8 лет назад
Родитель
Сommit
a6b053b454

+ 2 - 12
src/anki/gr/vulkan/CommandBufferImpl.cpp

@@ -41,22 +41,11 @@ CommandBufferImpl::~CommandBufferImpl()
 
 
 Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 {
 {
+	// Store some of the init info for later
 	m_flags = init.m_flags;
 	m_flags = init.m_flags;
-	m_tid = Thread::getCurrentThreadId();
-
-	ANKI_CHECK(getGrManagerImpl().getCommandBufferFactory().newCommandBuffer(m_tid, m_flags, m_microCmdb));
-
-	m_alloc = m_microCmdb->getFastAllocator();
-
-	m_texUsageTracker.init(m_alloc);
-
-	m_handle = m_microCmdb->getHandle();
-	ANKI_ASSERT(m_handle);
-
 	if(!!(m_flags & CommandBufferFlag::SECOND_LEVEL))
 	if(!!(m_flags & CommandBufferFlag::SECOND_LEVEL))
 	{
 	{
 		m_activeFb = init.m_framebuffer;
 		m_activeFb = init.m_framebuffer;
-		m_state.beginRenderPass(m_activeFb);
 	}
 	}
 
 
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
@@ -64,6 +53,7 @@ Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 
 
 void CommandBufferImpl::beginRecording()
 void CommandBufferImpl::beginRecording()
 {
 {
+	// Do the begin
 	VkCommandBufferInheritanceInfo inheritance = {};
 	VkCommandBufferInheritanceInfo inheritance = {};
 	inheritance.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
 	inheritance.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
 
 

+ 8 - 2
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -326,16 +326,19 @@ public:
 
 
 	void informTextureSurfaceCurrentUsage(TexturePtr& tex, const TextureSurfaceInfo& surf, TextureUsageBit crntUsage)
 	void informTextureSurfaceCurrentUsage(TexturePtr& tex, const TextureSurfaceInfo& surf, TextureUsageBit crntUsage)
 	{
 	{
+		lazyInit();
 		tex->m_impl->updateTracker(surf, crntUsage, m_texUsageTracker);
 		tex->m_impl->updateTracker(surf, crntUsage, m_texUsageTracker);
 	}
 	}
 
 
 	void informTextureVolumeCurrentUsage(TexturePtr& tex, const TextureVolumeInfo& vol, TextureUsageBit crntUsage)
 	void informTextureVolumeCurrentUsage(TexturePtr& tex, const TextureVolumeInfo& vol, TextureUsageBit crntUsage)
 	{
 	{
+		lazyInit();
 		tex->m_impl->updateTracker(vol, crntUsage, m_texUsageTracker);
 		tex->m_impl->updateTracker(vol, crntUsage, m_texUsageTracker);
 	}
 	}
 
 
 	void informTextureCurrentUsage(TexturePtr& tex, TextureUsageBit crntUsage)
 	void informTextureCurrentUsage(TexturePtr& tex, TextureUsageBit crntUsage)
 	{
 	{
+		lazyInit();
 		tex->m_impl->updateTracker(crntUsage, m_texUsageTracker);
 		tex->m_impl->updateTracker(crntUsage, m_texUsageTracker);
 	}
 	}
 
 
@@ -350,8 +353,9 @@ private:
 	Bool8 m_renderedToDefaultFb = false;
 	Bool8 m_renderedToDefaultFb = false;
 	Bool8 m_finalized = false;
 	Bool8 m_finalized = false;
 	Bool8 m_empty = true;
 	Bool8 m_empty = true;
-	Bool m_beganRecording = false;
-	ThreadId m_tid = 0;
+	Bool8 m_beganRecording = false;
+	Bool8 m_initialized = false;
+	ThreadId m_tid = ~ThreadId(0);
 #if ANKI_EXTRA_CHECKS
 #if ANKI_EXTRA_CHECKS
 	U32 m_commandCount = 0;
 	U32 m_commandCount = 0;
 #endif
 #endif
@@ -431,6 +435,8 @@ private:
 	/// Track texture usage.
 	/// Track texture usage.
 	TextureUsageTracker m_texUsageTracker;
 	TextureUsageTracker m_texUsageTracker;
 
 
+	void lazyInit();
+
 	/// Some common operations per command.
 	/// Some common operations per command.
 	void commandCommon();
 	void commandCommon();
 
 

+ 33 - 4
src/anki/gr/vulkan/CommandBufferImpl.inl.h

@@ -580,11 +580,9 @@ inline void CommandBufferImpl::drawcallCommon()
 
 
 inline void CommandBufferImpl::commandCommon()
 inline void CommandBufferImpl::commandCommon()
 {
 {
-	ANKI_ASSERT(Thread::getCurrentThreadId() == m_tid
-		&& "Commands must be recorder and flushed by the thread this command buffer was created");
-
 	ANKI_ASSERT(!m_finalized);
 	ANKI_ASSERT(!m_finalized);
-	ANKI_ASSERT(m_handle);
+
+	lazyInit();
 
 
 #if ANKI_EXTRA_CHECKS
 #if ANKI_EXTRA_CHECKS
 	++m_commandCount;
 	++m_commandCount;
@@ -597,6 +595,37 @@ inline void CommandBufferImpl::commandCommon()
 		beginRecording();
 		beginRecording();
 		m_beganRecording = true;
 		m_beganRecording = true;
 	}
 	}
+
+	ANKI_ASSERT(Thread::getCurrentThreadId() == m_tid
+		&& "Commands must be recorder and flushed by the thread this command buffer was created");
+
+	ANKI_ASSERT(m_handle);
+}
+
+inline void CommandBufferImpl::lazyInit()
+{
+	if(m_initialized)
+	{
+		return;
+	}
+	m_initialized = true;
+
+	m_tid = Thread::getCurrentThreadId();
+
+	if(getGrManagerImpl().getCommandBufferFactory().newCommandBuffer(m_tid, m_flags, m_microCmdb))
+	{
+		ANKI_VK_LOGF("Cannot recover");
+	}
+	m_handle = m_microCmdb->getHandle();
+
+	m_alloc = m_microCmdb->getFastAllocator();
+
+	m_texUsageTracker.init(m_alloc);
+
+	if(!!(m_flags & CommandBufferFlag::SECOND_LEVEL))
+	{
+		m_state.beginRenderPass(m_activeFb);
+	}
 }
 }
 
 
 inline void CommandBufferImpl::flushBatches(CommandBufferCommandType type)
 inline void CommandBufferImpl::flushBatches(CommandBufferCommandType type)