Fixes in vulkan queues handling
authoradam.b <adam.b@samsung.com>
Wed, 12 Dec 2018 02:40:30 +0000 (11:40 +0900)
committerDavid Steele <david.steele@samsung.com>
Tue, 18 Dec 2018 20:34:26 +0000 (20:34 +0000)
- Queue wrapper objects ( Vulkan::Queue ) are not duplicated anymore
- The access to the queue via Submit() or WaitIdle() is guarded with a mutex to protect the queue when accessing it from multiple threads ( ie. during resource transfers ).
- Improves overall stability

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

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

index b69cbf9a4ff0d0476055c5b2b43c2c7aa3e2d6a8..08870d0261c505de8c2f35f8f3aa8ef2a4eb885f 100644 (file)
@@ -559,7 +559,6 @@ struct Controller::Impl
         commandBuffer->End();
 
         // submit to the queue
-        auto transferQueue = mGraphics.GetTransferQueue( 0u );
         mGraphics.Submit( mGraphics.GetTransferQueue(0u), { Vulkan::SubmissionData{ {}, {}, { commandBuffer }, {} } }, fence );
         mGraphics.WaitForFence( fence );
         mGraphics.ResetFence( fence );
index adca5af651c490d02424e15ff53656eb31767bbb..405de239daf1948b3d4522b7efbde7b4ccf5c277 100644 (file)
@@ -74,7 +74,8 @@ Queue::Queue( Graphics& graphics,
           mQueue( queue ),
           mFlags( queueFlags ),
           mQueueFamilyIndex( queueFamilyIndex ),
-          mQueueIndex( queueIndex )
+          mQueueIndex( queueIndex ),
+          mMutex()
 {
 }
 
@@ -85,6 +86,11 @@ vk::Queue Queue::GetVkHandle()
   return mQueue;
 }
 
+std::unique_ptr<std::lock_guard<std::recursive_mutex>> Queue::Lock()
+{
+  return std::unique_ptr<std::lock_guard<std::recursive_mutex>>( new std::lock_guard<std::recursive_mutex>( mMutex ) );
+}
+
 } // namespace Vulkan
 } // namespace Graphics
 } // namespace Dali
index fbb5a536ea3f6842b91f5edb7d34ec159c8b1b4c..41f210f6f1e6a12ec412e582d45bb27b47247da3 100644 (file)
@@ -21,6 +21,8 @@
 // INTERNAL INCLUDES
 #include <dali/graphics/vulkan/internal/vulkan-types.h>
 
+#include <mutex>
+
 namespace Dali
 {
 namespace Graphics
@@ -65,6 +67,8 @@ public:
 
   vk::Queue GetVkHandle();
 
+  std::unique_ptr<std::lock_guard<std::recursive_mutex>> Lock();
+
 private:
   Queue( Graphics& graphics,
          vk::Queue queue,
@@ -78,6 +82,8 @@ private:
   vk::QueueFlags mFlags;
   uint32_t mQueueFamilyIndex;
   uint32_t mQueueIndex;
+
+  std::recursive_mutex mMutex;
 };
 
 } // namespace Vulkan
index fb71d3ea7db65c59177d1d050ebd1a7382cbe86e..80a63993441de22d0d132e97f81b8b6debc98588 100644 (file)
@@ -333,23 +333,21 @@ void Graphics::CreateDevice()
       auto queue = mDevice.getQueue( queueInfo.queueFamilyIndex, i );
 
       // based on family push queue instance into right array
-      auto flags = mQueueFamilyProperties[queueInfo.queueFamilyIndex].queueFlags;
+      auto flags = mQueueFamilyProperties[queueInfo.queueFamilyIndex].queueFlags;\
+      auto queueWrapper = std::unique_ptr< Queue >( new Queue( *this, queue, queueInfo.queueFamilyIndex, i, flags ) );
       if( flags & vk::QueueFlagBits::eGraphics )
       {
-        mGraphicsQueues.emplace_back(
-                std::unique_ptr< Queue >( new Queue( *this, queue, queueInfo.queueFamilyIndex, i, flags ) ) );
+        mGraphicsQueues.emplace_back( queueWrapper.get() );
       }
       if( flags & vk::QueueFlagBits::eTransfer )
       {
-        mTransferQueues.emplace_back(
-                std::unique_ptr< Queue >( new Queue( *this, queue, queueInfo.queueFamilyIndex, i, flags ) ) );
+        mTransferQueues.emplace_back( queueWrapper.get() );
       }
       if( flags & vk::QueueFlagBits::eCompute )
       {
-        mComputeQueues.emplace_back(
-                std::unique_ptr< Queue >( new Queue( *this, queue, queueInfo.queueFamilyIndex, i, flags ) ) );
+        mComputeQueues.emplace_back( queueWrapper.get() );
       }
-
+      mAllQueues.emplace_back( std::move( queueWrapper ));
       // todo: present queue
     }
   }
@@ -1088,18 +1086,6 @@ vk::Result Graphics::WaitForFence( RefCountedFence fence, uint32_t timeout )
   return mDevice.waitForFences( 1, &fence->mFence, VK_TRUE, timeout );
 }
 
-vk::Result Graphics::WaitForFences( const std::vector< RefCountedFence >& fences, bool waitAll, uint32_t timeout )
-{
-  std::vector< vk::Fence > vkFenceHandles{};
-  std::transform( fences.begin(),
-                  fences.end(),
-                  std::back_inserter( vkFenceHandles ),
-                  []( RefCountedFence entry ) { return entry->mFence; } );
-
-
-  return mDevice.waitForFences( vkFenceHandles, vk::Bool32( waitAll ), timeout );
-}
-
 vk::Result Graphics::ResetFence( RefCountedFence fence )
 {
   return mDevice.resetFences( 1, &fence->mFence );
@@ -1208,7 +1194,7 @@ std::unique_ptr<Memory> Graphics::AllocateMemory( RefCountedImage image, vk::Mem
 
 vk::Result Graphics::Submit( Queue& queue, const std::vector< SubmissionData >& submissionData, RefCountedFence fence )
 {
-
+  auto lock( queue.Lock() );
 
   auto submitInfos = std::vector< vk::SubmitInfo >{};
   submitInfos.reserve( submissionData.size() );
@@ -1251,11 +1237,13 @@ vk::Result Graphics::Submit( Queue& queue, const std::vector< SubmissionData >&
 
 vk::Result Graphics::Present( Queue& queue, vk::PresentInfoKHR presentInfo )
 {
+  auto lock( queue.Lock() );
   return queue.mQueue.presentKHR( &presentInfo );
 }
 
 vk::Result Graphics::QueueWaitIdle( Queue& queue )
 {
+  auto lock( queue.Lock() );
   return queue.mQueue.waitIdle();
 }
 
index c1ef5f9f08893fff5beebdfecf33f7dac5ceb68e..083118c871626a516a29b0462d7c04f0094293fd 100644 (file)
@@ -329,10 +329,10 @@ private: // Members
   std::vector< vk::QueueFamilyProperties > mQueueFamilyProperties;
 
   // Sets of queues
-  std::vector< std::unique_ptr< Queue > > mGraphicsQueues;
-  std::vector< std::unique_ptr< Queue > > mTransferQueues;
-  std::vector< std::unique_ptr< Queue > > mComputeQueues;
-  //std::unique_ptr< Queue > mPresentQueue;
+  std::vector< std::unique_ptr< Queue > > mAllQueues;
+  std::vector< Queue* > mGraphicsQueues;
+  std::vector< Queue* > mTransferQueues;
+  std::vector< Queue* > mComputeQueues;
 
   std::unordered_map< FBID, SwapchainSurfacePair > mSurfaceFBIDMap;
   FBID mBaseFBID{ 0u };