SwapchainFactory.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. #include <AnKi/Util/Ptr.h>
  9. namespace anki {
  10. // Forward
  11. class SwapchainFactory;
  12. /// @addtogroup vulkan
  13. /// @{
  14. /// A wrapper for the swapchain.
  15. class MicroSwapchain
  16. {
  17. friend class MicroSwapchainPtrDeleter;
  18. friend class SwapchainFactory;
  19. public:
  20. VkSwapchainKHR m_swapchain = {};
  21. DynamicArray<TexturePtr> m_textures;
  22. MicroSwapchain(SwapchainFactory* factory);
  23. ~MicroSwapchain();
  24. Atomic<U32>& getRefcount()
  25. {
  26. return m_refcount;
  27. }
  28. GrAllocator<U8> getAllocator() const;
  29. void setFence(MicroFencePtr fence)
  30. {
  31. m_fence = fence;
  32. }
  33. MicroFencePtr& getFence()
  34. {
  35. return m_fence;
  36. }
  37. VkRenderPass getRenderPass(VkAttachmentLoadOp loadOp) const
  38. {
  39. const U idx = (loadOp == VK_ATTACHMENT_LOAD_OP_DONT_CARE) ? RPASS_LOAD_DONT_CARE : RPASS_LOAD_CLEAR;
  40. return m_rpasses[idx];
  41. }
  42. private:
  43. Atomic<U32> m_refcount = {0};
  44. SwapchainFactory* m_factory = nullptr;
  45. enum
  46. {
  47. RPASS_LOAD_CLEAR,
  48. RPASS_LOAD_DONT_CARE,
  49. RPASS_COUNT
  50. };
  51. Array<VkRenderPass, RPASS_COUNT> m_rpasses = {};
  52. MicroFencePtr m_fence;
  53. ANKI_USE_RESULT Error initInternal();
  54. };
  55. /// Deleter for MicroSwapchainPtr smart pointer.
  56. class MicroSwapchainPtrDeleter
  57. {
  58. public:
  59. void operator()(MicroSwapchain* x);
  60. };
  61. /// MicroSwapchain smart pointer.
  62. using MicroSwapchainPtr = IntrusivePtr<MicroSwapchain, MicroSwapchainPtrDeleter>;
  63. /// Swapchain factory.
  64. class SwapchainFactory
  65. {
  66. friend class MicroSwapchainPtrDeleter;
  67. friend class MicroSwapchain;
  68. public:
  69. void init(GrManagerImpl* manager, Bool vsync);
  70. void destroy()
  71. {
  72. m_recycler.destroy();
  73. }
  74. MicroSwapchainPtr newInstance();
  75. private:
  76. GrManagerImpl* m_gr = nullptr;
  77. Bool m_vsync = false;
  78. MicroObjectRecycler<MicroSwapchain> m_recycler;
  79. };
  80. /// @}
  81. inline void MicroSwapchainPtrDeleter::operator()(MicroSwapchain* s)
  82. {
  83. ANKI_ASSERT(s);
  84. s->m_factory->m_recycler.recycle(s);
  85. }
  86. } // end namespace anki