Lugdunum  0.1.0
DescriptorSetPool.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <map>
4 
11 
12 namespace lug {
13 namespace Graphics {
14 namespace Vulkan {
15 
16 class Renderer;
17 
18 namespace Render {
19 namespace DescriptorSetPool {
20 
21 // TODO: Use another method than a global (same for reference counting)
22 extern API::DescriptorPool descriptorPool;
23 extern uint32_t poolCount;
24 
25 template <size_t maxSets>
26 class LUG_GRAPHICS_API DescriptorSetPool {
27 public:
28  DescriptorSetPool(Renderer& renderer);
29 
30  DescriptorSetPool(const DescriptorSetPool&) = delete;
31  DescriptorSetPool(DescriptorSetPool&&) = delete;
32 
33  DescriptorSetPool& operator=(const DescriptorSetPool&) = delete;
34  DescriptorSetPool& operator=(DescriptorSetPool&&) = delete;
35 
36  ~DescriptorSetPool();
37 
38  bool init();
39 
40  std::tuple<bool, const DescriptorSet*> allocate(size_t hash, const API::DescriptorSetLayout& descriptorSetLayout);
41  void free(const DescriptorSet* descriptorSet);
42 
43 private:
44  DescriptorSet* allocateNewDescriptorSet(const API::DescriptorSetLayout& descriptorSetLayout);
45 
46 protected:
48 
49  size_t _descriptorSetsCount{0};
50  std::array<DescriptorSet, maxSets> _descriptorSets;
51 
52  size_t _freeDescriptorSetsCount{0};
53  std::array<DescriptorSet*, maxSets> _freeDescriptorSets;
54 
55  std::map<size_t, DescriptorSet*> _descriptorSetsInUse;
56 };
57 
59 
60 } // DescriptorSetPool
61 } // Render
62 } // Vulkan
63 } // Graphics
64 } // lug
#define LUG_GRAPHICS_API
Definition: Export.hpp:11