SwapchainFactory.h 2.1 KB

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