Browse Source

Vulkan: Command buffer submission is now grouped under a single queue submit, when possible

BearishSun 9 năm trước cách đây
mục cha
commit
65dac3dfef

+ 9 - 7
Source/BansheeVulkanRenderAPI/Source/BsVulkanCommandBuffer.cpp

@@ -346,6 +346,10 @@ namespace bs
 	{
 	{
 		assert(isReadyForSubmit());
 		assert(isReadyForSubmit());
 
 
+		// Make sure to reset the CB fence before we submit it
+		VkResult result = vkResetFences(mDevice.getLogical(), 1, &mFence);
+		assert(result == VK_SUCCESS);
+
 		// If there are any query resets needed, execute those first
 		// If there are any query resets needed, execute those first
 		VulkanDevice& device = queue->getDevice();
 		VulkanDevice& device = queue->getDevice();
 		if(!mQueuedQueryResets.empty())
 		if(!mQueuedQueryResets.empty())
@@ -357,7 +361,7 @@ namespace bs
 				entry->reset(vkCmdBuffer);
 				entry->reset(vkCmdBuffer);
 
 
 			cmdBuffer->end();
 			cmdBuffer->end();
-			queue->submit(cmdBuffer, nullptr, 0);
+			queue->queueSubmit(cmdBuffer, nullptr, 0);
 
 
 			mQueuedQueryResets.clear();
 			mQueuedQueryResets.clear();
 		}
 		}
@@ -526,12 +530,13 @@ namespace bs
 								 numImgBarriers, barriers.imageBarriers.data());
 								 numImgBarriers, barriers.imageBarriers.data());
 
 
 			cmdBuffer->end();
 			cmdBuffer->end();
-			queue->submit(cmdBuffer, mSemaphoresTemp, numSemaphores);
+			queue->queueSubmit(cmdBuffer, mSemaphoresTemp, numSemaphores);
 
 
 			numSemaphores = 0; // Semaphores are only needed the first time, since we're adding the buffers on the same queue
 			numSemaphores = 0; // Semaphores are only needed the first time, since we're adding the buffers on the same queue
 		}
 		}
 
 
-		queue->submit(this, mSemaphoresTemp, numSemaphores);
+		queue->queueSubmit(this, mSemaphoresTemp, numSemaphores);
+		queue->submitQueued();
 
 
 		mGlobalQueueIdx = CommandSyncMask::getGlobalQueueIdx(queue->getType(), queueIdx);
 		mGlobalQueueIdx = CommandSyncMask::getGlobalQueueIdx(queue->getType(), queueIdx);
 		for (auto& entry : mResources)
 		for (auto& entry : mResources)
@@ -564,7 +569,7 @@ namespace bs
 			entry.first->notifyUsed(mGlobalQueueIdx, mQueueFamily, useHandle.flags);
 			entry.first->notifyUsed(mGlobalQueueIdx, mQueueFamily, useHandle.flags);
 		}
 		}
 
 
-		// Note: Uncommented for debugging only, prevents any device concurrency issues.
+		// Note: Uncomment for debugging only, prevents any device concurrency issues.
 		// vkQueueWaitIdle(queue->getHandle());
 		// vkQueueWaitIdle(queue->getHandle());
 
 
 		// Clear vectors but don't clear the actual map, as we want to re-use the memory since we expect queue family
 		// Clear vectors but don't clear the actual map, as we want to re-use the memory since we expect queue family
@@ -598,9 +603,6 @@ namespace bs
 				mState = State::Ready;
 				mState = State::Ready;
 				vkResetCommandBuffer(mCmdBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); // Note: Maybe better not to release resources?
 				vkResetCommandBuffer(mCmdBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); // Note: Maybe better not to release resources?
 
 
-				result = vkResetFences(mDevice.getLogical(), 1, &mFence);
-				assert(result == VK_SUCCESS);
-
 				mFenceCounter++;
 				mFenceCounter++;
 
 
 				for (auto& entry : mResources)
 				for (auto& entry : mResources)

+ 2 - 2
Source/BansheeVulkanRenderAPI/Source/BsVulkanQueue.cpp

@@ -81,12 +81,12 @@ namespace bs
 		{
 		{
 			const SubmitInfo& entry = mQueuedBuffers[i];
 			const SubmitInfo& entry = mQueuedBuffers[i];
 
 
-			VulkanSemaphore* signalSemaphore = entry.cmdBuffer->getSemaphore();
+			VulkanSemaphore* signalSemaphore = entry.cmdBuffer->allocateSemaphore();
 			commandBuffers[i] = entry.cmdBuffer->getHandle();
 			commandBuffers[i] = entry.cmdBuffer->getHandle();
 			signalSemaphores[i] = signalSemaphore->getHandle();
 			signalSemaphores[i] = signalSemaphore->getHandle();
 
 
 			UINT32 semaphoresCount = entry.numSemaphores;
 			UINT32 semaphoresCount = entry.numSemaphores;
-			prepareSemaphores(&mQueuedSemaphores[semaphoreIdx], &waitSemaphores[semaphoreIdx], semaphoresCount);
+			prepareSemaphores(mQueuedSemaphores.data() + semaphoreIdx, &waitSemaphores[semaphoreIdx], semaphoresCount);
 
 
 			getSubmitInfo(&commandBuffers[i], &signalSemaphores[i], &waitSemaphores[semaphoreIdx], semaphoresCount, 
 			getSubmitInfo(&commandBuffers[i], &signalSemaphores[i], &waitSemaphores[semaphoreIdx], semaphoresCount, 
 				submitInfos[i]);
 				submitInfos[i]);