Added custom deleter for graphics types 31/253231/5
authorAdam Bialogonski <adam.b@samsung.com>
Mon, 8 Feb 2021 15:48:40 +0000 (15:48 +0000)
committerDavid Steele <david.steele@samsung.com>
Tue, 9 Feb 2021 13:37:31 +0000 (13:37 +0000)
Change-Id: Ic4718808048f874f489e91b73661c430e43f7c20

automated-tests/src/dali/dali-test-suite-utils/test-graphics-controller.h
dali/graphics-api/graphics-controller.h
dali/graphics-api/graphics-types.h

index 120f984..194698b 100644 (file)
@@ -159,7 +159,7 @@ public:
    * @param[in] bufferCreateInfo The valid BufferCreateInfo structure
    * @return pointer to the Buffer object
    */
-  std::unique_ptr<Graphics::Buffer> CreateBuffer(const Graphics::BufferCreateInfo& bufferCreateInfo, std::unique_ptr<Graphics::Buffer>&& oldBuffer) override
+  Graphics::UniquePtr<Graphics::Buffer> CreateBuffer(const Graphics::BufferCreateInfo& bufferCreateInfo, Graphics::UniquePtr<Graphics::Buffer>&& oldBuffer) override
   {
     return {};
   }
@@ -170,7 +170,7 @@ public:
    * @param[in] bufferCreateInfo The valid BufferCreateInfo structure
    * @return pointer to the CommandBuffer object
    */
-  std::unique_ptr<Graphics::CommandBuffer> CreateCommandBuffer(const Graphics::CommandBufferCreateInfo& commandBufferCreateInfo, std::unique_ptr<Graphics::CommandBuffer>&& oldCommandBuffer) override
+  Graphics::UniquePtr<Graphics::CommandBuffer> CreateCommandBuffer(const Graphics::CommandBufferCreateInfo& commandBufferCreateInfo, Graphics::UniquePtr<Graphics::CommandBuffer>&& oldCommandBuffer) override
   {
     return {};
   }
@@ -181,7 +181,7 @@ public:
    * @param[in] renderPassCreateInfo The valid RenderPassCreateInfo structure
    * @return pointer to the RenderPass object
    */
-  std::unique_ptr<Graphics::RenderPass> CreateRenderPass(const Graphics::RenderPassCreateInfo& renderPassCreateInfo, std::unique_ptr<Graphics::RenderPass>&& oldRenderPass) override
+  Graphics::UniquePtr<Graphics::RenderPass> CreateRenderPass(const Graphics::RenderPassCreateInfo& renderPassCreateInfo, Graphics::UniquePtr<Graphics::RenderPass>&& oldRenderPass) override
   {
     return {};
   }
@@ -192,7 +192,7 @@ public:
    * @param[in] textureCreateInfo The valid TextureCreateInfo structure
    * @return pointer to the TextureCreateInfo object
    */
-  std::unique_ptr<Graphics::Texture> CreateTexture(const Graphics::TextureCreateInfo& textureCreateInfo, std::unique_ptr<Graphics::Texture>&& oldTexture) override
+  Graphics::UniquePtr<Graphics::Texture> CreateTexture(const Graphics::TextureCreateInfo& textureCreateInfo, Graphics::UniquePtr<Graphics::Texture>&& oldTexture) override
   {
     return {};
   }
@@ -203,7 +203,7 @@ public:
    * @param[in] framebufferCreateInfo The valid FramebufferCreateInfo structure
    * @return pointer to the Framebuffer object
    */
-  std::unique_ptr<Graphics::Framebuffer> CreateFramebuffer(const Graphics::FramebufferCreateInfo& framebufferCreateInfo, std::unique_ptr<Graphics::Framebuffer>&& oldFramebuffer) override
+  Graphics::UniquePtr<Graphics::Framebuffer> CreateFramebuffer(const Graphics::FramebufferCreateInfo& framebufferCreateInfo, Graphics::UniquePtr<Graphics::Framebuffer>&& oldFramebuffer) override
   {
     return {};
   }
@@ -214,7 +214,7 @@ public:
    * @param[in] pipelineCreateInfo The valid PipelineCreateInfo structure
    * @return pointer to the Pipeline object
    */
-  std::unique_ptr<Graphics::Pipeline> CreatePipeline(const Graphics::PipelineCreateInfo& pipelineCreateInfo, std::unique_ptr<Graphics::Pipeline>&& oldPipeline) override
+  Graphics::UniquePtr<Graphics::Pipeline> CreatePipeline(const Graphics::PipelineCreateInfo& pipelineCreateInfo, Graphics::UniquePtr<Graphics::Pipeline>&& oldPipeline) override
   {
     return {};
   }
@@ -225,7 +225,7 @@ public:
    * @param[in] shaderCreateInfo The valid ShaderCreateInfo structure
    * @return pointer to the Shader object
    */
-  std::unique_ptr<Graphics::Shader> CreateShader(const Graphics::ShaderCreateInfo& shaderCreateInfo, std::unique_ptr<Graphics::Shader>&& oldShader) override
+  Graphics::UniquePtr<Graphics::Shader> CreateShader(const Graphics::ShaderCreateInfo& shaderCreateInfo, Graphics::UniquePtr<Graphics::Shader>&& oldShader) override
   {
     return {};
   }
@@ -236,7 +236,7 @@ public:
    * @param[in] samplerCreateInfo The valid SamplerCreateInfo structure
    * @return pointer to the Sampler object
    */
-  std::unique_ptr<Graphics::Sampler> CreateSampler(const Graphics::SamplerCreateInfo& samplerCreateInfo, std::unique_ptr<Graphics::Sampler>&& oldSampler) override
+  Graphics::UniquePtr<Graphics::Sampler> CreateSampler(const Graphics::SamplerCreateInfo& samplerCreateInfo, Graphics::UniquePtr<Graphics::Sampler>&& oldSampler) override
   {
     return {};
   }
@@ -247,7 +247,7 @@ public:
    * @param[in] renderTargetCreateInfo The valid RenderTargetCreateInfo structure
    * @return pointer to the RenderTarget object
    */
-  std::unique_ptr<Graphics::RenderTarget> CreateRenderTarget(const Graphics::RenderTargetCreateInfo& renderTargetCreateInfo, std::unique_ptr<Graphics::RenderTarget>&& oldRenderTarget) override
+  Graphics::UniquePtr<Graphics::RenderTarget> CreateRenderTarget(const Graphics::RenderTargetCreateInfo& renderTargetCreateInfo, Graphics::UniquePtr<Graphics::RenderTarget>&& oldRenderTarget) override
   {
     return {};
   }
@@ -259,7 +259,7 @@ public:
    *
    * @return Returns pointer to Memory object or Graphicsnullptr on error
    */
-  std::unique_ptr<Graphics::Memory> MapBufferRange(const Graphics::MapBufferInfo& mapInfo) override
+  Graphics::UniquePtr<Graphics::Memory> MapBufferRange(const Graphics::MapBufferInfo& mapInfo) override
   {
     return {};
   }
@@ -278,7 +278,7 @@ public:
    *
    * @return Valid Memory object or nullptr on error
    */
-  std::unique_ptr<Graphics::Memory> MapTextureRange(const Graphics::MapTextureInfo& mapInfo) override
+  Graphics::UniquePtr<Graphics::Memory> MapTextureRange(const Graphics::MapTextureInfo& mapInfo) override
   {
     return {};
   }
@@ -291,7 +291,7 @@ public:
    *
    * @param[in] memory Valid and previously mapped Memory object
    */
-  void UnmapMemory(std::unique_ptr<Graphics::Memory> memory) override
+  void UnmapMemory(Graphics::UniquePtr<Graphics::Memory> memory) override
   {
   }
 
index 95abdc7..3f758f0 100644 (file)
@@ -173,7 +173,7 @@ public:
    * @param[in] oldBuffer The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the Buffer object
    */
-  virtual std::unique_ptr<Buffer> CreateBuffer(const BufferCreateInfo& bufferCreateInfo, std::unique_ptr<Buffer>&& oldBuffer) = 0;
+  virtual UniquePtr<Buffer> CreateBuffer(const BufferCreateInfo& bufferCreateInfo, UniquePtr<Buffer>&& oldBuffer) = 0;
 
   /**
    * @brief Creates new CommandBuffer object
@@ -182,7 +182,7 @@ public:
    * @param[in] oldCommandBuffer The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the CommandBuffer object
    */
-  virtual std::unique_ptr<CommandBuffer> CreateCommandBuffer(const CommandBufferCreateInfo& commandBufferCreateInfo, std::unique_ptr<CommandBuffer>&& oldCommandBuffer) = 0;
+  virtual UniquePtr<CommandBuffer> CreateCommandBuffer(const CommandBufferCreateInfo& commandBufferCreateInfo, UniquePtr<CommandBuffer>&& oldCommandBuffer) = 0;
 
   /**
    * @brief Creates new RenderPass object
@@ -191,7 +191,7 @@ public:
    * @param[in] oldRenderPass The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the RenderPass object
    */
-  virtual std::unique_ptr<RenderPass> CreateRenderPass(const RenderPassCreateInfo& renderPassCreateInfo, std::unique_ptr<RenderPass>&& oldRenderPass) = 0;
+  virtual UniquePtr<RenderPass> CreateRenderPass(const RenderPassCreateInfo& renderPassCreateInfo, UniquePtr<RenderPass>&& oldRenderPass) = 0;
 
   /**
    * @brief Creates new Texture object
@@ -200,7 +200,7 @@ public:
    * @param[in] oldTexture The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the TextureCreateInfo object
    */
-  virtual std::unique_ptr<Texture> CreateTexture(const TextureCreateInfo& textureCreateInfo, std::unique_ptr<Texture>&& oldTexture) = 0;
+  virtual UniquePtr<Texture> CreateTexture(const TextureCreateInfo& textureCreateInfo, UniquePtr<Texture>&& oldTexture) = 0;
 
   /**
    * @brief Creates new Framebuffer object
@@ -209,7 +209,7 @@ public:
    * @param[in] oldFramebuffer The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the Framebuffer object
    */
-  virtual std::unique_ptr<Framebuffer> CreateFramebuffer(const FramebufferCreateInfo& framebufferCreateInfo, std::unique_ptr<Framebuffer>&& oldFramebuffer) = 0;
+  virtual UniquePtr<Framebuffer> CreateFramebuffer(const FramebufferCreateInfo& framebufferCreateInfo, UniquePtr<Framebuffer>&& oldFramebuffer) = 0;
 
   /**
    * @brief Creates new Pipeline object
@@ -218,8 +218,7 @@ public:
    * @param[in] oldPipeline The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the Pipeline object
    */
-  virtual std::unique_ptr<Pipeline> CreatePipeline(const PipelineCreateInfo& pipelineCreateInfo, std::unique_ptr<Pipeline>&& oldPipeline) = 0;
-
+  virtual UniquePtr<Pipeline> CreatePipeline(const PipelineCreateInfo& pipelineCreateInfo, UniquePtr<Pipeline>&& oldPipeline) = 0;
   /**
    * @brief Creates new Shader object
    *
@@ -227,7 +226,7 @@ public:
    * @param[in] oldShader The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the Shader object
    */
-  virtual std::unique_ptr<Shader> CreateShader(const ShaderCreateInfo& shaderCreateInfo, std::unique_ptr<Shader>&& oldShader) = 0;
+  virtual UniquePtr<Shader> CreateShader(const ShaderCreateInfo& shaderCreateInfo, UniquePtr<Shader>&& oldShader) = 0;
 
   /**
    * @brief Creates new Sampler object
@@ -236,7 +235,7 @@ public:
    * @param[in] oldSampler The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the Sampler object
    */
-  virtual std::unique_ptr<Sampler> CreateSampler(const SamplerCreateInfo& samplerCreateInfo, std::unique_ptr<Sampler>&& oldSampler) = 0;
+  virtual UniquePtr<Sampler> CreateSampler(const SamplerCreateInfo& samplerCreateInfo, UniquePtr<Sampler>&& oldSampler) = 0;
 
   /**
    * @brief Creates new RenderTarget object
@@ -245,7 +244,7 @@ public:
    * @param[in] oldRenderTarget The valid pointer to the old object or nullptr. The object will be reused or destroyed.
    * @return pointer to the RenderTarget object
    */
-  virtual std::unique_ptr<RenderTarget> CreateRenderTarget(const RenderTargetCreateInfo& renderTargetCreateInfo, std::unique_ptr<RenderTarget>&& oldRenderTarget) = 0;
+  virtual UniquePtr<RenderTarget> CreateRenderTarget(const RenderTargetCreateInfo& renderTargetCreateInfo, UniquePtr<RenderTarget>&& oldRenderTarget) = 0;
 
   /**
    * @brief Maps memory associated with Buffer object
@@ -253,7 +252,7 @@ public:
    * @param[in] mapInfo Filled details of mapped resource
    * @return Returns pointer to Memory object or nullptr on error
    */
-  virtual std::unique_ptr<Memory> MapBufferRange(const MapBufferInfo& mapInfo) = 0;
+  virtual UniquePtr<Memory> MapBufferRange(const MapBufferInfo& mapInfo) = 0;
 
   /**
    * @brief Maps memory associated with the texture.
@@ -269,7 +268,7 @@ public:
    *
    * @return Valid Memory object or nullptr on error
    */
-  virtual std::unique_ptr<Memory> MapTextureRange(const MapTextureInfo& mapInfo) = 0;
+  virtual UniquePtr<Memory> MapTextureRange(const MapTextureInfo& mapInfo) = 0;
 
   /**
    * @brief Unmaps memory and discards Memory object
@@ -279,7 +278,7 @@ public:
    *
    * @param[in] memory Valid and previously mapped Memory object
    */
-  virtual void UnmapMemory(std::unique_ptr<Memory> memory) = 0;
+  virtual void UnmapMemory(UniquePtr<Memory> memory) = 0;
 
   /**
    * @brief Returns memory requirements of the Texture object.
index a1bcccb..133283d 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // EXTERNAL INCLUDES
+#include <memory>
 #include <string>
 #include <utility>
 #include <vector>
@@ -1245,6 +1246,82 @@ struct ExtensionCreateInfo
   ExtensionCreateInfo*  nextExtension{};
 };
 
+/**
+ * @brief Default deleter for graphics unique pointers
+ *
+ * Returned unique_ptr may require custom deleter. To get it working
+ * with std::unique_ptr the custom type is used with polymorphic deleter
+ */
+template<class T>
+struct DefaultDeleter
+{
+  DefaultDeleter() = default;
+
+  /**
+   * @brief Conversion constructor
+   *
+   * This constructor will set the lambda for type passed
+   * as an argument.
+   */
+  template<class P, template<typename> typename U>
+  DefaultDeleter(const U<P>& deleter)
+  {
+    deleteFunction = [](T* object) { U<P>()(static_cast<P*>(object)); };
+  }
+
+  /**
+   * @brief Conversion constructor from DefaultDelete<P>
+   *
+   * This constructor transfers deleteFunction only
+   */
+  template<class P>
+  explicit DefaultDeleter(const DefaultDeleter<P>& deleter)
+  {
+    deleteFunction = decltype(deleteFunction)(deleter.deleteFunction);
+  }
+
+  /**
+   * @brief Default deleter
+   *
+   * Default deleter will use standard 'delete' call in order
+   * to discard graphics objects unless a custom deleter was
+   * used.
+   *
+   * @param[in] object Object to delete
+   */
+  void operator()(T* object)
+  {
+    if(deleteFunction)
+    {
+      deleteFunction(object);
+    }
+    else
+    {
+      delete object;
+    }
+  }
+
+  void (*deleteFunction)(T* object){nullptr}; ///< Custom delete function
+};
+
+/**
+ * unique_ptr defined in the Graphics scope
+ */
+template<class T, class D = DefaultDeleter<T>>
+using UniquePtr = std::unique_ptr<T, D>;
+
+/**
+ * @brief MakeUnique<> version that returns Graphics::UniquePtr
+ * @param[in] args Arguments for construction
+ * @return
+ */
+template<class T, class Deleter = DefaultDeleter<T>, class... Args>
+std::enable_if_t<!std::is_array<T>::value, Graphics::UniquePtr<T>>
+MakeUnique(Args&&... args)
+{
+  return UniquePtr<T>(new T(std::forward<Args>(args)...), Deleter());
+}
+
 } // namespace Graphics
 } // namespace Dali