// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #pragma once #include #include namespace anki { // Forward class DeferredBarrierFactory; /// @addtogroup vulkan /// @{ /// Wrapper on top of VkEvent. class MicroDeferredBarrier { friend class DeferredBarrierFactory; friend class MicroDeferredBarrierPtrDeleter; public: MicroDeferredBarrier(DeferredBarrierFactory* factory); ~MicroDeferredBarrier(); const VkEvent& getHandle() const { ANKI_ASSERT(m_handle); return m_handle; } Atomic& getRefcount() { return m_refcount; } GrAllocator getAllocator() const; void setFence(MicroFencePtr& f) { m_fence = f; } MicroFencePtr& getFence() { return m_fence; } private: VkEvent m_handle = VK_NULL_HANDLE; Atomic m_refcount = {0}; DeferredBarrierFactory* m_factory = nullptr; /// Fence to find out when it's safe to reuse this barrier. MicroFencePtr m_fence; }; /// Deleter for MicroDeferredBarrierPtr smart pointer. class MicroDeferredBarrierPtrDeleter { public: void operator()(MicroDeferredBarrier* x); }; /// MicroDeferredBarrier smart pointer. using MicroDeferredBarrierPtr = IntrusivePtr; /// MicroDeferredBarrier factory. class DeferredBarrierFactory : public NonCopyable { friend class MicroDeferredBarrierPtrDeleter; friend class MicroDeferredBarrier; public: void init(GrAllocator alloc, VkDevice dev) { ANKI_ASSERT(dev); m_alloc = alloc; m_dev = dev; } void destroy() { m_recycler.destroy(); } MicroDeferredBarrierPtr newInstance(); private: GrAllocator m_alloc; VkDevice m_dev = VK_NULL_HANDLE; MicroObjectRecycler m_recycler; void destroyBarrier(MicroDeferredBarrier* barrier); }; /// @} } // end namespace anki #include