Fixed validation layer error ( recording command buffer that hasn't begun )
authoradam.b <adam.b@samsung.com>
Wed, 12 Dec 2018 08:00:28 +0000 (17:00 +0900)
committerDavid Steele <david.steele@samsung.com>
Tue, 18 Dec 2018 19:37:39 +0000 (19:37 +0000)
Validation layer issue detected that we were trying to record the command buffer without calling vkCmdBegin(). It was mostly occurring during pause/resume actions.

Signed-off-by: adam.b <adam.b@samsung.com>
Change-Id: Iba6b7b506706ddc4b3a24046ac05bfa364e52f45

dali/graphics/vulkan/api/vulkan-api-controller.cpp
dali/graphics/vulkan/internal/vulkan-swapchain.cpp
dali/graphics/vulkan/internal/vulkan-swapchain.h

index ea97db1d291120b3f6a9b98ecc12fbca5b795c56..b69cbf9a4ff0d0476055c5b2b43c2c7aa3e2d6a8 100644 (file)
@@ -199,7 +199,6 @@ struct Controller::Impl
       // Ensure there are enough command buffers for each render pass,
       swapchain->AllocateCommandBuffers( mRenderPasses.size() );
       std::vector<Vulkan::RefCountedCommandBuffer>& renderPassBuffers = swapchain->GetCommandBuffers();
-
       uint32_t index = 0;
       for( auto& renderPassData : mRenderPasses )
       {
@@ -210,6 +209,7 @@ struct Controller::Impl
     else
     {
       auto primaryCommandBuffer = swapchain->GetLastCommandBuffer();
+      primaryCommandBuffer->Begin( vk::CommandBufferUsageFlagBits::eOneTimeSubmit, nullptr );
       primaryCommandBuffer->BeginRenderPass( vk::RenderPassBeginInfo{}
         .setFramebuffer( swapchain->GetCurrentFramebuffer()->GetVkHandle() )
         .setRenderPass(swapchain->GetCurrentFramebuffer()->GetRenderPass() )
@@ -217,6 +217,7 @@ struct Controller::Impl
         .setPClearValues( swapchain->GetCurrentFramebuffer()->GetClearValues().data() )
         .setClearValueCount( uint32_t(swapchain->GetCurrentFramebuffer()->GetClearValues().size()) ), vk::SubpassContents::eInline );
       primaryCommandBuffer->EndRenderPass();
+      primaryCommandBuffer->End();
     }
 
     for( auto& future : mMemoryTransferFutures )
@@ -594,6 +595,7 @@ struct Controller::Impl
 
   void ProcessRenderPassData( Vulkan::RefCountedCommandBuffer commandBuffer, const RenderPassData& renderPassData )
   {
+    commandBuffer->Begin( vk::CommandBufferUsageFlagBits::eOneTimeSubmit, nullptr );
     commandBuffer->BeginRenderPass( renderPassData.beginInfo, vk::SubpassContents::eInline );
 
     // update descriptor sets
@@ -695,6 +697,7 @@ struct Controller::Impl
     }
 
     commandBuffer->EndRenderPass();
+    commandBuffer->End();
   }
 
   bool EnableDepthStencilBuffer( bool enableDepth, bool enableStencil )
index 1abe0f511dc26022fd69ec2fb450e8f743600694..927393a893366bcab653a15f002790ae92584349 100644 (file)
@@ -163,8 +163,6 @@ RefCountedFramebuffer Swapchain::AcquireNextFramebuffer( bool shouldCollectGarba
     }
   }
 
-  auto& swapBuffer = mSwapchainBuffers[mGraphics->GetCurrentBufferIndex()];
-
   // First frames don't need waiting as they haven't been submitted
   // yet. Note, that waiting on the fence without resetting it may
   // cause a stall ( nvidia, ubuntu )
@@ -179,14 +177,6 @@ RefCountedFramebuffer Swapchain::AcquireNextFramebuffer( bool shouldCollectGarba
     mGraphics->CollectGarbage();
   }
 
-  DALI_LOG_STREAM( gVulkanFilter, Debug::General, "Resetting " << swapBuffer->commandBuffers.size() << " command buffers" );
-
-  for( auto& commandBuffer : swapBuffer->commandBuffers )
-  {
-    commandBuffer->Reset();
-    commandBuffer->Begin( vk::CommandBufferUsageFlagBits::eOneTimeSubmit, nullptr );
-  }
-
   return mFramebuffers[mSwapchainImageIndex];
 }
 
@@ -206,8 +196,6 @@ void Swapchain::Present()
   size_t index = 0;
   for( auto& commandBuffer : swapBuffer->commandBuffers )
   {
-    commandBuffer->End();
-
     // @todo Add semaphores between each render pass
     if( index < count-1 )
     {
@@ -413,14 +401,17 @@ void Swapchain::AllocateCommandBuffers( size_t renderPassCount )
     {
       // Create primary buffer for each render pass & begin recording
       auto commandBuffer = mGraphics->CreateCommandBuffer(true);
-      commandBuffer->Begin( vk::CommandBufferUsageFlagBits::eOneTimeSubmit, nullptr );
       mSwapchainBuffers[mGraphics->GetCurrentBufferIndex()]->commandBuffers.emplace_back( commandBuffer );
     }
   }
 }
 
-RefCountedCommandBuffer Swapchain::GetLastCommandBuffer() const
+RefCountedCommandBuffer Swapchain::GetLastCommandBuffer()
 {
+  if( mSwapchainBuffers[mGraphics->GetCurrentBufferIndex()]->commandBuffers.empty() )
+  {
+    AllocateCommandBuffers( 1 );
+  }
   return mSwapchainBuffers[mGraphics->GetCurrentBufferIndex()]->commandBuffers.back();
 }
 
index 4930aba4b4722b2abd0d9fc5bfe27d65d1cf4961..e71771eb0b940779ada8858563e749ac98af6ee1 100644 (file)
@@ -77,7 +77,7 @@ public:
   /**
    * Return the primary command buffer associated with the swapchain
    */
-  RefCountedCommandBuffer GetLastCommandBuffer() const;
+  RefCountedCommandBuffer GetLastCommandBuffer();
 
   /**
    * Returns the primary command buffers associated with each render pass