vengine  0.1.0
3D graphics engine made with Vulkan
Loading...
Searching...
No Matches
Descriptors.hpp
Go to the documentation of this file.
1///
2/// @file Descriptors.hpp
3/// @brief This file contains the Descriptors class
4/// @namespace ven
5///
6
7#pragma once
8
9#include <memory>
10#include <unordered_map>
11
12#include "VEngine/Device.hpp"
13
14namespace ven {
15
16///
17 /// @class DescriptorSetLayout
18 /// @brief Class for descriptor set layout
19 /// @namespace ven
20 ///
22
23 public:
24
25 class Builder {
26
27 public:
28
29 explicit Builder(Device &device) : m_device{device} {}
30
31 Builder &addBinding(uint32_t binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags, uint32_t count = 1);
32 std::unique_ptr<DescriptorSetLayout> build() const { return std::make_unique<DescriptorSetLayout>(m_device, m_bindings); }
33
34 private:
36 std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding> m_bindings;
37 };
38
39 DescriptorSetLayout(Device &device, const std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding>& bindings);
40 ~DescriptorSetLayout() { vkDestroyDescriptorSetLayout(m_device.device(), m_descriptorSetLayout, nullptr); }
43
44 VkDescriptorSetLayout getDescriptorSetLayout() const { return m_descriptorSetLayout; }
45
46 private:
47
49 VkDescriptorSetLayout m_descriptorSetLayout;
50 std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding> m_bindings;
51
52 friend class DescriptorWriter;
53
54 }; // class DescriptorSetLayout
55
56 ///
57 /// @class DescriptorPool
58 /// @brief Class for descriptor pool
59 /// @namespace ven
60 ///
62
63 public:
64
65 class Builder {
66
67 public:
68
69 explicit Builder(Device &device) : m_device{device} {}
70
71 Builder &addPoolSize(VkDescriptorType descriptorType, uint32_t count);
72 Builder &setPoolFlags(VkDescriptorPoolCreateFlags flags);
73 Builder &setMaxSets(uint32_t count);
74 [[nodiscard]] std::unique_ptr<DescriptorPool> build() const { return std::make_unique<DescriptorPool>(m_device, m_maxSets, m_poolFlags, m_poolSizes); }
75
76 private:
77
79 std::vector<VkDescriptorPoolSize> m_poolSizes;
80 uint32_t m_maxSets = 1000;
81 VkDescriptorPoolCreateFlags m_poolFlags = 0;
82 };
83
84 DescriptorPool(Device &device, uint32_t maxSets, VkDescriptorPoolCreateFlags poolFlags, const std::vector<VkDescriptorPoolSize> &poolSizes);
85 ~DescriptorPool() { vkDestroyDescriptorPool(m_device.device(), m_descriptorPool, nullptr); }
86 DescriptorPool(const DescriptorPool &) = delete;
88
89 bool allocateDescriptor(VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSet &descriptor) const;
90
91 void freeDescriptors(const std::vector<VkDescriptorSet> &descriptors) const { vkFreeDescriptorSets(m_device.device(), m_descriptorPool, static_cast<uint32_t>(descriptors.size()), descriptors.data()); }
92
93 void resetPool() const { vkResetDescriptorPool(m_device.device(), m_descriptorPool, 0); }
94
95 private:
96
98 VkDescriptorPool m_descriptorPool;
99
100 friend class DescriptorWriter;
101
102 }; // class DescriptorPool
103
104 ///
105 /// @class DescriptorWriter
106 /// @brief Class for descriptor writer
107 /// @namespace ven
108 ///
110
111 public:
112
113 DescriptorWriter(DescriptorSetLayout &setLayout, DescriptorPool &pool) : m_setLayout{setLayout}, m_pool{pool} {}
114
115 DescriptorWriter &writeBuffer(uint32_t binding, const VkDescriptorBufferInfo *bufferInfo);
116 DescriptorWriter &writeImage(uint32_t binding, const VkDescriptorImageInfo *imageInfo);
117
118 bool build(VkDescriptorSet &set);
119 void overwrite(const VkDescriptorSet &set);
120
121 private:
122
125 std::vector<VkWriteDescriptorSet> m_writes;
126
127 }; // class DescriptorWriter
128
129} // namespace ven
This file contains the Device class.
std::vector< VkDescriptorPoolSize > m_poolSizes
Builder & setPoolFlags(VkDescriptorPoolCreateFlags flags)
std::unique_ptr< DescriptorPool > build() const
Builder & addPoolSize(VkDescriptorType descriptorType, uint32_t count)
Builder & setMaxSets(uint32_t count)
VkDescriptorPoolCreateFlags m_poolFlags
Class for descriptor pool.
void resetPool() const
VkDescriptorPool m_descriptorPool
DescriptorPool(Device &device, uint32_t maxSets, VkDescriptorPoolCreateFlags poolFlags, const std::vector< VkDescriptorPoolSize > &poolSizes)
bool allocateDescriptor(VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSet &descriptor) const
DescriptorPool(const DescriptorPool &)=delete
DescriptorPool & operator=(const DescriptorPool &)=delete
void freeDescriptors(const std::vector< VkDescriptorSet > &descriptors) const
std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > m_bindings
Builder & addBinding(uint32_t binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags, uint32_t count=1)
std::unique_ptr< DescriptorSetLayout > build() const
Class for descriptor set layout.
DescriptorSetLayout(const DescriptorSetLayout &)=delete
std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > m_bindings
DescriptorSetLayout & operator=(const DescriptorSetLayout &)=delete
DescriptorSetLayout(Device &device, const std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > &bindings)
VkDescriptorSetLayout m_descriptorSetLayout
VkDescriptorSetLayout getDescriptorSetLayout() const
Class for descriptor writer.
DescriptorWriter & writeImage(uint32_t binding, const VkDescriptorImageInfo *imageInfo)
DescriptorPool & m_pool
std::vector< VkWriteDescriptorSet > m_writes
DescriptorWriter & writeBuffer(uint32_t binding, const VkDescriptorBufferInfo *bufferInfo)
DescriptorSetLayout & m_setLayout
DescriptorWriter(DescriptorSetLayout &setLayout, DescriptorPool &pool)
void overwrite(const VkDescriptorSet &set)
bool build(VkDescriptorSet &set)
VkDevice device() const
Definition Device.hpp:48