DeferredBarrierFactory.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Gr/Vulkan/FenceFactory.h>
  7. #include <AnKi/Gr/Vulkan/MicroObjectRecycler.h>
  8. namespace anki {
  9. // Forward
  10. class DeferredBarrierFactory;
  11. /// @addtogroup vulkan
  12. /// @{
  13. /// Wrapper on top of VkEvent.
  14. class MicroDeferredBarrier
  15. {
  16. friend class DeferredBarrierFactory;
  17. friend class MicroDeferredBarrierPtrDeleter;
  18. public:
  19. MicroDeferredBarrier(DeferredBarrierFactory* factory);
  20. ~MicroDeferredBarrier();
  21. const VkEvent& getHandle() const
  22. {
  23. ANKI_ASSERT(m_handle);
  24. return m_handle;
  25. }
  26. Atomic<U32>& getRefcount()
  27. {
  28. return m_refcount;
  29. }
  30. GrAllocator<U8> getAllocator() const;
  31. void setFence(MicroFencePtr& f)
  32. {
  33. m_fence = f;
  34. }
  35. MicroFencePtr& getFence()
  36. {
  37. return m_fence;
  38. }
  39. private:
  40. VkEvent m_handle = VK_NULL_HANDLE;
  41. Atomic<U32> m_refcount = {0};
  42. DeferredBarrierFactory* m_factory = nullptr;
  43. /// Fence to find out when it's safe to reuse this barrier.
  44. MicroFencePtr m_fence;
  45. };
  46. /// Deleter for MicroDeferredBarrierPtr smart pointer.
  47. class MicroDeferredBarrierPtrDeleter
  48. {
  49. public:
  50. void operator()(MicroDeferredBarrier* x);
  51. };
  52. /// MicroDeferredBarrier smart pointer.
  53. using MicroDeferredBarrierPtr = IntrusivePtr<MicroDeferredBarrier, MicroDeferredBarrierPtrDeleter>;
  54. /// MicroDeferredBarrier factory.
  55. class DeferredBarrierFactory
  56. {
  57. friend class MicroDeferredBarrierPtrDeleter;
  58. friend class MicroDeferredBarrier;
  59. public:
  60. DeferredBarrierFactory() = default;
  61. DeferredBarrierFactory(const DeferredBarrierFactory&) = delete; // Non-copyable
  62. DeferredBarrierFactory& operator=(const DeferredBarrierFactory&) = delete; // Non-copyable
  63. void init(GrAllocator<U8> alloc, VkDevice dev)
  64. {
  65. ANKI_ASSERT(dev);
  66. m_alloc = alloc;
  67. m_dev = dev;
  68. }
  69. void destroy()
  70. {
  71. m_recycler.destroy();
  72. }
  73. MicroDeferredBarrierPtr newInstance();
  74. private:
  75. GrAllocator<U8> m_alloc;
  76. VkDevice m_dev = VK_NULL_HANDLE;
  77. MicroObjectRecycler<MicroDeferredBarrier> m_recycler;
  78. void destroyBarrier(MicroDeferredBarrier* barrier);
  79. };
  80. /// @}
  81. } // end namespace anki
  82. #include <AnKi/Gr/Vulkan/DeferredBarrierFactory.inl.h>