DeferredBarrierFactory.h 2.2 KB

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