From d3672d9e57f85356cc7efcf453b01f45d7d8dc0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 22 Aug 2017 18:05:05 +0200 Subject: [PATCH] Make sure not to begin and end the init command buffer on different threads. --- ext/native/thin3d/VulkanRenderManager.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ext/native/thin3d/VulkanRenderManager.cpp b/ext/native/thin3d/VulkanRenderManager.cpp index 214b506f7a..099bf77eda 100644 --- a/ext/native/thin3d/VulkanRenderManager.cpp +++ b/ext/native/thin3d/VulkanRenderManager.cpp @@ -283,7 +283,6 @@ void VulkanRenderManager::EndFrame(int frame) { int numCmdBufs = 0; std::vector cmdBufs; if (frameData.hasInitCommands) { - vkEndCommandBuffer(frameData.initCmd); cmdBufs.push_back(frameData.initCmd); frameData.hasInitCommands = false; } @@ -647,14 +646,20 @@ VkImageView VulkanRenderManager::BindFramebufferAsTexture(VKRFramebuffer *fb, in } void VulkanRenderManager::Flush() { - while (frameAvailable_) - ; + curRenderStep_ = nullptr; int curFrame = vulkan_->GetCurFrame(); + FrameData &frameData = frameData_[curFrame]; + if (frameData.hasInitCommands) { + vkEndCommandBuffer(frameData.initCmd); + } if (!useThread) { Run(curFrame); EndFrame(curFrame); } else { - frameAvailable_ = true; + { + std::unique_lock lock(mutex_); + frameAvailable_ = true; + } threadFrame_ = curFrame; condVar_.notify_all(); } @@ -666,7 +671,6 @@ void VulkanRenderManager::Run(int frame) { //if ({ // std::unique_lock lock(mutex_); stepsOnThread_ = std::move(steps_); - curRenderStep_ = nullptr; FrameData &frameData = frameData_[frame];