* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
* @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 {};
}
*
* @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 {};
}
*
* @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 {};
}
*
* @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
{
}
* @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
* @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
* @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
* @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
* @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
* @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
*
* @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
* @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
* @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
* @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.
*
* @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
*
* @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.
*/
// EXTERNAL INCLUDES
+#include <memory>
#include <string>
#include <utility>
#include <vector>
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