Vulkan::Fence lifetime changes
authorAngelos Gkountis <a.gkountis@samsung.com>
Thu, 31 May 2018 12:54:43 +0000 (13:54 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 11 Jun 2018 17:01:34 +0000 (17:01 +0000)
> Vulkan::Fence lifetimes are now managed by the Vulkan::Graphics class
> Added getter functions to the Vulkan::Sampler class

Change-Id: Id963a72eca2a2eeaceaecaf30655b07e9d6baf16

dali/graphics/vulkan/vulkan-command-buffer.cpp
dali/graphics/vulkan/vulkan-fence.cpp
dali/graphics/vulkan/vulkan-fence.h
dali/graphics/vulkan/vulkan-graphics.cpp
dali/graphics/vulkan/vulkan-graphics.h
dali/graphics/vulkan/vulkan-resource-cache.cpp
dali/graphics/vulkan/vulkan-resource-cache.h
dali/graphics/vulkan/vulkan-sampler.cpp
dali/graphics/vulkan/vulkan-sampler.h
dali/graphics/vulkan/vulkan-shader.h

index e0701bb..800d868 100644 (file)
@@ -270,6 +270,7 @@ struct CommandBuffer::Impl
     vkBuffers.reserve( commandBuffers.size() );
     for( auto&& buf : commandBuffers )
     {
+      assert( mAllocateInfo.level == vk::CommandBufferLevel::eSecondary && "Cannot Execute Commands. Command buffer level not secondary" );
       vkBuffers.emplace_back( buf->GetVkCommandBuffer() );
       PushResource( buf );
     }
index b083e3a..87f527e 100644 (file)
@@ -67,6 +67,17 @@ Fence::operator vk::Fence*()
   return &mFence;
 }
 
+bool Fence::OnDestroy()
+{
+  mGraphics->RemoveFence( *this );
+
+  mGraphics->DiscardResource( [this]() {
+    mGraphics->GetDevice().destroyFence( mFence, mGraphics->GetAllocator() );
+  } );
+
+  return false;
+}
+
 
 } // namespace Vulkan
 } // namespace Graphics
index 9e7ca86..4544542 100644 (file)
@@ -45,6 +45,8 @@ public:
 
   operator vk::Fence*();
 
+  bool OnDestroy() override;
+
 private:
   explicit Fence( Graphics& graphics );
 
index 1bbf006..cd6495c 100644 (file)
@@ -229,6 +229,8 @@ RefCountedFence Graphics::CreateFence( const vk::FenceCreateInfo& fenceCreateInf
 
   VkAssert( mDevice.createFence( &fenceCreateInfo, mAllocator.get(), refCountedFence->Ref()));
 
+  AddFence( refCountedFence );
+
   return refCountedFence;
 }
 
@@ -633,6 +635,12 @@ void Graphics::AddSampler( RefCountedSampler sampler )
   mResourceCache->AddSampler( std::move( sampler ) );
 }
 
+void Graphics::AddFence( RefCountedFence fence )
+{
+  std::lock_guard< std::mutex > lock{ mMutex };
+  mResourceCache->AddFence( std::move(fence) );
+}
+
 RefCountedShader Graphics::FindShader( vk::ShaderModule shaderModule )
 {
   std::lock_guard< std::mutex > lock{ mMutex };
@@ -693,6 +701,12 @@ void Graphics::RemoveSampler( Sampler& sampler )
   mResourceCache->RemoveSampler( sampler );
 }
 
+void Graphics::RemoveFence( Fence& fence )
+{
+  std::lock_guard< std::mutex > lock{ mMutex };
+  mResourceCache->RemoveFence( fence );
+}
+
 void Graphics::CollectGarbage()
 {
   std::lock_guard< std::mutex > lock{ mMutex };
index 54c7995..ae3dcf0 100644 (file)
@@ -200,6 +200,8 @@ public: //Cache management methods
 
   void AddSampler( RefCountedSampler sampler );
 
+  void AddFence( RefCountedFence fence );
+
   RefCountedShader FindShader( vk::ShaderModule shaderModule );
 
   RefCountedImage FindImage( vk::Image image );
@@ -220,6 +222,8 @@ public: //Cache management methods
 
   void RemoveSampler( Sampler& sampler );
 
+  void RemoveFence( Fence& fence );
+
   void CollectGarbage();
 
   void DiscardResource( std::function< void() > deleter );
index fc72232..199fee7 100644 (file)
@@ -26,6 +26,7 @@
 #include <dali/graphics/vulkan/vulkan-framebuffer.h>
 #include <dali/graphics/vulkan/vulkan-command-pool.h>
 #include <dali/graphics/vulkan/vulkan-sampler.h>
+#include <dali/graphics/vulkan/vulkan-fence.h>
 
 #include <algorithm>
 
@@ -80,7 +81,13 @@ ResourceCache& ResourceCache::AddFramebuffer( RefCountedFramebuffer framebuffer
 
 ResourceCache& ResourceCache::AddSampler( RefCountedSampler sampler )
 {
-  mSamplers.push_back(sampler);
+  mSamplers.push_back( sampler );
+  return *this;
+}
+
+ResourceCache& ResourceCache::AddFence( RefCountedFence fence )
+{
+  mFences.push_back( fence );
   return *this;
 }
 
@@ -129,6 +136,15 @@ RefCountedSampler ResourceCache::FindSampler( vk::Sampler sampler )
   return iterator == mSamplers.end() ? RefCountedSampler() : RefCountedSampler(&**iterator);
 }
 
+RefCountedFence ResourceCache::FindFence( vk::Fence fence )
+{
+  auto iterator = std::find_if(mFences.begin(),
+                               mFences.end(),
+                               [&](const RefCountedFence entry) { return entry->GetVkHandle() == fence; });
+
+  return iterator == mFences.end() ? RefCountedFence() : RefCountedFence(&**iterator);
+}
+
 RefCountedBuffer ResourceCache::FindBuffer( vk::Buffer buffer )
 {
   auto iterator = std::find_if(mBuffers.begin(),
@@ -276,6 +292,21 @@ ResourceCache& ResourceCache::RemoveSampler( Sampler &sampler )
   return *this;
 }
 
+ResourceCache& ResourceCache::RemoveFence( Fence& fence )
+{
+  if( !mFences.empty() )
+  {
+    auto iterator = std::find_if(mFences.begin(),
+                                 mFences.end(),
+                                 [&](const RefCountedFence entry) { return &*entry == &fence; });
+
+    std::iter_swap(iterator, std::prev(mFences.end()));
+    mFences.back().Reset();
+    mFences.pop_back();
+  }
+  return *this;
+}
+
 void ResourceCache::CollectGarbage()
 {
   for( const auto& deleter : mDiscardQueue )
index ad1c752..d99dc10 100644 (file)
@@ -95,6 +95,12 @@ public:
    */
   ResourceCache& AddSampler( RefCountedSampler sampler );
 
+  /**
+   * Adds the provided fence object to the fence cache
+   * @param fence The fence object to be added to the cache
+   * @return A reference to the ResourceCache
+   */
+  ResourceCache& AddFence( RefCountedFence fence );
 
   /**
    * Finds the buffer object using the specified Vulkan handle in the cache
@@ -153,6 +159,13 @@ public:
   RefCountedSampler FindSampler( vk::Sampler sampler );
 
   /**
+   * Finds the Fence object using the specified Vulkan handle
+   * @param fence The Vulkan handle of the Fence object to be found
+   * @return A Handle to the Sampler object if found. An empty Handle otherwise
+   */
+  RefCountedFence FindFence( vk::Fence fence );
+
+  /**
    * Removes the specified Buffer from the cache
    * @param buffer The Buffer to be removed
    * @return A reference to the ResourceCache
@@ -208,6 +221,13 @@ public:
    */
   ResourceCache& RemoveSampler( Sampler& sampler );
 
+  /**
+   * Removes the specified Fence from the cache
+   * @param fence The Fence to be removed
+   * @return A reference to the ResourceCache
+   */
+  ResourceCache& RemoveFence( Fence& fence );
+
   void CollectGarbage();
 
   void EnqueueDiscardOperation( std::function<void()> deleter );
@@ -233,6 +253,7 @@ private:
   std::vector< RefCountedDescriptorPool > mDescriptorPools;
   std::vector< RefCountedFramebuffer >    mFramebuffers;
   std::vector< RefCountedSampler >        mSamplers;
+  std::vector< RefCountedFence >          mFences;
 
   std::vector< std::function< void() > >    mDiscardQueue;
 };
index daafadf..0b99df9 100644 (file)
@@ -46,6 +46,86 @@ Sampler::Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo )
 {
 }
 
+vk::SamplerCreateFlags Sampler::GetCreateFlags() const
+{
+  return mCreateInfo.flags;
+}
+
+vk::Filter Sampler::GetMinFilter() const
+{
+  return mCreateInfo.minFilter;
+}
+
+vk::Filter Sampler::GetMagFilter() const
+{
+  return mCreateInfo.magFilter;
+}
+
+vk::SamplerMipmapMode Sampler::GetMipMapMode() const
+{
+  return mCreateInfo.mipmapMode;
+}
+
+vk::SamplerAddressMode Sampler::GetAddressModeU() const
+{
+  return mCreateInfo.addressModeU;
+}
+
+vk::SamplerAddressMode Sampler::GetAddressModeV() const
+{
+  return mCreateInfo.addressModeV;
+}
+
+vk::SamplerAddressMode Sampler::GetAddressModeW() const
+{
+  return mCreateInfo.addressModeW;
+}
+
+float Sampler::GetMipLodBias() const
+{
+  return mCreateInfo.mipLodBias;
+}
+
+vk::Bool32 Sampler::AnisotropyEnabled() const
+{
+  return mCreateInfo.anisotropyEnable;
+}
+
+float Sampler::GetMaxAnisotropy() const
+{
+  return mCreateInfo.maxAnisotropy;
+}
+
+vk::Bool32 Sampler::CompareEnabled() const
+{
+  return mCreateInfo.compareEnable;
+}
+
+vk::CompareOp Sampler::GetCompareOperation() const
+{
+  return mCreateInfo.compareOp;
+}
+
+float Sampler::GetMinLod() const
+{
+  return mCreateInfo.minLod;
+}
+
+float Sampler::GetMaxLod() const
+{
+  return mCreateInfo.maxLod;
+}
+
+vk::BorderColor Sampler::GetBorderColor() const
+{
+  return mCreateInfo.borderColor;
+}
+
+vk::Bool32 Sampler::UsesUnnormalizedCoordinates() const
+{
+  return mCreateInfo.unnormalizedCoordinates;
+}
+
 Sampler::~Sampler() = default;
 
 vk::Sampler Sampler::GetVkHandle() const
index 89f55b7..ef2e8f8 100644 (file)
@@ -41,6 +41,38 @@ public:
    */
   static RefCountedSampler New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo );
 
+  vk::SamplerCreateFlags GetCreateFlags() const;
+
+  vk::Filter GetMinFilter() const;
+
+  vk::Filter GetMagFilter() const;
+
+  vk::SamplerMipmapMode GetMipMapMode() const;
+
+  vk::SamplerAddressMode GetAddressModeU() const;
+
+  vk::SamplerAddressMode GetAddressModeV() const;
+
+  vk::SamplerAddressMode GetAddressModeW() const;
+
+  float GetMipLodBias() const;
+
+  vk::Bool32 AnisotropyEnabled() const;
+
+  float GetMaxAnisotropy() const;
+
+  vk::Bool32 CompareEnabled() const;
+
+  vk::CompareOp GetCompareOperation() const;
+
+  float GetMinLod() const;
+
+  float GetMaxLod() const;
+
+  vk::BorderColor GetBorderColor() const;
+
+  vk::Bool32 UsesUnnormalizedCoordinates() const;
+
   /**
    * Returns VkSampler object
    * @return
index 4a88b82..e967d48 100644 (file)
@@ -96,8 +96,6 @@ private:
   std::unique_ptr<Impl> mImpl;
 };
 
-using RefCountedShader = Handle<Shader>;
-
 } // Namespace Vulkan
 
 } // Namespace Graphics