Просмотр исходного кода

Vulkan: If render pass is currently executing queue events until it ends

BearishSun 9 лет назад
Родитель
Сommit
76cbd8ca92

+ 7 - 0
Source/BansheeVulkanRenderAPI/Include/BsVulkanCommandBuffer.h

@@ -253,6 +253,12 @@ namespace bs
 		/** Executes a dispatch command using the currently bound compute pipeline. */
 		/** Executes a dispatch command using the currently bound compute pipeline. */
 		void dispatch(UINT32 numGroupsX, UINT32 numGroupsY, UINT32 numGroupsZ);
 		void dispatch(UINT32 numGroupsX, UINT32 numGroupsY, UINT32 numGroupsZ);
 
 
+		/** 
+		 * Registers a command that signals the event when executed. Will be delayed until the end of the current
+		 * render pass, if any.
+		 */
+		void setEvent(VulkanEvent* event);
+
 	private:
 	private:
 		friend class VulkanCmdBufferPool;
 		friend class VulkanCmdBufferPool;
 		friend class VulkanCommandBuffer;
 		friend class VulkanCommandBuffer;
@@ -361,6 +367,7 @@ namespace bs
 		UnorderedMap<UINT32, TransitionInfo> mTransitionInfoTemp;
 		UnorderedMap<UINT32, TransitionInfo> mTransitionInfoTemp;
 		Vector<VkImageMemoryBarrier> mLayoutTransitionBarriersTemp;
 		Vector<VkImageMemoryBarrier> mLayoutTransitionBarriersTemp;
 		UnorderedMap<VulkanImage*, UINT32> mQueuedLayoutTransitions;
 		UnorderedMap<VulkanImage*, UINT32> mQueuedLayoutTransitions;
+		Vector<VulkanEvent*> mQueuedEvents;
 	};
 	};
 
 
 	/** CommandBuffer implementation for Vulkan. */
 	/** CommandBuffer implementation for Vulkan. */

+ 15 - 0
Source/BansheeVulkanRenderAPI/Source/BsVulkanCommandBuffer.cpp

@@ -12,6 +12,7 @@
 #include "BsVulkanHardwareBuffer.h"
 #include "BsVulkanHardwareBuffer.h"
 #include "BsVulkanFramebuffer.h"
 #include "BsVulkanFramebuffer.h"
 #include "BsVulkanVertexInputManager.h"
 #include "BsVulkanVertexInputManager.h"
+#include "BsVulkanEventQuery.h"
 
 
 #if BS_PLATFORM == BS_PLATFORM_WIN32
 #if BS_PLATFORM == BS_PLATFORM_WIN32
 #include "Win32/BsWin32RenderWindow.h"
 #include "Win32/BsWin32RenderWindow.h"
@@ -322,6 +323,12 @@ namespace bs
 
 
 		vkCmdEndRenderPass(mCmdBuffer);
 		vkCmdEndRenderPass(mCmdBuffer);
 
 
+		// Execute any queued events
+		for(auto& entry : mQueuedEvents)
+			vkCmdSetEvent(mCmdBuffer, entry->getHandle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+
+		mQueuedEvents.clear();
+
 		mState = State::Recording;
 		mState = State::Recording;
 	}
 	}
 
 
@@ -1261,6 +1268,14 @@ namespace bs
 		vkCmdDispatch(mCmdBuffer, numGroupsX, numGroupsY, numGroupsZ);
 		vkCmdDispatch(mCmdBuffer, numGroupsX, numGroupsY, numGroupsZ);
 	}
 	}
 
 
+	void VulkanCmdBuffer::setEvent(VulkanEvent* event)
+	{
+		if(isInRenderPass())
+			mQueuedEvents.push_back(event);
+		else
+			vkCmdSetEvent(mCmdBuffer, event->getHandle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+	}
+
 	void VulkanCmdBuffer::registerResource(VulkanResource* res, VulkanUseFlags flags)
 	void VulkanCmdBuffer::registerResource(VulkanResource* res, VulkanUseFlags flags)
 	{
 	{
 		auto insertResult = mResources.insert(std::make_pair(res, ResourceUseHandle()));
 		auto insertResult = mResources.insert(std::make_pair(res, ResourceUseHandle()));

+ 1 - 2
Source/BansheeVulkanRenderAPI/Source/BsVulkanEventQuery.cpp

@@ -83,8 +83,7 @@ namespace bs
 		VulkanCmdBuffer* internalCB = vulkanCB->getInternal(); 
 		VulkanCmdBuffer* internalCB = vulkanCB->getInternal(); 
 		internalCB->registerResource(mEvent, VulkanUseFlag::Read);
 		internalCB->registerResource(mEvent, VulkanUseFlag::Read);
 
 
-		VkCommandBuffer vkCB = internalCB->getHandle();
-		vkCmdSetEvent(vkCB, mEvent->getHandle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
+		internalCB->setEvent(mEvent);
 
 
 		setActive(true);
 		setActive(true);
 	}
 	}