Refactored the Vulkan::Sampler class
authorAngelos Gkountis <a.gkountis@samsung.com>
Thu, 31 May 2018 09:56:10 +0000 (10:56 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 11 Jun 2018 16:54:05 +0000 (16:54 +0000)
> Removed the PIMPL pattern
> Sampler can now only be immutable
> Samplers should be unique and be created at initialization
> Sampler creation logic moved to the Vulkan::Graphics class
> Added the method AddSampler to the Vulkan::Graphics class
> Sampler lifetime is now managed by the Vulkan::Graphics class

Change-Id: Ifa4a9364e3dc2cf483e694648e4b03f35b689398

dali/graphics/vulkan/vulkan-graphics-texture.cpp
dali/graphics/vulkan/vulkan-graphics.cpp
dali/graphics/vulkan/vulkan-graphics.h
dali/graphics/vulkan/vulkan-image-view.h
dali/graphics/vulkan/vulkan-sampler.cpp
dali/graphics/vulkan/vulkan-sampler.h

index 800eb01..c2935c9 100644 (file)
@@ -193,17 +193,17 @@ struct Texture::Impl
 
   void CreateSampler()
   {
-    // mutable sampler creation will be deferred until it's used
-    mSampler = Sampler::New( mGraphics );
-    mSampler->SetAddressMode( vk::SamplerAddressMode::eClampToEdge,
-                              vk::SamplerAddressMode::eClampToEdge,
-                              vk::SamplerAddressMode::eClampToEdge );
-    mSampler->SetBorderColor( vk::BorderColor::eFloatOpaqueBlack );
-    mSampler->SetCompareOp( vk::CompareOp::eNever );
-    mSampler->SetFilter( vk::Filter::eLinear, vk::Filter::eLinear );
-    mSampler->SetMipmapMode( vk::SamplerMipmapMode::eLinear );
-
-    mSampler->GetVkHandle();
+    auto samplerCreateInfo = vk::SamplerCreateInfo()
+            .setAddressModeU( vk::SamplerAddressMode::eClampToEdge )
+            .setAddressModeV( vk::SamplerAddressMode::eClampToEdge )
+            .setAddressModeW( vk::SamplerAddressMode::eClampToEdge )
+            .setBorderColor( vk::BorderColor::eFloatOpaqueBlack )
+            .setCompareOp( vk::CompareOp::eNever )
+            .setMinFilter( vk::Filter::eLinear )
+            .setMagFilter( vk::Filter::eLinear )
+            .setMipmapMode( vk::SamplerMipmapMode::eLinear );
+
+    mSampler = mGraphics.CreateSampler( samplerCreateInfo );
   }
 
   RefCountedSampler GetSampler() const
index 0154a2f..1bbf006 100644 (file)
@@ -398,9 +398,16 @@ RefCountedDescriptorSet Graphics::CreateDescriptorSet()
   NotImplemented()
 }
 
-RefCountedSampler Graphics::CreateSampler()
+RefCountedSampler Graphics::CreateSampler( const vk::SamplerCreateInfo& samplerCreateInfo )
 {
-  NotImplemented()
+  auto refCountedSampler = Sampler::New( *this, samplerCreateInfo );
+
+  VkAssert( mDevice.createSampler( &samplerCreateInfo, mAllocator.get(), refCountedSampler->Ref() ) );
+
+  AddSampler( refCountedSampler );
+
+  return refCountedSampler;
+
 }
 // --------------------------------------------------------------------------------------------------------------
 
@@ -620,6 +627,12 @@ void Graphics::AddFramebuffer( Handle< Framebuffer > framebuffer )
   mResourceCache->AddFramebuffer( std::move( framebuffer ));
 }
 
+void Graphics::AddSampler( RefCountedSampler sampler )
+{
+  std::lock_guard< std::mutex > lock{ mMutex };
+  mResourceCache->AddSampler( std::move( sampler ) );
+}
+
 RefCountedShader Graphics::FindShader( vk::ShaderModule shaderModule )
 {
   std::lock_guard< std::mutex > lock{ mMutex };
index 68db9c7..54c7995 100644 (file)
@@ -134,7 +134,7 @@ public: // Create methods
 
   RefCountedDescriptorSet CreateDescriptorSet();
 
-  RefCountedSampler CreateSampler();
+  RefCountedSampler CreateSampler( const vk::SamplerCreateInfo& samplerCreateInfo );
 
 public: // Actions
   vk::Result WaitForFence( RefCountedFence fence, uint32_t timeout = 0 );
@@ -198,6 +198,8 @@ public: //Cache management methods
 
   void AddFramebuffer( RefCountedFramebuffer framebuffer );
 
+  void AddSampler( RefCountedSampler sampler );
+
   RefCountedShader FindShader( vk::ShaderModule shaderModule );
 
   RefCountedImage FindImage( vk::Image image );
index c7aba76..1c45715 100644 (file)
@@ -83,7 +83,6 @@ public:
   operator vk::ImageView*();
 
   bool OnDestroy() override;
-//TODO: Use the graphics class to manage lifetime.
 
 private:
   ImageView( Graphics& graphics,
index 1b1dff7..daafadf 100644 (file)
@@ -26,58 +26,6 @@ namespace Graphics
 namespace Vulkan
 {
 
-struct Sampler::Impl
-{
-  Impl( Sampler& owner, Graphics& graphics, vk::SamplerCreateInfo info, bool immutable )
-  : mOwner( owner ), mGraphics( graphics ), mCreateInfo( info ), mImmutable( immutable ), mModified( true )
-  {
-
-  }
-
-  ~Impl()
-  {
-    DestroySafe();
-  }
-
-  bool CreateSampler()
-  {
-    if( !mModified )
-    {
-      return true;
-    }
-
-    if( mVkSampler )
-    {
-      DestroySafe();
-    }
-    mVkSampler = VkAssert( mGraphics.GetDevice().createSampler( mCreateInfo, mGraphics.GetAllocator()));
-
-    // push to the resource list in graphics
-
-    mModified = false;
-
-    return true;
-  }
-
-  void DestroySafe()
-  {
-    // fixme: push sampler to the destroy queue, will be destroyed with the end of the frame
-    mGraphics.GetDevice().destroySampler( mVkSampler );
-  }
-
-  Impl( const Impl& ) = delete;
-  Impl& operator=( const Impl& ) = delete;
-
-  Sampler&              mOwner;
-  Graphics&             mGraphics;
-  vk::SamplerCreateInfo mCreateInfo;
-  vk::Sampler           mVkSampler;
-  bool                  mImmutable;
-  bool                  mModified;
-};
-
-
-
 /**
  * Sampler
  */
@@ -87,118 +35,48 @@ struct Sampler::Impl
  * @param graphics
  * @return
  */
-RefCountedSampler Sampler::New( Graphics& graphics )
+RefCountedSampler Sampler::New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo )
 {
-  return RefCountedSampler(new Sampler(graphics, vk::SamplerCreateInfo{}, false));
+  return RefCountedSampler( new Sampler( graphics, createInfo ) );
 }
 
-/**
- * Creates new immutable sampler
- * @param graphics
- * @param createInfo
- * @return
- */
-RefCountedSampler Sampler::NewImmutable( Graphics& graphics, vk::SamplerCreateInfo createInfo )
+Sampler::Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo )
+        : mGraphics(&graphics),
+          mCreateInfo(createInfo)
 {
-  auto retval = RefCountedSampler(new Sampler(graphics, createInfo, true));
-  if( retval->mImpl->CreateSampler() )
-  {
-    return retval;
-  }
-  return RefCountedSampler();
-}
-
-Sampler::Sampler( Graphics& graphics, vk::SamplerCreateInfo createInfo, bool immutable )
-{
-  mImpl.reset(new Impl( *this, graphics, createInfo, immutable ));
 }
 
 Sampler::~Sampler() = default;
 
-/**
- * Sets minification and magnifcation filters
- * @param minFilter
- * @param magFilter
- */
-void Sampler::SetFilter( vk::Filter minFilter, vk::Filter magFilter )
-{
-  mImpl->mCreateInfo.setMinFilter( minFilter );
-  mImpl->mCreateInfo.setMagFilter( magFilter );
-  mImpl->mModified = true;
-}
-
-/**
- * Sets UVW address mode
- * @param addressModeU
- * @param addressModeV
- * @param addressModeW
- */
-void Sampler::SetAddressMode( vk::SamplerAddressMode addressModeU,
-                     vk::SamplerAddressMode addressModeV,
-                     vk::SamplerAddressMode addressModeW )
-{
-  mImpl->mCreateInfo.setAddressModeU( addressModeU );
-  mImpl->mCreateInfo.setAddressModeV( addressModeV );
-  mImpl->mCreateInfo.setAddressModeW( addressModeW );
-  mImpl->mModified = true;
-}
-
-void Sampler::SetLod( float minLod, float maxLod )
-{
-  mImpl->mCreateInfo.setMinLod( minLod ).setMaxLod( maxLod );
-  mImpl->mModified = true;
-}
-
-void Sampler::EnableAnisotropy( bool enabled )
-{
-  mImpl->mCreateInfo.setAnisotropyEnable( enabled );
-  mImpl->mModified = true;
-}
-
-void Sampler::SetMipmapMode( vk::SamplerMipmapMode mode )
+vk::Sampler Sampler::GetVkHandle() const
 {
-  mImpl->mCreateInfo.setMipmapMode( mode );
-  mImpl->mModified = true;
+  return mSampler;
 }
 
-void Sampler::SetMaxAnisotropy( float maxAnisotropy )
+const Sampler& Sampler::ConstRef()
 {
-  mImpl->mCreateInfo.setMaxAnisotropy( maxAnisotropy );
-  mImpl->mModified = true;
+  return *this;
 }
 
-void Sampler::EnableCompare( bool enabled )
+Sampler& Sampler::Ref()
 {
-  mImpl->mCreateInfo.setCompareEnable( enabled );
-  mImpl->mModified = true;
+  return *this;
 }
 
-void Sampler::SetBorderColor( vk::BorderColor color )
+Sampler::operator vk::Sampler*()
 {
-  mImpl->mCreateInfo.setBorderColor( color );
-  mImpl->mModified = true;
+  return &mSampler;
 }
 
-void Sampler::UseUnnormalizedCoordinates( bool enabled )
+bool Sampler::OnDestroy()
 {
-  mImpl->mCreateInfo.setUnnormalizedCoordinates( enabled );
-  mImpl->mModified = true;
-}
+  mGraphics->RemoveSampler( *this );
 
-void Sampler::SetCompareOp( vk::CompareOp compareOp )
-{
-  mImpl->mCreateInfo.setCompareOp( compareOp );
-  mImpl->mModified = true;
-}
+  mGraphics->DiscardResource( [this]() {
+    mGraphics->GetDevice().destroySampler( mSampler, mGraphics->GetAllocator() );
+  } );
 
-vk::Sampler Sampler::GetVkHandle() const
-{
-  // if no sampler yet, create it now
-  if( mImpl->mModified )
-  {
-    mImpl->CreateSampler();
-  }
-  return mImpl->mVkSampler;
+  return false;
 }
 
 } // namespace Vulkan
index cb614e5..89f55b7 100644 (file)
@@ -27,108 +27,47 @@ namespace Graphics
 {
 namespace Vulkan
 {
+
 class Graphics;
+
 class Sampler : public VkManaged
 {
 public:
 
   /**
-   * Creates new mutable sampler
+   * Creates a new Sampler
    * @param graphics
    * @return
    */
-  static RefCountedSampler New( Graphics& graphics );
+  static RefCountedSampler New( Graphics& graphics, const vk::SamplerCreateInfo& createInfo );
 
   /**
-   * Creates new immutable sampler
-   * @param graphics
-   * @param createInfo
+   * Returns VkSampler object
    * @return
    */
-  static RefCountedSampler NewImmutable( Graphics& graphics, vk::SamplerCreateInfo createInfo );
-
-  /**
-   * Sets minification and magnifcation filters
-   * @param minFilter
-   * @param magFilter
-   */
-  void SetFilter( vk::Filter minFilter, vk::Filter magFilter );
-
-  /**
-   * Sets UVW address mode
-   * @param addressModeU
-   * @param addressModeV
-   * @param addressModeW
-   */
-  void SetAddressMode( vk::SamplerAddressMode addressModeU,
-                       vk::SamplerAddressMode addressModeV,
-                       vk::SamplerAddressMode addressModeW );
-
-  /**
-   * Sets minimum and maximum LOD
-   * @param minLod
-   * @param maxLod
-   */
-  void SetLod( float minLod, float maxLod );
-
-  /**
-   * Enables anisotropy
-   * @param enabled
-   */
-  void EnableAnisotropy( bool enabled );
-
-  /**
-   * Sets mipmap mode
-   * @param mode
-   */
-  void SetMipmapMode( vk::SamplerMipmapMode mode );
-
-  /**
-   * Sets maximum anisotropy
-   * @param maxAnisotropy
-   */
-  void SetMaxAnisotropy( float maxAnisotropy );
+  vk::Sampler GetVkHandle() const;
 
-  /**
-   * Turns on/off comparison with reference value when sampling
-   * @param enabled
-   */
-  void EnableCompare( bool enabled );
+  const Sampler& ConstRef();
 
-  /**
-   * Specifies predefined border color to use
-   * @param color
-   */
-  void SetBorderColor( vk::BorderColor color );
+  Sampler& Ref();
 
-  /**
-   * Enables/disables use of unnormalized texture coordinates
-   * @param enabled
-   */
-  void UseUnnormalizedCoordinates( bool enabled );
+  operator vk::Sampler*();
 
-  /**
-   * Specifies comparison function used when comparing with reference value
-   * @param compareOp
-   */
-  void SetCompareOp( vk::CompareOp compareOp );
-
-  /**
-   * Returns VkSampler object
-   * @return
-   */
-  vk::Sampler GetVkHandle() const;
+  bool OnDestroy() override;
 
 private:
 
-  explicit Sampler( Graphics& graphics, vk::SamplerCreateInfo createInfo, bool immutable );
+  explicit Sampler( Graphics& graphics, const vk::SamplerCreateInfo& createInfo );
 
   ~Sampler() override;
 
-  struct Impl;
-  std::unique_ptr<Impl> mImpl;
+private:
+  Graphics*             mGraphics;
+  vk::SamplerCreateInfo mCreateInfo;
+  vk::Sampler           mSampler;
 
 };
+
 } // namespace Vulkan
 } // namespace Graphics
 } // namespace Dali