Browse Source

Some GR refactoring

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
c992e7ca8b

+ 14 - 8
include/anki/gr/CommandBuffer.h

@@ -79,8 +79,10 @@ private:
 };
 
 /// Command buffer initialization flags.
-enum class CommandBufferFlag
+enum class CommandBufferFlag : U8
 {
+	NONE = 0,
+
 	SECOND_LEVEL = 1 << 0,
 
 	/// The command buffer is the frame's first. Or one of the first.
@@ -90,7 +92,16 @@ enum class CommandBufferFlag
 	FRAME_LAST = 1 << 2,
 
 	/// It will contain a handfull of commands.
-	SMALL_BATCH = 1 << 3
+	SMALL_BATCH = 1 << 3,
+
+	/// Will contain graphics work.
+	GRAPHICS_WORK = 1 << 4,
+
+	/// Will contain transfer commands.
+	TRANSFER_WORK = 1 << 5,
+
+	/// Will contain compute work.
+	COMPUTE_WORK = 1 << 6,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(CommandBufferFlag, inline)
 
@@ -98,15 +109,10 @@ ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(CommandBufferFlag, inline)
 class CommandBufferInitInfo
 {
 public:
-	Bool m_secondLevel = false;
 	FramebufferPtr m_framebuffer; ///< For second level command buffers.
 	CommandBufferInitHints m_hints;
 
-	/// Set it to true if this command buffer is the frame's first.
-	Bool m_frameFirstCommandBuffer = false;
-
-	/// Set it to true if this command buffer is the frame's last.
-	Bool m_frameLastCommandBuffer = false;
+	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
 };
 
 /// Command buffer.

+ 23 - 37
include/anki/gr/vulkan/CommandBufferImpl.h

@@ -6,6 +6,10 @@
 #pragma once
 
 #include <anki/gr/vulkan/VulkanObject.h>
+#include <anki/gr/CommandBuffer.h>
+
+#include <anki/gr/vulkan/TextureImpl.h>
+
 #include <anki/util/List.h>
 
 namespace anki
@@ -41,12 +45,14 @@ public:
 
 	Bool isTheFirstFramebufferOfTheFrame() const
 	{
-		return m_frameFirst;
+		return (m_flags & CommandBufferFlag::FRAME_FIRST)
+			== CommandBufferFlag::FRAME_FIRST;
 	}
 
 	Bool isTheLastFramebufferOfTheFrame() const
 	{
-		return m_frameLast;
+		return (m_flags & CommandBufferFlag::FRAME_LAST)
+			== CommandBufferFlag::FRAME_LAST;
 	}
 
 	void setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy)
@@ -92,9 +98,7 @@ public:
 		VkAccessFlags dstAccess,
 		VkImageLayout newLayout,
 		VkImage img,
-		VkImageAspectFlagBits aspect,
-		TextureType type,
-		const TextureSurfaceInfo& surface)
+		const VkImageSubresourceRange& range)
 	{
 		ANKI_ASSERT(img);
 		VkImageMemoryBarrier inf = {};
@@ -106,20 +110,7 @@ public:
 		inf.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
 		inf.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
 		inf.image = img;
-		inf.subresourceRange.aspectMask = aspect;
-		inf.subresourceRange.baseMipLevel = surface.m_level;
-		inf.subresourceRange.levelCount = 1;
-
-		switch(type)
-		{
-		case TextureType::_2D:
-			inf.subresourceRange.baseArrayLayer = 0;
-			inf.subresourceRange.layerCount = 1;
-			break;
-		default:
-			ANKI_ASSERT(0 && "TODO");
-			break;
-		}
+		inf.subresourceRange = range;
 
 		vkCmdPipelineBarrier(
 			m_handle, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &inf);
@@ -131,32 +122,26 @@ public:
 		VkPipelineStageFlags dstStage,
 		VkAccessFlags dstAccess,
 		VkImageLayout newLayout,
-		VkImage img,
+		TexturePtr tex,
 		const VkImageSubresourceRange& range)
 	{
-		ANKI_ASSERT(img);
-		VkImageMemoryBarrier inf = {};
-		inf.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
-		inf.srcAccessMask = srcAccess;
-		inf.dstAccessMask = dstAccess;
-		inf.oldLayout = prevLayout;
-		inf.newLayout = newLayout;
-		inf.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
-		inf.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
-		inf.image = img;
-		inf.subresourceRange = range;
-
-		vkCmdPipelineBarrier(
-			m_handle, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &inf);
+		setImageBarrier(srcStage,
+			srcAccess,
+			prevLayout,
+			dstStage,
+			dstAccess,
+			newLayout,
+			tex->getImplementation().getImageHandle(),
+			range);
+
+		m_texList.pushBack(m_alloc, tex);
 	}
 
 private:
 	StackAllocator<U8> m_alloc;
 
 	VkCommandBuffer m_handle = VK_NULL_HANDLE;
-	Bool8 m_secondLevel = false;
-	Bool8 m_frameFirst = false;
-	Bool8 m_frameLast = false;
+	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
 	Bool8 m_renderedToDefaultFb = false;
 	Bool8 m_finalized = false;
 	Bool8 m_empty = true;
@@ -170,6 +155,7 @@ private:
 	List<PipelinePtr> m_pplineList;
 	List<FramebufferPtr> m_fbList;
 	List<ResourceGroupPtr> m_rcList;
+	List<TexturePtr> m_texList;
 /// @}
 
 #if ANKI_ASSERTIONS

+ 1 - 0
include/anki/gr/vulkan/TextureImpl.h

@@ -44,6 +44,7 @@ private:
 	SamplerPtr m_sampler;
 	U32 m_memIdx = MAX_U32;
 	GpuMemoryAllocationHandle m_memHandle;
+
 	SemaphorePtr m_initLayoutSem;
 
 	TextureType m_type = TextureType::CUBE;

+ 2 - 1
src/gr/gl/CommandBuffer.cpp

@@ -46,7 +46,8 @@ void CommandBuffer::init(CommandBufferInitInfo& inf)
 	m_impl->init(inf);
 
 #if ANKI_ASSERTS_ENABLED
-	if(inf.m_secondLevel)
+	if((inf.m_flags & CommandBufferFlag::SECOND_LEVEL)
+		== CommandBufferFlag::SECOND_LEVEL)
 	{
 		ANKI_ASSERT(inf.m_framebuffer.isCreated());
 		m_impl->m_dbg.m_insideRenderPass = true;

+ 18 - 17
src/gr/vulkan/CommandBufferImpl.cpp

@@ -4,7 +4,6 @@
 // http://www.anki3d.org/LICENSE
 
 #include <anki/gr/vulkan/CommandBufferImpl.h>
-#include <anki/gr/CommandBuffer.h>
 #include <anki/gr/vulkan/GrManagerImpl.h>
 
 #include <anki/gr/Pipeline.h>
@@ -38,12 +37,15 @@ CommandBufferImpl::~CommandBufferImpl()
 
 	if(m_handle)
 	{
-		getGrManagerImpl().deleteCommandBuffer(m_handle, m_secondLevel, m_tid);
+		Bool secondLevel = (m_flags & CommandBufferFlag::SECOND_LEVEL)
+			== CommandBufferFlag::SECOND_LEVEL;
+		getGrManagerImpl().deleteCommandBuffer(m_handle, secondLevel, m_tid);
 	}
 
 	m_pplineList.destroy(m_alloc);
 	m_fbList.destroy(m_alloc);
 	m_rcList.destroy(m_alloc);
+	m_texList.destroy(m_alloc);
 }
 
 //==============================================================================
@@ -57,19 +59,19 @@ Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 		0,
 		false);
 
-	m_secondLevel = init.m_secondLevel;
-	m_frameLast = init.m_frameLastCommandBuffer;
-	m_frameFirst = init.m_frameFirstCommandBuffer;
+	m_flags = init.m_flags;
 	m_tid = Thread::getCurrentThreadId();
 
-	m_handle = getGrManagerImpl().newCommandBuffer(m_tid, m_secondLevel);
+	Bool secondLevel = (m_flags & CommandBufferFlag::SECOND_LEVEL)
+		== CommandBufferFlag::SECOND_LEVEL;
+	m_handle = getGrManagerImpl().newCommandBuffer(m_tid, secondLevel);
 	ANKI_ASSERT(m_handle);
 
 	// Begin recording
 	VkCommandBufferInheritanceInfo inheritance = {};
 	inheritance.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
 
-	if(init.m_secondLevel)
+	if(secondLevel)
 	{
 		ANKI_ASSERT(0 && "TODO");
 	}
@@ -83,7 +85,8 @@ Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 
 	// If it's the frame's first command buffer then do the default fb image
 	// transition
-	if(init.m_frameFirstCommandBuffer)
+	if((m_flags & CommandBufferFlag::FRAME_FIRST)
+		== CommandBufferFlag::FRAME_FIRST)
 	{
 		// Default FB barrier/transition
 		setImageBarrier(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
@@ -94,9 +97,7 @@ Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
 			getGrManagerImpl().getDefaultSurfaceImage(
 				getGrManagerImpl().getFrame() % MAX_FRAMES_IN_FLIGHT),
-			VK_IMAGE_ASPECT_COLOR_BIT,
-			TextureType::_2D,
-			TextureSurfaceInfo(0, 0, 0));
+			VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1});
 	}
 
 	return ErrorCode::NONE;
@@ -106,8 +107,8 @@ Error CommandBufferImpl::init(const CommandBufferInitInfo& init)
 void CommandBufferImpl::commandCommon()
 {
 	ANKI_ASSERT(Thread::getCurrentThreadId() == m_tid
-		&& "Commands must be recorder by the thread this command buffer was "
-		   "created");
+		&& "Commands must be recorder and flushed by the thread this command "
+		   "buffer was created");
 
 	ANKI_ASSERT(!m_finalized);
 	ANKI_ASSERT(m_handle);
@@ -203,10 +204,12 @@ void CommandBufferImpl::drawcallCommon()
 //==============================================================================
 void CommandBufferImpl::endRecording()
 {
+	commandCommon();
 	ANKI_ASSERT(!m_finalized);
 	ANKI_ASSERT(!m_empty);
 
-	if(m_frameLast)
+	if((m_flags & CommandBufferFlag::FRAME_LAST)
+		== CommandBufferFlag::FRAME_LAST)
 	{
 		// Default FB barrier/transition
 		setImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
@@ -217,9 +220,7 @@ void CommandBufferImpl::endRecording()
 			VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
 			getGrManagerImpl().getDefaultSurfaceImage(
 				getGrManagerImpl().getFrame() % MAX_FRAMES_IN_FLIGHT),
-			VK_IMAGE_ASPECT_COLOR_BIT,
-			TextureType::_2D,
-			TextureSurfaceInfo(0, 0, 0));
+			VkImageSubresourceRange{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1});
 	}
 
 	ANKI_VK_CHECKF(vkEndCommandBuffer(m_handle));

+ 1 - 1
src/renderer/Fs.cpp

@@ -91,7 +91,7 @@ Error Fs::buildCommandBuffers(
 
 	// Create the command buffer and set some state
 	CommandBufferInitInfo cinf;
-	cinf.m_secondLevel = true;
+	cinf.m_flags = CommandBufferFlag::SECOND_LEVEL;
 	cinf.m_framebuffer = m_fb;
 	CommandBufferPtr cmdb =
 		m_r->getGrManager().newInstance<CommandBuffer>(cinf);

+ 1 - 1
src/renderer/Ms.cpp

@@ -135,7 +135,7 @@ Error Ms::buildCommandBuffers(
 	{
 		// Create the command buffer and set some state
 		CommandBufferInitInfo cinf;
-		cinf.m_secondLevel = true;
+		cinf.m_flags = CommandBufferFlag::SECOND_LEVEL;
 		cinf.m_framebuffer = m_fb;
 		CommandBufferPtr cmdb =
 			m_r->getGrManager().newInstance<CommandBuffer>(cinf);

+ 2 - 2
src/renderer/Sm.cpp

@@ -264,7 +264,7 @@ Error Sm::doSpotLight(SceneNode& light,
 	}
 
 	CommandBufferInitInfo cinf;
-	cinf.m_secondLevel = true;
+	cinf.m_flags = CommandBufferFlag::SECOND_LEVEL;
 	cinf.m_framebuffer = fb;
 	cmdb = m_r->getGrManager().newInstance<CommandBuffer>(cinf);
 	cmdb->setViewport(0, 0, m_resolution, m_resolution);
@@ -299,7 +299,7 @@ Error Sm::doOmniLight(SceneNode& light,
 			if(start != end)
 			{
 				CommandBufferInitInfo cinf;
-				cinf.m_secondLevel = true;
+				cinf.m_flags = CommandBufferFlag::SECOND_LEVEL;
 				cinf.m_framebuffer = fbs[frCount];
 				cmdbs[frCount] =
 					m_r->getGrManager().newInstance<CommandBuffer>(cinf);

+ 7 - 7
tests/gr/Gr.cpp

@@ -226,8 +226,8 @@ ANKI_TEST(Gr, SimpleDrawcall)
 			gr->beginFrame();
 
 			CommandBufferInitInfo cinit;
-			cinit.m_frameFirstCommandBuffer = true;
-			cinit.m_frameLastCommandBuffer = true;
+			cinit.m_flags =
+				CommandBufferFlag::FRAME_FIRST | CommandBufferFlag::FRAME_LAST;
 			CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit);
 
 			cmdb->setViewport(0, 0, WIDTH, HEIGHT);
@@ -356,8 +356,8 @@ ANKI_TEST(Gr, DrawWithUniforms)
 			gr->beginFrame();
 
 			CommandBufferInitInfo cinit;
-			cinit.m_frameFirstCommandBuffer = true;
-			cinit.m_frameLastCommandBuffer = true;
+			cinit.m_flags =
+				CommandBufferFlag::FRAME_FIRST | CommandBufferFlag::FRAME_LAST;
 			CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit);
 
 			cmdb->setViewport(0, 0, WIDTH, HEIGHT);
@@ -478,8 +478,8 @@ ANKI_TEST(Gr, DrawWithVertex)
 			gr->beginFrame();
 
 			CommandBufferInitInfo cinit;
-			cinit.m_frameFirstCommandBuffer = true;
-			cinit.m_frameLastCommandBuffer = true;
+			cinit.m_flags =
+				CommandBufferFlag::FRAME_FIRST | CommandBufferFlag::FRAME_LAST;
 			CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit);
 
 			cmdb->setViewport(0, 0, WIDTH, HEIGHT);
@@ -505,4 +505,4 @@ ANKI_TEST(Gr, DrawWithVertex)
 	COMMON_END();
 }
 
-} // end namespace anki
+} // end namespace anki