Rehti MMORPG  1.0.0
Rehti MMORPG is a free and open source MMORPG game.
DescriptorBuilder.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <vulkan/vulkan.h>
3 
4 #include <memory>
5 #include <unordered_map>
6 #include <vector>
7 
8 // Chunk size for descriptor pool allocations
9 constexpr VkDeviceSize POOL_CHUNK_SIZE = 256;
10 
11 // Standard pool sizes for descriptor types
12 const std::vector<VkDescriptorPoolSize> STANDARD_POOL_SIZES({{VK_DESCRIPTOR_TYPE_SAMPLER, 1000},
13  {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000},
14  {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000},
15  {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000},
16  {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000},
17  {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000},
18  {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000},
19  {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000},
20  {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000},
21  {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000},
22  {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000}});
23 
28 {
29 public:
30  PoolManager(VkDevice device);
31  ~PoolManager();
32 
36  void resetPools();
37 
44  bool allocateDescriptorSet(VkDescriptorSetLayout layout, VkDescriptorSet& descSet);
45 
54  VkDescriptorPool createPool(VkDevice device, VkDescriptorPoolCreateFlags flags, uint32_t maxSets,
55  const std::vector<VkDescriptorPoolSize>& poolSizes);
56 
61  VkDevice getDevice() const
62  {
63  return logDeviceM;
64  }
65 
66 private:
72  VkDescriptorPool grabPool();
73 
74  VkDevice logDeviceM;
75  VkDescriptorPool currentPoolM;
76  std::vector<VkDescriptorPool> freePoolsM;
77  std::vector<VkDescriptorPool> usedPoolsM;
78 };
79 
84 {
85 public:
86  DescriptorSetLayoutCache(VkDevice device);
88 
94  VkDescriptorSetLayout createDescriptorSetLayout(VkDescriptorSetLayoutCreateInfo& layoutInfo);
95 
102  VkDescriptorSetLayout createDescriptorSetLayout(const VkDescriptorSetLayoutBinding* bindings,
103  uint32_t bindingCount);
104 
106  {
107  std::vector<VkDescriptorSetLayoutBinding> bindings;
108  bool operator==(const DescriptorSetLayoutInfo& other) const;
109  size_t hash() const;
110  };
111 
112 private:
114  {
115  size_t operator()(const DescriptorSetLayoutInfo& info) const
116  {
117  return info.hash();
118  }
119  };
120 
121  VkDevice logDeviceM;
122  std::unordered_map<DescriptorSetLayoutInfo, VkDescriptorSetLayout, DescriptorLayoutHasher> layoutCacheM;
123 };
124 
129 {
130 public:
133 
141  DescriptorBuilder& bindBuffer(VkDescriptorBufferInfo& bufferInfo, VkDescriptorType type,
142  VkShaderStageFlags stageFlags);
143 
152  DescriptorBuilder& bindBuffers(const VkDescriptorBufferInfo* bufferInfos, VkDescriptorType type, VkShaderStageFlags stageFlags, uint32_t count);
153 
161  DescriptorBuilder& bindImage(VkDescriptorImageInfo& imageInfo, VkDescriptorType type,
162  VkShaderStageFlags stageFlags);
163 
172  DescriptorBuilder& bindImages(const VkDescriptorImageInfo* imageInfos, VkDescriptorType type,
173  VkShaderStageFlags stageFlags, uint32_t count);
174 
182  bool build(VkDescriptorSet& set, VkDescriptorSetLayout& layout);
183 
189  bool build(VkDescriptorSet& set);
190 
196  void setDescriptorSetLayout(const VkDescriptorSetLayoutBinding* bindings, uint32_t bindingCount,
197  VkDescriptorSetLayout& layout);
198 
199  const PoolManager& getPoolManager() const;
200 
201 private:
202  uint32_t currentBindingM;
203  std::vector<VkWriteDescriptorSet> writeSetsM;
204  std::vector<VkDescriptorSetLayoutBinding> layoutBindingsM;
205 
206  std::unique_ptr<PoolManager> pPoolManagerM;
207  std::unique_ptr<DescriptorSetLayoutCache> pLayoutCacheM;
208 };
constexpr VkDeviceSize POOL_CHUNK_SIZE
Definition: DescriptorBuilder.hpp:9
const std::vector< VkDescriptorPoolSize > STANDARD_POOL_SIZES({{VK_DESCRIPTOR_TYPE_SAMPLER, 1000}, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000}, {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000}, {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000}, {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000}, {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000}, {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000}, {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000}, {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000}, {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000}, {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000}})
DescriptorBuilder uses PoolManager and DescriptorLayoutCache to manage and create descriptor sets.
Definition: DescriptorBuilder.hpp:129
std::vector< VkWriteDescriptorSet > writeSetsM
Definition: DescriptorBuilder.hpp:203
DescriptorBuilder(PoolManager &poolManager, DescriptorSetLayoutCache &cache)
Definition: DescriptorBuilder.cpp:219
DescriptorBuilder & bindImage(VkDescriptorImageInfo &imageInfo, VkDescriptorType type, VkShaderStageFlags stageFlags)
Creates a descriptor set layout binding and a write descriptor set for an image.
Definition: DescriptorBuilder.cpp:280
~DescriptorBuilder()
Definition: DescriptorBuilder.cpp:226
std::unique_ptr< PoolManager > pPoolManagerM
Definition: DescriptorBuilder.hpp:206
DescriptorBuilder & bindBuffers(const VkDescriptorBufferInfo *bufferInfos, VkDescriptorType type, VkShaderStageFlags stageFlags, uint32_t count)
Creates a descriptor set layout binding and a write descriptor set for multiple buffers.
Definition: DescriptorBuilder.cpp:255
const PoolManager & getPoolManager() const
Definition: DescriptorBuilder.cpp:373
std::vector< VkDescriptorSetLayoutBinding > layoutBindingsM
Definition: DescriptorBuilder.hpp:204
void setDescriptorSetLayout(const VkDescriptorSetLayoutBinding *bindings, uint32_t bindingCount, VkDescriptorSetLayout &layout)
Sets a layout to the supplied parameter from the given bindings.
Definition: DescriptorBuilder.cpp:368
DescriptorBuilder & bindImages(const VkDescriptorImageInfo *imageInfos, VkDescriptorType type, VkShaderStageFlags stageFlags, uint32_t count)
Binds multiple images to the descriptor set as an array.
Definition: DescriptorBuilder.cpp:306
DescriptorBuilder & bindBuffer(VkDescriptorBufferInfo &bufferInfo, VkDescriptorType type, VkShaderStageFlags stageFlags)
Creates a descriptor set layout binding and a write descriptor set for a buffer.
Definition: DescriptorBuilder.cpp:230
std::unique_ptr< DescriptorSetLayoutCache > pLayoutCacheM
Definition: DescriptorBuilder.hpp:207
uint32_t currentBindingM
Definition: DescriptorBuilder.hpp:202
bool build(VkDescriptorSet &set, VkDescriptorSetLayout &layout)
Builds a descriptor set and sets a created layout to the supplied parameter. Also updates the descrip...
Definition: DescriptorBuilder.cpp:332
The use of this class is to cache descriptor set layouts.
Definition: DescriptorBuilder.hpp:84
std::unordered_map< DescriptorSetLayoutInfo, VkDescriptorSetLayout, DescriptorLayoutHasher > layoutCacheM
Definition: DescriptorBuilder.hpp:122
VkDescriptorSetLayout createDescriptorSetLayout(VkDescriptorSetLayoutCreateInfo &layoutInfo)
Creates a descriptor set layout from the given info, or returns one from the cache if it already exis...
Definition: DescriptorBuilder.cpp:131
DescriptorSetLayoutCache(VkDevice device)
Definition: DescriptorBuilder.cpp:118
~DescriptorSetLayoutCache()
Definition: DescriptorBuilder.cpp:123
VkDevice logDeviceM
Definition: DescriptorBuilder.hpp:121
This class manages descriptor pools, and allows for the allocation of descriptor sets.
Definition: DescriptorBuilder.hpp:28
PoolManager(VkDevice device)
Definition: DescriptorBuilder.cpp:7
VkDescriptorPool grabPool()
Returns a pool from free pools or creates a new one. Does not push the returned pool to used pools.
Definition: DescriptorBuilder.cpp:102
~PoolManager()
Definition: DescriptorBuilder.cpp:12
VkDevice logDeviceM
Definition: DescriptorBuilder.hpp:74
VkDevice getDevice() const
Returns the logical device used by this manager.
Definition: DescriptorBuilder.hpp:61
std::vector< VkDescriptorPool > freePoolsM
Definition: DescriptorBuilder.hpp:76
void resetPools()
Resets pools
Definition: DescriptorBuilder.cpp:25
VkDescriptorPool currentPoolM
Definition: DescriptorBuilder.hpp:75
bool allocateDescriptorSet(VkDescriptorSetLayout layout, VkDescriptorSet &descSet)
Allocates a descriptor set from the pool
Definition: DescriptorBuilder.cpp:37
VkDescriptorPool createPool(VkDevice device, VkDescriptorPoolCreateFlags flags, uint32_t maxSets, const std::vector< VkDescriptorPoolSize > &poolSizes)
Allocates a descriptor pool and adds it to the free pools.
Definition: DescriptorBuilder.cpp:83
std::vector< VkDescriptorPool > usedPoolsM
Definition: DescriptorBuilder.hpp:77
Definition: DescriptorBuilder.hpp:114
size_t operator()(const DescriptorSetLayoutInfo &info) const
Definition: DescriptorBuilder.hpp:115
Definition: DescriptorBuilder.hpp:106
size_t hash() const
Definition: DescriptorBuilder.cpp:206
std::vector< VkDescriptorSetLayoutBinding > bindings
Definition: DescriptorBuilder.hpp:107
bool operator==(const DescriptorSetLayoutInfo &other) const
Definition: DescriptorBuilder.cpp:183