Bläddra i källkod

Vulkan: Properly wait until back buffer is acquired before presenting

BearishSun 9 år sedan
förälder
incheckning
95d84ddf01

+ 1 - 2
Source/BansheeVulkanRenderAPI/Include/BsVulkanCommandBuffer.h

@@ -318,7 +318,6 @@ namespace bs
 		UINT32 mFenceCounter;
 
 		VulkanFramebuffer* mFramebuffer;
-		VulkanSemaphore* mPresentSemaphore;
 		UINT32 mRenderTargetWidth;
 		UINT32 mRenderTargetHeight;
 		bool mRenderTargetDepthReadOnly;
@@ -345,7 +344,7 @@ namespace bs
 		bool mScissorRequiresBind : 1;
 		DescriptorSetBindFlags mDescriptorSetsBindState;
 
-		VulkanSemaphore* mSemaphoresTemp[BS_MAX_UNIQUE_QUEUES + 1]; // +1 for present semaphore
+		VulkanSemaphore* mSemaphoresTemp[BS_MAX_UNIQUE_QUEUES];
 		VkBuffer mVertexBuffersTemp[BS_MAX_BOUND_VERTEX_BUFFERS];
 		VkDeviceSize mVertexBufferOffsetsTemp[BS_MAX_BOUND_VERTEX_BUFFERS];
 		VkDescriptorSet* mDescriptorSetsTemp;

+ 1 - 1
Source/BansheeVulkanRenderAPI/Include/Win32/BsWin32RenderWindow.h

@@ -116,7 +116,7 @@ namespace bs
 		VkFormat mDepthFormat;
 		UINT32 mPresentQueueFamily;
 		SPtr<VulkanSwapChain> mSwapChain;
-		VulkanSemaphore* mSemaphoresTemp[BS_MAX_UNIQUE_QUEUES];
+		VulkanSemaphore* mSemaphoresTemp[BS_MAX_UNIQUE_QUEUES + 1]; // +1 for present semaphore
 		bool mRequiresNewBackBuffer;
 
 		Win32RenderWindowProperties mProperties;

+ 10 - 21
Source/BansheeVulkanRenderAPI/Source/BsVulkanCommandBuffer.cpp

@@ -126,7 +126,7 @@ namespace bs
 
 	VulkanCmdBuffer::VulkanCmdBuffer(VulkanDevice& device, UINT32 id, VkCommandPool pool, UINT32 queueFamily, bool secondary)
 		: mId(id), mQueueFamily(queueFamily), mState(State::Ready), mDevice(device), mPool(pool), mSemaphore(nullptr)
-		, mFenceCounter(0), mFramebuffer(nullptr), mPresentSemaphore(nullptr), mRenderTargetWidth(0)
+		, mFenceCounter(0), mFramebuffer(nullptr), mRenderTargetWidth(0)
 		, mRenderTargetHeight(0), mRenderTargetDepthReadOnly(false), mRenderTargetLoadMask(RT_NONE), mGlobalQueueIdx(-1)
 		, mViewport(0.0f, 0.0f, 1.0f, 1.0f), mScissor(0, 0, 0, 0), mStencilRef(0), mDrawOp(DOT_TRIANGLE_LIST)
 		, mNumBoundDescriptorSets(0), mGfxPipelineRequiresBind(true), mCmpPipelineRequiresBind(true)
@@ -496,13 +496,6 @@ namespace bs
 		UINT32 numSemaphores;
 		cbm.getSyncSemaphores(deviceIdx, syncMask, mSemaphoresTemp, numSemaphores);
 
-		// Wait on present (i.e. until the back buffer becomes available), if we're rendering to a window
-		if (mPresentSemaphore != nullptr)
-		{
-			mSemaphoresTemp[numSemaphores] = mPresentSemaphore;
-			numSemaphores++;
-		}
-
 		// Issue second part of transition pipeline barriers (on this queue)
 		for (auto& entry : mTransitionInfoTemp)
 		{
@@ -649,7 +642,6 @@ namespace bs
 		if(rt == nullptr)
 		{
 			mFramebuffer = nullptr;
-			mPresentSemaphore = nullptr;
 			mRenderTargetWidth = 0;
 			mRenderTargetHeight = 0;
 			mRenderTargetDepthReadOnly = false;
@@ -661,16 +653,10 @@ namespace bs
 			{
 				Win32RenderWindowCore* window = static_cast<Win32RenderWindowCore*>(rt.get());
 				window->acquireBackBuffer();
-
-				rt->getCustomAttribute("FB", &mFramebuffer);
-				rt->getCustomAttribute("PS", &mPresentSemaphore);
-			}
-			else
-			{
-				rt->getCustomAttribute("FB", &mFramebuffer);
-				mPresentSemaphore = nullptr;
 			}
 
+			rt->getCustomAttribute("FB", &mFramebuffer);
+
 			mRenderTargetWidth = rt->getProperties().getWidth();
 			mRenderTargetHeight = rt->getProperties().getHeight();
 			mRenderTargetDepthReadOnly = readOnlyDepthStencil;
@@ -1333,11 +1319,14 @@ namespace bs
 		{
 			const VulkanFramebufferAttachment& attachment = res->getColorAttachment(i);
 
-			VkAccessFlags accessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
+			VkAccessFlags accessMask;
 			if (attachment.finalLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
-				accessMask |= VK_ACCESS_SHADER_READ_BIT;
+				accessMask = VK_ACCESS_SHADER_READ_BIT;
 			else
-				accessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+			{
+				assert(attachment.finalLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
+				accessMask = VK_ACCESS_MEMORY_READ_BIT;
+			}
 
 			registerResource(attachment.image, accessMask, attachment.image->getLayout(), attachment.finalLayout, 
 				VulkanUseFlag::Write, true);
@@ -1397,8 +1386,8 @@ namespace bs
 			return;
 
 		mBuffer->submit(mQueue, mQueueIdx, syncMask);
+		acquireNewBuffer();
 
 		gVulkanCBManager().refreshStates(mDeviceIdx);
-		acquireNewBuffer();
 	}
 }

+ 4 - 7
Source/BansheeVulkanRenderAPI/Source/Win32/BsWin32RenderWindow.cpp

@@ -311,6 +311,10 @@ namespace bs
 		UINT32 numSemaphores;
 		cbm.getSyncSemaphores(deviceIdx, syncMask, mSemaphoresTemp, numSemaphores);
 
+		// Wait on present (i.e. until the back buffer becomes available), if we're rendering to a window
+		mSemaphoresTemp[numSemaphores] = mSwapChain->getBackBuffer().sync;
+		numSemaphores++;
+
 		queue->present(mSwapChain.get(), mSemaphoresTemp, numSemaphores);
 		mRequiresNewBackBuffer = true;
 	}
@@ -525,13 +529,6 @@ namespace bs
 			return;
 		}
 
-		if(name == "PS")
-		{
-			VulkanSemaphore** presentSemaphore = (VulkanSemaphore**)data;
-			*presentSemaphore = mSwapChain->getBackBuffer().sync;
-			return;
-		}
-
 		if(name == "WINDOW")
 		{
 			UINT64 *pWnd = (UINT64*)data;